{"version":3,"sources":["lib/ui/Colors.ts","lib/ui/Progress.tsx","helpers/style.ts","helpers/numerals.ts","helpers/mobile.ts","helpers/editor.ts","helpers/text/arabic.ts","helpers/meta.ts","settings.ts","helpers/url.ts","lib/storage/LargeFileStorage.ts","lib/storage/FileStorage.ts","lib/ui/autocomplete/AutoCompleteService.ts","lib/ui/autocomplete/AutoComplete.tsx","lib/ui/autocomplete/helpers.ts","lib/i18n/i18n.ts","locales/utils.ts","locales/ur-PK/messages.ts","lib/routing/url.ts","lib/routing/Navigator.tsx","lib/form/Button.tsx","lib/dialogs/Confirm.tsx","lib/dialogs/Notification.ts","services/index.ts","helpers/user.ts","helpers/html.ts","helpers/form.ts","helpers/date.ts","helpers/window.ts","helpers/geometry.ts","helpers/facebook.ts","helpers/translate/tokens.ts","helpers/translate/index.ts","lib/ui/Table.tsx","lib/ui/Tabs.tsx","lib/ui/Tip.tsx","lib/chars/ur.ts","lib/form/Pills.tsx","lib/form/Input.tsx","lib/form/Select.tsx","lib/form/TextArea.tsx","lib/form/FileInput.tsx","lib/form/ValidationErrors.tsx","lib/form/Notification.tsx","lib/keyboard/keys.ts","lib/form/Form.tsx","lib/form/Switch.tsx","lib/form/SplitButton.tsx","lib/form/ButtonGroup.tsx","lib/request/APIRequest.ts","lib/request/ModelRequest.ts","lib/events/index.ts","lib/devtools/index.ts","lib/selection/index.ts","lib/vocabulary/ur.ts","images/logo.png","components/Loading/Logo.ts","components/Loading/Loading.tsx","components/App/AppRehydrate.tsx","helpers/reducers.ts","reducers/user/actions.ts","reducers/user/index.ts","reducers/status/actions.ts","reducers/status/index.ts","reducers/docs/actions.ts","reducers/docs/index.ts","reducers/doc_users/actions.ts","reducers/doc_users/index.ts","reducers/pages/actions.ts","reducers/pages/index.ts","reducers/settings/actions.ts","reducers/settings/index.ts","reducers/autocomplete/actions.ts","reducers/autocomplete/index.ts","reducers/reader/actions.ts","reducers/reader/index.ts","reducers/search/actions.ts","reducers/search/index.ts","models/index.ts","components/Forms/RegisterForm.tsx","reducers/user/sagas.ts","components/Forms/DocForm.tsx","reducers/docs/sagas.ts","reducers/pages/sagas.ts","reducers/doc_users/sagas.ts","store.ts","pages/Template/Logo/index.tsx","pages/Template/TopMenu.tsx","pages/Template/Search.tsx","images/search.png","pages/Template/Header.tsx","components/App/AppUser.ts","helpers/status.ts","components/App/routes.tsx","pages/Template/LogoutLink.tsx","pages/Template/index.tsx","components/Forms/LoginForm.tsx","components/Forms/ResetPasswordForm.tsx","components/Forms/EditProfileForm.tsx","components/Forms/DocMetaForm.tsx","components/Forms/PageForm.tsx","components/Forms/DocUserForm.tsx","components/Input/EditableText.tsx","components/Notifications/FormNotification.tsx","components/Editor/Toolbar/tools/shortcuts.ts","components/Editor/helpers.tsx","components/Editor/Contents/styles.ts","components/Editor/Contents/index.tsx","lib/dom/visibility.ts","components/Editor/Contents/helpers.ts","components/Editor/Toolbar/tools/commands.ts","components/Editor/Toolbar/helpers.tsx","components/Editor/Toolbar/tools/Icon.tsx","components/Editor/Toolbar/tools/images/align-center-b.png","components/Editor/Toolbar/tools/images/align-center-w.png","components/Editor/Toolbar/tools/UploadProgress.tsx","components/Editor/Toolbar/tools/images/photo-b.png","components/Editor/Toolbar/tools/Image.tsx","components/Editor/Toolbar/tools/images/ltr-b.png","components/Editor/Toolbar/tools/TextField.tsx","components/Editor/Toolbar/tools/ErrorMessage.tsx","components/Editor/Toolbar/tools/index.ts","components/Editor/Toolbar/tools/Bold.tsx","components/Editor/Toolbar/tools/images/bold-b.png","components/Editor/Toolbar/tools/images/bold-w.png","components/Editor/Toolbar/tools/Italic.tsx","components/Editor/Toolbar/tools/images/italic-b.png","components/Editor/Toolbar/tools/images/italic-w.png","components/Editor/Toolbar/tools/Underline.tsx","components/Editor/Toolbar/tools/images/underline-b.png","components/Editor/Toolbar/tools/images/underline-w.png","components/Editor/Toolbar/tools/TextSize.tsx","components/Editor/Toolbar/tools/images/size-b.png","components/Editor/Toolbar/tools/images/size-w.png","components/Editor/Toolbar/tools/One.tsx","components/Editor/Toolbar/tools/images/1-b.png","components/Editor/Toolbar/tools/images/1-w.png","components/Editor/Toolbar/tools/Two.tsx","components/Editor/Toolbar/tools/images/2-b.png","components/Editor/Toolbar/tools/images/2-w.png","components/Editor/Toolbar/tools/Three.tsx","components/Editor/Toolbar/tools/images/3-b.png","components/Editor/Toolbar/tools/images/3-w.png","components/Editor/Toolbar/tools/Four.tsx","components/Editor/Toolbar/tools/images/4-b.png","components/Editor/Toolbar/tools/images/4-w.png","components/Editor/Toolbar/tools/Five.tsx","components/Editor/Toolbar/tools/images/5-b.png","components/Editor/Toolbar/tools/images/5-w.png","components/Editor/Toolbar/tools/Six.tsx","components/Editor/Toolbar/tools/images/6-b.png","components/Editor/Toolbar/tools/images/6-w.png","components/Editor/Toolbar/tools/AlignRight.tsx","components/Editor/Toolbar/tools/images/align-right-b.png","components/Editor/Toolbar/tools/images/align-right-w.png","components/Editor/Toolbar/tools/AlignCenter.tsx","components/Editor/Toolbar/tools/AlignLeft.tsx","components/Editor/Toolbar/tools/images/align-left-b.png","components/Editor/Toolbar/tools/images/align-left-w.png","components/Editor/Toolbar/tools/AlignJustifyFull.tsx","components/Editor/Toolbar/tools/ListOrdered.tsx","components/Editor/Toolbar/tools/images/ordered-list-b.png","components/Editor/Toolbar/tools/images/ordered-list-w.png","components/Editor/Toolbar/tools/ListUnOrdered.tsx","components/Editor/Toolbar/tools/images/unordered-list-b.png","components/Editor/Toolbar/tools/images/unordered-list-w.png","components/Editor/Toolbar/tools/IncreaseIndent.tsx","components/Editor/Toolbar/tools/images/indent-increase-b.png","components/Editor/Toolbar/tools/images/indent-increase-w.png","components/Editor/Toolbar/tools/DecreaseIndent.tsx","components/Editor/Toolbar/tools/images/indent-decrease-b.png","components/Editor/Toolbar/tools/images/indent-decrease-w.png","components/Editor/Toolbar/tools/Quote.tsx","components/Editor/Toolbar/tools/images/quote-b.png","components/Editor/Toolbar/tools/images/quote-w.png","components/Editor/Toolbar/tools/SourceCode.tsx","components/Editor/Toolbar/tools/images/code-b.png","components/Editor/Toolbar/tools/images/code-w.png","components/Editor/Toolbar/tools/images/photo-w.png","components/Editor/Toolbar/tools/Video.tsx","components/Editor/Toolbar/tools/images/video-b.png","components/Editor/Toolbar/tools/images/video-w.png","components/Editor/Toolbar/tools/Link.tsx","lib/text/link.ts","components/Editor/Toolbar/tools/images/link-b.png","components/Editor/Toolbar/tools/images/link-w.png","components/Editor/Toolbar/tools/Tick.tsx","components/Editor/Toolbar/tools/images/tick-b.png","components/Editor/Toolbar/tools/images/tick-w.png","components/Editor/Toolbar/tools/RemoveTextFormat.tsx","components/Editor/Toolbar/tools/images/clear-format-b.png","components/Editor/Toolbar/tools/images/clear-format-w.png","components/Editor/Toolbar/tools/RTL.tsx","components/Editor/Toolbar/tools/images/rtl-b.png","components/Editor/Toolbar/tools/images/rtl-w.png","components/Editor/Toolbar/tools/LTR.tsx","components/Editor/Toolbar/tools/images/ltr-w.png","components/Editor/Toolbar/tools/More.tsx","components/Editor/Toolbar/tools/images/more-b.png","components/Editor/Toolbar/tools/images/more-w.png","components/Editor/Toolbar/tools/Back.tsx","components/Editor/Toolbar/tools/images/back-b.png","components/Editor/Toolbar/tools/images/back-w.png","components/Editor/Toolbar/index.tsx","components/Editor/Name.tsx","components/Editor/Menu/List.tsx","components/Editor/Menu/PagesList.tsx","components/Editor/Menu/Icon.tsx","components/Editor/Menu/PagesIcon.tsx","components/Editor/Menu/images/menu-white.png","components/Editor/Menu/images/menu-black.png","components/Editor/Menu/SettingsList.tsx","components/Editor/Menu/SettingsIcon.tsx","components/Editor/Menu/images/settings-white.png","components/Editor/Menu/images/settings-black.png","components/Editor/Menu/BackIcon.tsx","components/Editor/Menu/images/back-white.png","components/Editor/Menu/images/back-black.png","components/Editor/Menu/index.tsx","components/Editor/Comments/Icon.tsx","components/Editor/Comments/index.tsx","components/Editor/Communicator/index.tsx","components/Editor/Controls/Resize/TextField.tsx","components/Editor/Controls/Resize/styles.tsx","components/Editor/Controls/Resize/LockIcon.tsx","components/Editor/Controls/Resize/UnLockIcon.tsx","components/Editor/Controls/Resize/ResetIcon.tsx","components/Editor/Controls/Resize/index.tsx","components/Book/index.tsx","components/Editor/Logo.tsx","components/Tags.tsx","components/Results/not-found.png","components/Results/NoResults.tsx","components/Results/index.tsx","pages/FeaturedPage/prev.png","pages/FeaturedPage/Slider.tsx","pages/FeaturedPage/next.png","pages/FeaturedPage/index.tsx","pages/SearchPage/index.tsx","pages/Copyrights.tsx","pages/Terms.tsx","pages/LoginPage/index.tsx","pages/LogoutPage.tsx","pages/EditProfilePage.tsx","pages/EditorPage/index.tsx","components/Merge/Header.tsx","components/Merge/Mode.tsx","components/Merge/helpers.ts","components/Merge/SplitView.tsx","components/Merge/MergedView.tsx","components/Merge/Compare.tsx","pages/CreateMergePage/index.tsx","pages/MergeRequestsPage/Header.tsx","pages/MergeRequestsPage/Requests.tsx","pages/MergeRequestsPage/index.tsx","pages/MergeResolvePage/Header.tsx","pages/MergeResolvePage/Actions.tsx","pages/MergeResolvePage/RequestHeader.tsx","pages/MergeResolvePage/index.tsx","pages/TranslatePage/helpers/en.tsx","pages/TranslatePage/styles.tsx","pages/TranslatePage/LTRView.tsx","pages/TranslatePage/helpers/index.tsx","pages/TranslatePage/Header.tsx","pages/TranslatePage/RTLView.tsx","pages/TranslatePage/SplitView.tsx","lib/text/clipboard.ts","pages/TranslatePage/index.tsx","components/Reader/BgColor.tsx","components/Reader/Tools/Back.tsx","images/reader/tools/back-white.png","images/reader/tools/back-black.png","helpers/pdf.ts","components/Reader/Tools/Download.tsx","images/reader/tools/download-white.png","images/reader/tools/download-black.png","components/Reader/Tools/FontSize.tsx","images/reader/tools/font-size-white.png","images/reader/tools/font-size-black.png","components/Reader/Tools/Theme.tsx","images/reader/tools/brightness-high-white.png","images/reader/tools/brightness-high-black.png","images/reader/tools/brightness-medium-white.png","images/reader/tools/brightness-medium-black.png","images/reader/tools/brightness-low-white.png","images/reader/tools/brightness-low-black.png","components/Reader/Tools/Share.tsx","images/reader/tools/share-white.png","images/reader/tools/share-black.png","components/Reader/Tools/index.tsx","components/Reader/Toolbar/index.tsx","images/reader/prev-white.png","images/reader/prev-black.png","images/reader/next-white.png","images/reader/next-black.png","components/Reader/PageContents/styles.ts","components/Reader/TableOfContents/Header.tsx","components/Reader/TableOfContents/styles.tsx","helpers/toc.ts","components/Reader/TableOfContents/index.tsx","images/reader/menu-white.png","images/reader/menu-black.png","components/Reader/PageContents/images/share-with-friends.png","components/Reader/PageContents/social.tsx","lib/dom/scroll.ts","components/Reader/PageContents/AmountRead.tsx","components/Reader/PageContents/helpers.ts","components/Reader/PageContents/images/become-an-author.png","components/Reader/PageContents/Invite.tsx","components/Reader/PageContents/index.tsx","lib/dom/window.ts","components/Reader/Preview/index.tsx","pages/ReaderPage/index.tsx","pages/PDFDownload/index.tsx","pages/TagPage/index.tsx","pages/BookPage/TableOfContents.tsx","pages/BookPage/styles.ts","pages/BookPage/OnBoarding/styles/onboarding.tsx","pages/BookPage/OnBoarding/onboarding-share-with-friends-whatsapp.png","pages/BookPage/OnBoarding/ShareOnWhatsApp.tsx","pages/BookPage/OnBoarding/Timer.tsx","pages/BookPage/OnBoarding/Share.tsx","pages/BookPage/OnBoarding/CreateBook.tsx","pages/BookPage/OnBoarding/icons-to-remember.png","pages/BookPage/OnBoarding/Start.tsx","pages/BookPage/OnBoarding/index.tsx","pages/BookPage/index.tsx","images/book/download.png","pages/DocsPage/CreateDocLink.tsx","pages/DocsPage/SearchDocs.tsx","pages/DocsPage/Actions.tsx","pages/DocsPage/List.tsx","pages/DocsPage/index.tsx","pages/DocFormPage.tsx","pages/DocMetaPage.tsx","pages/PagesPage/CreatePageLink.tsx","pages/PagesPage/Actions.tsx","pages/PagesPage/List.tsx","pages/PagesPage/index.tsx","pages/PageFormPage.tsx","pages/DocUsersPage/AddUserLink.tsx","pages/DocUsersPage/Actions.tsx","pages/DocUsersPage/List.tsx","pages/DocUsersPage/index.tsx","pages/DocUsersFormPage.tsx","admin/AdminPage.tsx","admin/FeaturedAdminPage/Weight.tsx","admin/FeaturedAdminPage/FeaturedMark.tsx","images/star.png","admin/FeaturedAdminPage/index.tsx","components/App/index.tsx","components/App/tracking.ts","reportWebVitals.ts","index.tsx"],"names":["TYPE_PRIMARY","TYPE_SECONDARY","TYPE_SUCCESS","TYPE_FAILURE","TYPE_INFO","TYPE_WHATSAPP_SHARE","TYPE_WARNING","CLR_GREY","COLORS","color","borderColor","backgroundColor","hoverColor","hoverBackgroundColor","Container","styled","section","p","margin","spin","keyframes","CircularLoader","div","border","width","height","Progress","device","arabicNumerals","invert","toArabicInteger","num","split","map","digit","d","parseInt","join","toArabicNumerals","includes","arr","a","b","isMobile","window","innerWidth","contentHash","content","MD5","ARABIC_WORDS","fixArabicFont","contents","i","length","w","text","from","to","replace","RegExp","fixArabicText","__html","getMetaValue","meta","name","result","find","m","v","value","location","hostname","SITE_URL","API_URL","API_BASE_URL","UD_EDITOR","UD_AUTHOR","UD_REVIEWER","PAGE_EDITOR","urlFormat","title","pageUrl","doc","page","includeSiteUrl","url","id","pageShareUrl","docUrl","encodeURIComponent","tagUrl","tag","LARGE_STORE_FILE_SIZE_LIMIT","LARGE_FILE_MARKER","LargeFileStorage","instance","this","localforage","createInstance","storeName","STORE_NAME","version","VERSION","driver","INDEXEDDB","WEBSQL","LOCALSTORAGE","req","indexedDB","deleteDatabase","onsuccess","console","log","onerror","onblocked","clear","size","Math","ceil","indexOf","splitParts","marker","path","count","pathPrefix","numParts","resolve","extract","_getParts","_path","parts","_getPart","next","counter","push","number","getItem","err","Number","MAX_SAFE_INTEGER","_setParts","_setPart","partContents","_partInContents","setItem","start","substr","_removeParts","_removePart","removeItem","FileStorage","_large","destroy","Promise","_reject","then","isLarge","get","normalPath","set","remove","keys","AUTOCOMPLETE_SHOW","AUTOCOMPLETE_HIDE","AUTOCOMPLETE_NEXT","AUTOCOMPLETE_PREV","AUTOCOMPLETE_SELECT","AUTOCOMPLETE_REPLACE_VALUE","AutoCompleteService","word","list","OrderedSet","hidden","words","sort","eventEmitter","emit","isVisible","filter","startsWith","show","slice","hide","left","top","enableDarkTheme","Item","selected","AutoComplete","state","onShow","setState","onHide","onPrev","onNext","onSelect","sendValue","toJS","autoComplete","replaceValue","on","off","props","sel","getSelection","rangeCount","range","getRangeAt","collapsed","rect","getClientRects","getPosition","onClick","React","Component","Intl","Collator","DEFAULT_LOCALE","translations","flattenMessages","prefix","messages","Object","entries","key","k","assign","loading","site","description","contact","facebook","topMenu","help","homepage","copyrights","terms","book","read","shareOnFacebook","shareWithFriends","featured","weight","tagTitle","header","loginRegister","account","writeBook","docs","results","loadMore","none","tagsNone","heading","access","public","private","created","saved","failed","passwordProtected","new","preview","edit","editDoc","save","cancel","confirmRemove","confirmRemoveAll","search","pageForm","titleCreate","titleEdit","onlyPageCannotDelete","status","parent_id","statusDRAFT","statusPUBLISHED","pageStatusInvalid","submitBtnCreate","submitBtnEdit","alternateBtnCreate","alternateBtnEdit","confirm","yes","no","user","add","userDocForm","added","alreadyAMember","email","statusEDITOR","statusAUTHOR","statusREVIEWER","statusREADER","tools","format","insert","design","layout","collaboration","lang","eng","urd","toc","margins","orientation","colors","newPage","editor","editorMenu","pages","users","toggleTheme","translate","export","addPage","rsb","width_inch","height_inch","rsbSizes","letter","tabloid","legal","statement","executive","a3","a4","a5","b4","b5","footer","foreground","background","menu","login","logout","vision","use","tab","loginForm","registerForm","resetPasswordForm","password","submitBtn","onBoarding","startEditor","confirmPassword","success","failure","editProfileForm","alternateBtn","createDocForm","editDocForm","docForm","lastUpdated","visibility","visibilityPUBLIC","visibilityPRIVATE","docStatusInvalid","docVisibilityInvalid","docMetaForm","authors","intro","tags","cover","createPageForm","saveBtn","editPageForm","form","selectEmptyLabel","nameRequired","nameMinChars","authorsMinChars","introMinChars","emailRequired","emailInvalid","passwordRequired","passwordMinChars","confirmPasswordRequired","confirmPasswordSameAsPassword","emailAlreadyRegistered","introRequired","authorsRequired","tagsRequired","tagsCount_1_3","invalidLogin","validLogin","return","date","unmodified","copy","translation","pdf","epub","mobi","market","toolbar","linkPlaceholder","uploadingImage","maxImageSizeError","resize","tip","share","theme","download","merge","src","srcAll","dst","confirmRequest","alreadyUpToDate","compareDescription","unified","requestCreated","noChanges","titleRequest","requestDescription","OPEN","PENDING","REJECTED","RESOLVED","src_name","dst_name","page_name","resolveTitle","resolveDescription","confirmMerge","cancelMerge","accepted","rejected","alreadyRejected","alreadyResolved","bothAreEqual","present","future","all","I18n","locale","messageId","getURLParam","URL","href","searchParams","EVT_TO","EVT_REDIRECT","EVT_FORWARD","EVT_BACKWARD","NavigateService","secs","setTimeout","abs","Navigator","history","useHistory","useEffect","back","go","forward","redirect","BTN_SMALL","BTN_MEDIUM","styles","fontSize","fontWeight","borderRadius","padding","spanTop","mobileStyles","lineHeight","type","ButtonGroup","Button","Wrapper","Message","Confirm","onConfirm","onCancel","NOTIFICATION_SET","NOTIFICATION_CLEAR","typeMap","s","f","NotificationService","e","response","data","errors","persistStore","EventEmitter2","navigate","notification","i18n","isLoggedIn","isUserAdmin","authRedirect","locationState","pathname","nextPath","redirectAfter","removeClass","target","classList","validateForm","constraints","validate","values","mysqlDateToArabic","moment","utc","setWindowTitle","document","isPointInRect","x","y","right","bottom","u","open","reList","findTokens","re","found","match","LANG_ENG","LANG_URD","table","Heading","th","Head","thead","HeadRow","tr","TBody","tbody","BodyRow","attrs","index","td","paddingRight","isFocused","Table","dragged","onDragStart","evt","dataTransfer","effectAllowed","getTR","onDragOver","preventDefault","addClass","onDragEnter","onDragLeave","onDrop","parent","nodeName","toLowerCase","parentNode","nextSibling","insertBefore","rows","querySelectorAll","positions","position","dataset","onDragEnd","_evt","titles","field","rowNum","colNum","row","indent","transform","focusedRowIndex","_indent","dangerouslySetInnerHTML","toString","node","fields","isSelected","onRowClick","draggable","rowId","undefined","j","col","head","body","Titles","Title","isActive","Tabs","activeTab","children","InnerContainer","Contents","RTL","LTR","Left","hasLTR","LeftTop","LeftBottom","Right","RightTop","RightBottom","Tip","containerRef","onMouseOver","onMouseOut","createRef","ltr","r","current","offsetWidth","offsetHeight","anchor","ref","view","CHARS_URDU","Placeholder","focused","Pill","Pills","onChange","val","update","placeholder","labels","fullWidth","textAlign","ReadOnlyField","PlaceholderRight","PlaceholderLeft","PlaceholderCenter","FocusLineContainer","FocusLine","Input","focus","onBlur","onFocus","c","readOnly","focusOnLoad","placeholderLine","onKeyUp","Value","List","Text","hasIndent","IndentMark","amount","Select","fieldValue","elmList","onMouseDown","clientX","clientY","getBoundingClientRect","toggleOpen","indents","relativeIndex","label","addEventListener","EVT_MOUSEDOWN","removeEventListener","valueLabel","listTop","offsetTop","TextArea","style","scrollHeight","hasPreview","Icon","viewBox","xmlns","fill","PreviewLink","PreviewImg","img","Preview","FileInput","files","file","createObjectURL","click","accept","ul","ErrorWrapper","li","Error","message","ValidationErrors","Notification","onNotificationSet","onNotificationClear","KEY_TAB","KEY_ENTER","KEY_ESC","KEY_LEFT_ARROW","KEY_UP_ARROW","KEY_RIGHT_ARROW","KEY_DOWN_ARROW","KEY_N","KEY_P","FORM_CLEAR","FORM_END_PROCESSING","h2","Description","Form","initialState","additionalState","processing","showFormErrors","setFields","editing","updateProp","nextState","order","onFormEndProcessing","onFormClear","restrictSubmitNodes","t","stopPropagation","submitFn","submitIfEnter","onSubmit","inputTypes","focusOnFirst","buttons","primaryBtnType","onAlternate","appendMsg","formValidation","modifiedState","pick","isEqual","forEach","isUndefined","nextProps","enabled","Switch","SplitButton","ButtonActionGroup","config","withCredentials","APIRequest","axios","post","put","delete","ModelRequest","method","params","endpoint","_upload","EVT_WIN_BEFOREUNLOAD","EVT_WIN_RESIZE","EVT_KEYUP","EVT_KEYDOWN","EVT_CLICK","EVT_MOUSEUP","EVT_MOUSEOVER","EVT_SCROLL","EVT_DBLCLICK","areDevToolOpen","outerWidth","outerHeight","innerHeight","hasSelection","setSelectionRange","s1","removeAllRanges","s2","addRange","Logo","logo","Loading","APP_REHYDRATE","mapDispatch","rehydrate","payload","AppRehydrate","fetching","loaded","debounce","_save","flush","fetch","fetchSet","JSON","parse","stringify","reader","settings","autocomplete","connect","actionType","stateWrapper","options","OrderedMap","Map","reducerFn","fnMap","action","transformRehydrate","fromJS","USER_SET","USER_CLEAR","USER_CHK_AUTH","USER_CHK_AUTH_STATUS","USER_CREATE","USER_SAVE","USER_LOGOUT","checkAuth","checkAuthStatus","createUser","saveUser","logoutUser","userReducer","STATUS_USER_LOADED","statusReducer","userLoaded","DOC_SET","DOC_CLEAR","DOC_REMOVE","DOC_SET_MULTIPLE","DOC_FETCH","DOC_FETCH_ALL","DOC_SAVE","DOC_CREATE","DOC_DESTROY","fetchDoc","fetchDocs","createDoc","saveDoc","destroyDoc","docsReducer","doc_id","DOC_USER_SET","DOC_USER_CLEAR","DOC_USER_REMOVE","DOC_USER_FETCH","DOC_USER_FETCH_ALL","DOC_USER_SAVE","DOC_USER_CREATE","DOC_USER_DESTROY","fetchDocUser","fetchDocUsers","createDocUser","saveDocUser","destroyDocUser","getId","user_id","docUsersReducer","PAGE_SET","PAGE_SET_MULTIPLE","PAGE_CLEAR","PAGE_REMOVE","PAGE_FETCH","PAGE_FETCH_ALL","PAGE_SAVE","PAGE_SET_POSITION","PAGE_CREATE","PAGE_DESTROY","fetchPage","fetchPages","createPage","savePage","setPagePositions","destroyPage","pagesReducer","page_id","SETTINGS_TOGGLE_EDITOR_THEME","SETTINGS_DOC_LAST_OPENED","SETTINGS_REMOVE_DOC_LAST_OPENED","toggleEditorTheme","setDocLastOpened","removeDocLastOpened","docLastOpened","_a","setIn","removeIn","settingsReducer","opened","AUTOCOMPLETE_SET","AUTOCOMPLETE_REMOVE","AUTOCOMPLETE_PAGE_REMOVE","setAutoComplete","removeAutoComplete","removePageAutoComplete","autoCompleteReducer","filterNot","_v","READER_SET_THEME","READER_SET_FONT_SIZE","setReaderTheme","setReaderFontSize","THEME_HIGH","THEME_MEDIUM","THEME_LOW","THEME_FONT_SIZE_SMALL","THEME_FONT_SIZE_MEDIUM","THEME_FONT_SIZE_LARGE","readerReducer","SEARCH_SET","setSearch","searchReducer","Auth","User","Doc","DocMeta","DocUser","Page","File","PageContents","Books","Featured","Tag","Merge","Translate","DocPDF","Resize","EVT_USER_REGISTER","RegisterForm","presence","minimum","random","gtag","event_category","event_label","onCheckAuthStatus","onCheckAuth","onLogoutUser","onCreateUser","onSaveUser","_action","call","takeLatest","apiError","EVT_DOC_CREATE","DocForm","ownProps","onFetchDocs","onFetchDoc","onCreateDoc","onSaveDoc","onDestroyDoc","takeEvery","res","onFetchPages","onFetchPage","onCreatePage","onSavePage","onDestroyPage","setPositions","onSetPagePositions","onFetchDocUsers","onFetchDocUser","onCreateDocUser","onSaveDocUser","onDestroyDocUser","rootReducers","combineReducers","doc_users","sagaMiddleware","createSagaMiddleware","store","createStore","composeWithDevTools","applyMiddleware","sagas","run","Image","LinkA","Link","A","TopMenu","input","HeaderSearch","trimStart","Main","Actions","ButtonBordered","ActionButton","Spacer","hidePaths","hideMobilePaths","Header","fromFB","hideHeader","Search","secondaryBtn","primaryBtn","AppUser","RedirectTo","AuthRoute","isAuth","C","component","rest","render","AdminRoute","isAdmin","pathRoutes","paths","Route","exact","configureRoutes","requiresAuth","requiresAdmin","LogoutLink","ContentWrapper","isLandingPage","Content","LoginForm","_prevProps","_prevState","_snapshot","ResetPasswordForm","bind","mapDispatchToProps","EditProfileForm","_attrName","_options","_constraints","equality","attribute","DocMetaForm","maximum","doc_meta","item","warn","create","formData","FormData","append","upload","PageForm","fillPages","hasChildren","DocUserForm","loggedInDocUser","statusValues","doc_user","S_NEW_PAGE","S_LINK","S_IMAGE","S_ALIGN_LEFT","S_ALIGN_RIGHT","S_ALIGN_CENTER","S_LTR","S_RTL","S_ARABIC","S_TEXTSIZE_1","S_TEXTSIZE_2","S_TEXTSIZE_3","S_TEXTSIZE_4","S_TEXTSIZE_5","S_TEXTSIZE_6","S_SOURCE_CODE","S_REMOVE_FORMAT","pageOrDocChanged","currentProps","current_doc_id","current_page_id","next_doc_id","next_page_id","getIds","compareHashWithContents","hash","ID_EDITOR_CONTENTS","EVT_EDITOR_CONTENTS_SAVE","visibilityChange","KEYDOWN_AUTOCOMPLETE_KEYS","lastSaveHash","askingAutoComplete","autoCompleteSet","refreshAutoComplete","getAutoCompleteList","request","_refreshAutoComplete","onEitorContentsSave","innerHTML","onWinBeforeUnload","onWinResize","devToolsOpen","onVisibilityChange","onKeyDown","toUpperCase","ctrlKey","prev","AUTOCOMPLETE_CANCEL_KEYS","isAutoCompleteCancelKey","clearAskingAutoComplete","endContainer","endOffset","nodeValue","unshift","getWordForAutoComplete","ask","removeLTR","removeHeadings","codeElm","commonAncestorContainer","parentElement","sourceCode","previousSibling","createElement","replaceChild","removeSourceCode","replaceValueFromAutoComplete","fromWord","toWord","startOffset","focusNode","setStart","setEnd","deleteContents","replaceNode","createTextNode","insertNode","nextOffset","spaceNode","replaceAutoCompleteWord","hideToolbar","valueSeq","spellCheck","contentEditable","markup","pagesFiltered","autoCompleteFiltered","temp","acPageId","has","unique","Set","saveEditorContents","HIDE_TOOLBAR","collapse","clearSelection","hideAndSave","isEnabled","cmd","queryCommandState","isBold","onBold","execCommand","isItalic","onItalic","isUnderline","onUnderline","isAlignRight","onAlignRight","isAlignCenter","onAlignCenter","isAlignLeft","onAlignLeft","onAlignJustifyFull","isListOrdered","onListOrdered","isListUnOrdered","onListUnOrdered","isIndentIncrease","onIndentIncrease","isIndentDecrease","onIndentDecrease","createLink","link","onRemoveTextFormat","onH1","onH2","onH3","onH4","onH5","onH6","onQuote","context","emptyDiv","insertEmptyDivAfter","onSourceCode","elmCode","appendChild","extractContents","onArabicLang","elmSpan","applyLangOnSelection","onRTL","applyDirOnSelection","onLTR","dir","className","ltrElm","el","headingElm","headings","h","sentinel","rects","MIN_VALUE","max","Rotate","Blink","UploadProgress","styleFileInput","display","mimesAccepted","bold","italic","underline","textSize","h1","shortcut","h3","h4","h5","h6","alignRight","alignCenter","alignLeft","alignJustifyFull","ol","increaseIndent","decreaseIndent","quote","image","useState","uploading","setUploading","fileField","savedSelectionRange","useCallback","getCursorRange","addImage","insertImage","onFileInputChange","ff","fileURL","trimEnd","setErrorMsg","multiple","video","linkText","getSelectedText","linkConfirm","linkField","fieldRef","removeFormat","rtl","more","errorMsg","Group","CTX_ALL","CTX_MORE","CTX_LINK","CTX_ERROR","CTX_TEXT_SIZE","Toolbar","elmContents","clearContext","onMouseUp","pos","altKey","shiftKey","code","isShortcut","editorActions","setContext","onDblClick","onTextSize","onMore","onSetErrorMsg","msgId","error","onLink","getSelectionRange","onSetLink","group","canShow","cmdIndent","cmdAlign","contextFn","enabledFn","msg","getElementById","o","Name","innerText","getName","setName","setupEvents","justifyContent","active","primary","MenuItem","PagesList","elmContainer","close","addNewPage","hideMenu","canAdminister","Img","PagesIcon","timeout","elmIcon","clearTimeout","iconElm","SettingsList","elm","SettingsIcon","BackIcon","Menu","onBackClick","svg","Audio","Video","TextField","attachRef","LockIcon","UnLockIcon","ResetIcon","Label","ResizeImage","fieldWidth","round","onKeyUpWidth","locked","percentChange","refreshTarget","onKeyUpHeight","onChangeWidth","nextWidth","isNaN","nextHeight","onChangeHeight","onToggleLock","onReset","removeAttribute","PHONE_WIDTH","Cover","Info","toFixed","Authors","Book","EBook","marginTop","Tags","setTags","tag_id","useParams","param_tag_id","useLocation","NoResults","showMore","enableMore","stats","offset","total","Results","Slide","zIndex","scaleX","scaleY","Nav","Prev","Next","ANIM_DELAY","Slider","intervalId","started","startAnim","setInterval","l","concat","stopAnim","onFetch","clearInterval","FeaturedPage","onSliderFetch","sliderIds","showSlider","filtered","SearchPage","searchQuery","ebooks","prevProps","prevState","snapshot","ebook","ebookUrl","CopyrightsPage","TermsPage","LOGIN_TAB","REGISTER_TAB","RESET_PASSWORD_TAB","TabContainer","getActiveTab","LoginPage","onTabSelect","LogoutPage","EditProfilePage","EditorPage","newProps","_newState","param_doc_id","param_page_id","NoChanges","AlreadyUpToDate","Fields","FieldContainer","FieldTitle","SwitchContainer","onChangeSrc","_name","onCompareClear","onChangeDst","onCompare","toggleAll","allSwitch","src_page_id","dst_page_id","page_contents_id","onReturnClick","user_status","user_name","changes","bothValid","Mode","HIGHLIGHT_ADDED","HIGHLIGHT_REMOVED","highlightChanges","highlight","srcDiv","dstDiv","dd","DiffDOM","diff","apply","route","childNodes","changed","cloneNode","ContentsContainer","Divider","SplitView","srcMarkup","dstMarkup","MergedView","mergedMarkup","info","COMPARE_SPLIT","Compare","modeValues","setMode","mode","isFilledSrcDst","compare","srcHTML","dstHTML","srcContent","dstContent","CreateMergePage","src_page_contents_id","dst_page_contents_id","Requests","requests","created_at","MergeRequestsPage","_","onAccept","onReject","decided","CreatedAt","TimeRef","Present","Future","People","src_user_name","dst_user_name","Date","MergeResolvePage","request_id","operational","enSentences","char","sentence","STOP_CHARS","len","en2ur","reChars","src_text","cache","src_lang","dst_lang","LTRContainer","LTRFragmented","DEFAULT_EN","LTRView","elmFragmented","onInput","blur","EVT_LTR_MOUSEOUT","EVT_LTR_MOUSEOVER","fragment","xPercentage","createRange","setPositionInContentEditable","onPaste","clipboardData","getData","setupPasteEvt","EVT_RTL_MOUSEOVER","setFocusClass","EVT_RTL_MOUSEOUT","EVT_LTR_TRANSLATED","viewFragmented","html","EVT_COPY_TRANSLATION","en","childIndex","n","onReturn","onCopyTranslation","RTLView","editIndex","dst_text","copyStyle","copyElm","fetchTranslations","updateDst","selectNodeContents","copyFromElm","TranslatePage","bgColor","BgColor","Back","isDark","alt","isAvailable","docId","generatePDF","downloadPDF","Download","FontSize","onShortcut","THEMES","Theme","switchTheme","Share","Tools","onPDFProcessing","processingPDF","skip_pdf","darkTheme","downloadBtn","EmptyNav","NavLabel","pageId","prevNav","pageTitle","nextNav","SIZE","fontSizeQuran","THEME","blockQuote","focusColor","focusBgColor","Generic","Poetry","Mark","Indent","PublishedOn","Intro","updated_at","truncateTOC","isTOCIndented","MenuIconContainer","TableOfContents","onToggle","onUpArrow","onDownArrow","getIndex","scrollToActiveTOC","activePageId","scrollIntoView","goToPage","parentId","activeId","findIndentAmount","ShareOnFB","ShareWithFriends","scrollPercentage","documentElement","st","sh","clientHeight","Amount","percentage","PercentageRead","onScroll","transformContents","Invite","elText","sendingScroll","pendingScrollEvt","sendScrollEvt","onImgClick","naturalWidth","scrollToStart","scrollTo","onWhatsAppShare","logShareEvent","getShareUrl","currentPage","isPublic","invite","Overlay","ReaderPage","PDFDownload","tagId","tagName","tag_name","TagPage","limit","isChild","Index","span","Chapters","indented","ImageCol","TOCColumn","Meta","ActionImg","ActionRow","StepContainer","Step","ShareOnWhatsApp","Countdown","Timer","seconds","onTick","onFinish","CreateBook","Start","onInterval","onStart","iconsToRemember","OnBoarding","step","onRegister","onShareNext","onDocCreate","BookPage","onReadBook","onShare","docShareUrl","onDownload","coverImg","actions","CreateDocLink","SearchDocs","onPreviewClick","onEditClick","onEditDocClick","onDeleteClick","confirmDelete","onDocMetaClick","onConfirmDelete","clearSelected","onCancelDelete","selectedOne","splice","toList","getTime","DocsPage","onFilterChange","_k","showFilter","DocFormPage","DocMetaPage","CreatePageLink","getParams","firstPageId","min","lastOpened","PagesPage","PageFormPage","AddUserLink","showEdit","showDelete","tmp","selectedRow","editorCount","numOfEditors","selectedStatus","focusedRowId","du","DocUsersPage","DocUsersFormPage","AdminPage","preventEvent","FeaturedMark","onWeightChange","isFeatured","FeaturedAdminPage","loadingFeatured","fetchFeatured","_nextProps","_nextContext","ReactGA","initialize","pageview","usePageViews","admin","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StrictMode"],"mappings":"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","file":"static/js/main.da2fd4e1.chunk.js","sourcesContent":["export const TYPE_PRIMARY = \"type/BLACK\";\nexport const TYPE_SECONDARY = \"type/WHITE\";\nexport const TYPE_SUCCESS = \"type/SUCCESS\";\nexport const TYPE_FAILURE = \"type/FAILURE\";\nexport const TYPE_INFO = \"type/INFO\";\nexport const TYPE_FB_SHARE = \"type/FACEBOOK\";\nexport const TYPE_WHATSAPP_SHARE = \"type/WHATSAPP\";\nexport const TYPE_WARNING = \"type/WARNING\";\n\nexport const CLR_BLACK = \"#000\";\nexport const CLR_WHITE = \"#fff\";\nexport const CLR_LIGHTGREY = \"#efefef\";\nexport const CLR_GREY = \"#ccc\";\nexport const CLR_PRIMARY = \"#31708f\";\nexport const CLR_SECONDARY = \"#000\";\nexport const CLR_TRANSPARENT = \"transparent\";\n\nexport const COLORS: Record> = {\n [TYPE_SUCCESS]: {\n color: \"#28a745\",\n borderColor: \"#d0e9c6\",\n backgroundColor: \"#dff0d8\",\n },\n [TYPE_FAILURE]: {\n color: \"#a94442\",\n borderColor: \"#ebcccc\",\n backgroundColor: \"#f2dede\",\n hoverColor: \"#fff\",\n hoverBackgroundColor: \"#f00\",\n },\n [TYPE_INFO]: {\n color: \"#fff\",\n borderColor: \"#1976d2\",\n backgroundColor: \"#1976d2\",\n },\n [TYPE_FB_SHARE]: {\n color: \"#fff\",\n borderColor: \"#3b5998\",\n backgroundColor: \"#3b5998\",\n },\n [TYPE_WHATSAPP_SHARE]: {\n color: \"#fff\",\n borderColor: \"#34a962\",\n backgroundColor: \"#34a962\",\n },\n [TYPE_WARNING]: {\n color: \"#fcf8e3\",\n borderColor: \"#faf2cc\",\n backgroundColor: \"#fcf8e3\",\n hoverColor: \"#fcf8e3\",\n hoverBackgroundColor: \"#faf2cc\",\n },\n [TYPE_PRIMARY]: {\n color: \"#fff\",\n borderColor: \"#000\",\n backgroundColor: \"#000\",\n },\n [TYPE_SECONDARY]: {\n color: \"#999\",\n borderColor: \"#f3f3f3\",\n backgroundColor: \"#f3f3f3\",\n hoverColor: \"#fff\",\n hoverBackgroundColor: \"#000\",\n },\n};\n","import styled, { keyframes } from \"styled-components\";\n\ninterface ContainerProps {\n margin: string;\n}\nconst Container = styled.section`\n display: flex;\n justify-content: center;\n margin: ${(p: ContainerProps) => p.margin};\n text-align: center;\n`;\n\nconst spin = keyframes`\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n`;\n\ninterface CircularLoaderProps {\n margin: string;\n border: string;\n width: string;\n height: string;\n}\nexport const CircularLoader = styled.div`\n display: block;\n margin: ${(p: CircularLoaderProps) => p.margin};\n border: ${(p: CircularLoaderProps) => p.border} solid #ccc;\n border-top: ${(p: CircularLoaderProps) => p.border} solid #000;\n border-radius: 50%;\n width: ${(p: CircularLoaderProps) => p.width};\n height: ${(p: CircularLoaderProps) => p.height};\n animation: ${spin} 2s linear infinite;\n`;\n\nexport function Progress({ margin = \"80px auto 0\" }: { margin?: string }) {\n return (\n \n \n \n );\n}\n","export const device = {\n phone: \"(max-width: 600px)\",\n};\n","import invert from \"lodash/invert\";\n\nconst ARABIC_DECIMAL = \"۔\";\nconst arabicNumerals: Record = {\n 0: \"۰\",\n 1: \"۱\",\n 2: \"۲\",\n 3: \"۳\",\n 4: \"۴\",\n 5: \"۵\",\n 6: \"۶\",\n 7: \"۷\",\n 8: \"۸\",\n 9: \"۹\",\n};\nconst romanNumerals = invert(arabicNumerals);\n\nfunction toArabicInteger(num: string) {\n return num\n .split(\"\")\n .map((digit) => {\n const d = parseInt(digit);\n return arabicNumerals[d] ? arabicNumerals[d] : digit;\n })\n .join(\"\");\n}\n\nexport function toArabicNumerals(num: string) {\n if (typeof num === \"undefined\" || num === null) {\n return \"\";\n }\n\n if (num.includes(\".\")) {\n const arr: string[] = num.split(\".\");\n const a = toArabicInteger(arr[0]);\n const b = toArabicInteger(arr[1]);\n return `${a}${ARABIC_DECIMAL}${b}`;\n }\n\n return toArabicInteger(num);\n}\n\nfunction toRomanInteger(num: string) {\n return num\n .split(\"\")\n .map((n) => (romanNumerals[n] ? romanNumerals[n] : n))\n .join(\"\");\n}\n\nexport const toRomanNumerals = (num: string) => {\n if (!num) {\n return \"\";\n }\n\n if (num.includes(ARABIC_DECIMAL)) {\n const arr = num.split(ARABIC_DECIMAL);\n return `${toRomanInteger(arr[0])}.${toRomanInteger(arr[1])}`;\n }\n\n return toRomanInteger(num);\n};\n","export function isMobile() {\n return window.innerWidth <= 600\n}\n","import { MD5 } from \"object-hash\";\n\nexport function contentHash(content: string) {\n return MD5(content);\n}\n","function replaceAll(text: string, from: string, to: string) {\n if (!text) {\n return \"\";\n }\n\n return text.replace(new RegExp(from, \"g\"), to);\n}\n\nconst ARABIC_WORDS = [\"ﷺ\", \"ؐ\", \"ؓ\", \"؏\", \"\", \"ؑ\"];\n\nexport function fixArabicFont(contents: string) {\n for (let i = 0; i < ARABIC_WORDS.length; i += 1) {\n const w = ARABIC_WORDS[i];\n if (!w) {\n continue;\n }\n\n contents = replaceAll(\n contents,\n w,\n `${w}`\n );\n }\n\n return contents;\n}\n\nexport function fixArabicText(contents: string) {\n return {\n __html: fixArabicFont(contents),\n };\n}\n","export interface DocMeta {\n name: string;\n value: string;\n}\n\nexport function getMetaValue(meta: DocMeta[], name: string) {\n const result = meta.find((m) => m.name === name);\n\n if (!result) {\n return;\n }\n\n const v = result.value;\n if (name === \"authors\") {\n return v.split(\"؛\").join(\"، \");\n }\n\n return v;\n}\n","const LOCAL_DOMAINS = [\"localhost\", \"127.0.0.1\", \"192.168.1.119\"];\n\nfunction getURLs(): [string, string] {\n if (!LOCAL_DOMAINS.includes(window.location.hostname)) {\n return [\"https://urdupub.com/app/\", \"https://api.urdupub.com/\"];\n }\n\n return [\"http://localhost:3901/app/\", \"http://localhost:3901/\"];\n}\n\nconst [SITE_URL, API_URL] = getURLs();\nexport { SITE_URL, API_URL };\n\nexport const API_VERSION = \"v1\";\nexport const API_BASE_URL = `${API_URL}${API_VERSION}`;\n\nexport const UD_EDITOR = \"EDITOR\";\nexport const UD_AUTHOR = \"AUTHOR\";\nexport const UD_REVIEWER = \"REVIEWER\";\nexport const UD_READER = \"READER\";\n\nexport const PAGE_EDITOR = \"pages/EDITOR\";\n","import { SITE_URL } from \"../settings\";\n\nexport function urlFormat(title: string) {\n return title.split(\" \").join(\"-\");\n}\n\ntype Doc = {\n id: number;\n name: string;\n};\ntype EBook = {\n id: number;\n title: string;\n}\ntype Page = {\n id: number;\n name: string;\n};\ntype Tag = {\n id: number;\n name: string;\n};\n\nexport function pageUrl(doc: Doc, page: Page, includeSiteUrl: boolean = false) {\n const d = `${urlFormat(doc.name)}`;\n const p = `${urlFormat(page.name)}`;\n\n let url = includeSiteUrl ? SITE_URL : \"/app/\";\n url += `r-${doc.id}-${page.id}/${d}/${p}/`;\n return url;\n}\n\nexport function pageShareUrl(doc: Doc, page: Page) {\n return `${SITE_URL}r-${doc.id}-${page.id}/`;\n}\n\nexport function docUrl(doc: Doc, includeSiteUrl = false) {\n let url = includeSiteUrl ? SITE_URL : \"/app/\";\n url += `b-${doc.id}-${encodeURIComponent(urlFormat(doc.name))}/`;\n return url;\n}\n\nexport function ebookUrl(ebook: EBook, includeSiteUrl = false) {\n let url = includeSiteUrl ? SITE_URL : \"/\";\n url += `e-${ebook.id}-${encodeURIComponent(urlFormat(ebook.title))}/`;\n return url;\n}\n\nexport function docShareUrl(doc: Doc) {\n return `${SITE_URL}b-${doc.id}-/`;\n}\n\nexport function tagUrl(tag: Tag, includeSiteUrl: boolean = false) {\n let url = includeSiteUrl ? SITE_URL : \"/app/\";\n url += `t-${tag.id}-${urlFormat(tag.name)}/`;\n return url;\n}\n","import localforage from \"localforage\";\nimport { VERSION, STORE_NAME } from \"./FileStorage\";\n\n// ~ 5MiB\nexport const LARGE_STORE_FILE_SIZE_LIMIT = 5 * 1000 * 1000;\n\n// prefix file text, which marks presence of a large file\nexport const LARGE_FILE_MARKER =\n \"qalam-Da9OhthaeF3naez3uwooFieKai5jahseishooch9\";\n\ntype GetResolveFn = ({ path, value }: { path: string; value: string }) => void;\ntype SetResolveFn = ({ path }: { path: string }) => void;\ntype NextPartFn = (counter: number) => void;\n\nexport class LargeFileStorage {\n private instance: LocalForage;\n\n constructor(private id: string) {\n this.instance = localforage.createInstance({\n name: this.name(),\n storeName: STORE_NAME,\n version: VERSION,\n driver: [\n localforage.INDEXEDDB,\n localforage.WEBSQL,\n localforage.LOCALSTORAGE,\n ],\n });\n }\n\n name() {\n return `ur_l_${this.id}`;\n }\n\n destroy() {\n // since IndexedDB is the first DB in driver list, so we are using it's\n // direct API to delete underlying storage otherwise we would not do this\n const name = this.name();\n const req = window.indexedDB.deleteDatabase(name);\n req.onsuccess = () => {\n console.log(`Large deleted successfully ${name}`);\n };\n\n req.onerror = () => {\n console.log(`Could not delete ${name}`);\n };\n\n req.onblocked = () => {\n console.log(\n `Couldn't delete database due to the operation being blocked ${name}`\n );\n };\n }\n\n clear() {\n this.instance.clear();\n }\n\n numParts(size: number) {\n return Math.ceil(size / LARGE_STORE_FILE_SIZE_LIMIT);\n }\n\n isLarge(value: string) {\n return !!(value && value.indexOf(LARGE_FILE_MARKER) === 0);\n }\n\n extract(value: string) {\n const splitParts = value.split(\"|\");\n\n return {\n marker: splitParts[0] + \"|\" + splitParts[1],\n path: splitParts[1],\n count: parseInt(splitParts[2]),\n };\n }\n\n pathPrefix(path: string) {\n return `${LARGE_FILE_MARKER}|${path}`;\n }\n\n normalPath(path: string, size: number) {\n return `${this.pathPrefix(path)}|${this.numParts(size)}`;\n }\n\n get(path: string, value: string, resolve: GetResolveFn) {\n const { count } = this.extract(value);\n this._getParts(path, this.pathPrefix(path), count, resolve);\n }\n\n _getParts(\n _path: string,\n pathPrefix: string,\n count: number,\n resolve: GetResolveFn\n ) {\n const parts: Array = [];\n const next = (counter: number, value: string) => {\n parts.push(value);\n\n if (counter < count) {\n return this._getPart(pathPrefix, counter, next);\n } else {\n return resolve({ path: _path, value: parts.join(\"\") });\n }\n };\n\n this._getPart(pathPrefix, 0, next);\n }\n\n _getPart(\n pathPrefix: string,\n number: number,\n next: (counter: number, value: string) => void\n ) {\n this.instance.getItem(`${pathPrefix}|${number}`, (err, value) => {\n if (err != null) {\n // no need to retrieve more parts we have nothing to retrieve\n return next(Number.MAX_SAFE_INTEGER, \"\");\n }\n\n return next(number + 1, (value as unknown) as string);\n });\n }\n\n set(path: string, value: string, resolve: SetResolveFn) {\n this._setParts(\n path,\n this.pathPrefix(path),\n value,\n this.numParts(value.length),\n resolve\n );\n }\n\n _setParts(\n _path: string,\n pathPrefix: string,\n value: string,\n count: number,\n resolve: SetResolveFn\n ) {\n const next = (counter: number) => {\n if (counter < count) {\n return this._setPart(pathPrefix, value, counter, next);\n } else {\n return resolve({ path: _path });\n }\n };\n\n this._setPart(pathPrefix, value, 0, next);\n }\n\n _setPart(\n pathPrefix: string,\n contents: string,\n number: number,\n next: NextPartFn\n ) {\n const partContents = this._partInContents(contents, number);\n this.instance.setItem(`${pathPrefix}|${number}`, partContents, () =>\n next(number + 1)\n );\n }\n\n _partInContents(contents: string, number: number) {\n const start = number * LARGE_STORE_FILE_SIZE_LIMIT;\n const end = start + LARGE_STORE_FILE_SIZE_LIMIT;\n\n if (end > contents.length) {\n return contents.substr(start);\n }\n\n return contents.substr(start, LARGE_STORE_FILE_SIZE_LIMIT);\n }\n\n remove(path: string, value: string, resolve: SetResolveFn) {\n const { count } = this.extract(value);\n this._removeParts(path, this.pathPrefix(path), count, resolve);\n }\n\n _removeParts(\n _path: string,\n pathPrefix: string,\n count: number,\n resolve: SetResolveFn\n ) {\n const next = (counter: number) => {\n if (counter < count) {\n return this._removePart(pathPrefix, counter, next);\n } else {\n return resolve({ path: _path });\n }\n };\n\n this._removePart(pathPrefix, 0, next);\n }\n\n _removePart(pathPrefix: string, number: number, next: NextPartFn) {\n this.instance.removeItem(`${pathPrefix}|${number}`, () => {\n return next(number + 1);\n });\n }\n}\n","import localforage from \"localforage\";\nimport { LargeFileStorage } from \"./LargeFileStorage\";\n\nexport const STORE_NAME = \"keyvaluepairs\";\nexport const VERSION = 1.0;\n\n// ~ 250KiB\nexport const NORMAL_STORE_FILE_SIZE_LIMIT = 250 * 1000;\n\nexport class FileStorage {\n private instance: LocalForage;\n private _large: LargeFileStorage;\n\n constructor(private id: string) {\n this._large = new LargeFileStorage(id);\n this.instance = localforage.createInstance({\n name: this.name(),\n storeName: STORE_NAME,\n version: VERSION,\n driver: [\n localforage.INDEXEDDB,\n localforage.WEBSQL,\n localforage.LOCALSTORAGE,\n ],\n });\n }\n\n name() {\n return `ur_n_${this.id}`;\n }\n\n destroy() {\n // since IndexedDB is the first DB in driver list, so we are using it's\n // direct API to delete underlying storage otherwise we would not do this\n const name = this.name();\n\n const req = window.indexedDB.deleteDatabase(name);\n req.onsuccess = () => {\n console.log(`Deleted successfully: ${name}`);\n };\n\n req.onerror = () => {\n console.log(`Could not delete: ${name}`);\n };\n\n req.onblocked = () => {\n console.log(\n `Couldn't delete database due to the operation being blocked: ${name}`\n );\n };\n\n this._large.destroy();\n }\n\n clear() {\n this.instance.clear();\n this._large.clear();\n }\n\n get(path: string) {\n return new Promise<{\n path: string;\n value: string;\n }>((resolve, _reject) => {\n this.instance.getItem(path).then((value) => {\n const v = (value as unknown) as string;\n if (this._large.isLarge(v)) {\n this._large.get(path, v, resolve);\n } else {\n resolve({ path, value: v });\n }\n });\n });\n }\n\n set(path: string, contents: string) {\n return new Promise((resolve, _reject) => {\n if (contents.length > NORMAL_STORE_FILE_SIZE_LIMIT) {\n this.instance\n .setItem(\n path,\n this._large.normalPath(path, contents.length)\n )\n .then(() => {\n this._large.set(path, contents, resolve);\n });\n } else {\n this.instance\n .setItem(path, contents)\n .then(() => resolve({ path }));\n }\n });\n }\n\n remove(path: string) {\n return new Promise((resolve, _reject) => {\n // console.log('FileStorage::remove Large', path)\n this.instance.getItem(path).then((value) => {\n const v = (value as unknown) as string;\n if (this._large.isLarge(v)) {\n this.instance.removeItem(path).then(() => {\n this._large.remove(path, v, resolve);\n });\n } else {\n this.instance\n .removeItem(path)\n .then(() => resolve({ path }));\n }\n });\n });\n }\n\n keys() {\n return this.instance.keys();\n }\n\n length() {\n return this.instance.length();\n }\n}\n","import { eventEmitter } from \"../../../services\";\nimport { OrderedSet } from \"immutable\";\n\nexport const AUTOCOMPLETE_SHOW = \"autocomplete/show\";\nexport const AUTOCOMPLETE_HIDE = \"autocomplete/hide\";\nexport const AUTOCOMPLETE_NEXT = \"autocomplete/next\";\nexport const AUTOCOMPLETE_PREV = \"autocomplete/prev\";\nexport const AUTOCOMPLETE_SELECT = \"autocomplete/select\";\nexport const AUTOCOMPLETE_REPLACE_VALUE = \"autocomplete/replaceValue\";\n\nexport class AutoCompleteService {\n private word: string = \"\";\n private list = OrderedSet();\n private hidden: boolean = true;\n\n set(words: OrderedSet) {\n this.list = OrderedSet(words.sort());\n }\n\n clear() {\n this.list = this.list.clear();\n this.hidden = true;\n eventEmitter.emit(AUTOCOMPLETE_HIDE);\n }\n\n ask(word: string) {\n if (!this.list) {\n return;\n }\n\n if (word === this.word && this.isVisible()) {\n return;\n }\n\n this.word = word;\n const result = this.list.filter(\n (value?: string) =>\n typeof value !== \"undefined\" &&\n value !== word &&\n value.startsWith(word)\n );\n\n if (result.count() > 0) {\n this.show(OrderedSet(result.slice(0, 5)));\n } else {\n this.hide();\n }\n }\n\n replaceValue(word: string) {\n this.hide();\n eventEmitter.emit(AUTOCOMPLETE_REPLACE_VALUE, this.word, word);\n }\n\n show(result: OrderedSet) {\n this.hidden = false;\n eventEmitter.emit(AUTOCOMPLETE_SHOW, result);\n }\n\n hide() {\n this.hidden = true;\n eventEmitter.emit(AUTOCOMPLETE_HIDE);\n }\n\n prev() {\n eventEmitter.emit(AUTOCOMPLETE_PREV);\n }\n\n next() {\n eventEmitter.emit(AUTOCOMPLETE_NEXT);\n }\n\n isEmpty() {\n return this.list.count() === 0;\n }\n\n isHidden() {\n return this.hidden;\n }\n\n isVisible() {\n return !this.hidden;\n }\n}\n","//@ts-nocheck\nimport { OrderedSet } from \"immutable\";\nimport React from \"react\";\nimport styled from \"styled-components\";\n\nimport { eventEmitter, autoComplete } from \"../../../services\";\nimport {\n AUTOCOMPLETE_HIDE,\n AUTOCOMPLETE_NEXT,\n AUTOCOMPLETE_PREV,\n AUTOCOMPLETE_SELECT,\n AUTOCOMPLETE_SHOW,\n} from \"./AutoCompleteService\";\nimport { getPosition, Position } from \"./helpers\";\n\nconst OFFSET_TOP = 32;\n\ninterface ContainerProps extends Position {\n count: number;\n enableDarkTheme: boolean;\n}\nconst Container = styled.div`\n display: ${(p: ContainerProps) => (p.count > 0 ? \"block\" : \"none\")};\n position: absolute;\n padding: 3px 0;\n right: ${(p: ContainerProps) => window.innerWidth - p.left}px;\n top: ${(p: ContainerProps) => p.top + OFFSET_TOP}px;\n display: flex;\n border-radius: 4px;\n flex-direction: column;\n justify-content: center;\n align-items: flex-start;\n color: ${(p: ContainerProps) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: ${(p: ContainerProps) =>\n p.enableDarkTheme ? \"#fff\" : \"#000\"};\n`;\n\ninterface ItemProps {\n selected: boolean;\n enableDarkTheme: boolean;\n}\nconst Item = styled.div`\n cursor: pointer;\n user-select: none;\n padding: 3px 15px;\n width: 100%;\n min-width: 150px;\n color: ${(p: ItemProps) => (p.enableDarkTheme ? \"#000\" : \"#f5f5f5\")};\n border-bottom: 1px solid\n ${(p: ItemProps) => (p.enableDarkTheme ? \"#f5f5f5\" : \"#353839\")};\n white-space: nowrap;\n\n &:last-child {\n border-bottom: 0;\n }\n\n background-color: ${(p: ItemProps) => {\n if (p.selected) {\n return p.enableDarkTheme ? \"#f5f5f5\" : \"#353839\";\n }\n\n return \"transparent\";\n }};\n`;\n\ninterface Props {\n enableDarkTheme: boolean;\n}\ninterface State {\n list: ReturnType;\n selected: number;\n}\nexport class AutoComplete extends React.Component {\n state = {\n list: OrderedSet(),\n selected: -1,\n };\n\n componentDidMount() {\n eventEmitter.on(AUTOCOMPLETE_SHOW, this.onShow);\n eventEmitter.on(AUTOCOMPLETE_HIDE, this.onHide);\n eventEmitter.on(AUTOCOMPLETE_PREV, this.onPrev);\n eventEmitter.on(AUTOCOMPLETE_NEXT, this.onNext);\n eventEmitter.on(AUTOCOMPLETE_SELECT, this.onSelect);\n }\n\n componentWillUnmount() {\n eventEmitter.off(AUTOCOMPLETE_SHOW, this.onShow);\n eventEmitter.off(AUTOCOMPLETE_HIDE, this.onHide);\n eventEmitter.off(AUTOCOMPLETE_PREV, this.onPrev);\n eventEmitter.off(AUTOCOMPLETE_NEXT, this.onNext);\n eventEmitter.off(AUTOCOMPLETE_SELECT, this.onSelect);\n }\n\n onShow = (list: OrderedSet) => this.setState({ list, selected: 0 });\n onHide = () => this.setState({ list: this.state.list.clear() });\n\n onPrev = () => {\n const { selected, list } = this.state;\n this.setState({\n selected: selected === 0 ? list.count() - 1 : selected - 1,\n });\n };\n\n onNext = () => {\n const { selected, list } = this.state;\n this.setState({\n selected: (selected + 1) % list.count(),\n });\n };\n\n onSelect = () => {\n const { list, selected } = this.state;\n this.sendValue(list.toJS()[selected]);\n };\n\n sendValue = (word: string) => autoComplete.replaceValue(word);\n\n render() {\n if (this.state.list.count() === 0) {\n return null;\n }\n\n const { list, selected } = this.state;\n const { enableDarkTheme } = this.props;\n\n return (\n \n {list.toJS().map((value: string, i: number) => (\n this.sendValue(value)}\n >\n {value}\n \n ))}\n \n );\n }\n}\n","export interface Position {\n left: number;\n top: number;\n}\nexport function getPosition(): Position {\n const sel = window.getSelection();\n\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const rect = range.getClientRects()[0];\n return {\n left: rect.left,\n top: rect.top,\n };\n }\n }\n\n return {\n left: -1,\n top: -1,\n };\n}\n","import { ur_PK_messages } from \"../../locales/ur-PK/messages\";\nimport { flattenMessages } from \"../../locales/utils\";\n\n// NO TO DO, if i put messages inside redux, it's an extra state to manage\n// if I use redux then I probably wouldn't need this but the syntax will\n// again get long e.g. this.props.message[messageId]\n\nnew Intl.Collator([\"ur-PK\", \"ar-AR\"]);\n\nexport const DEFAULT_LOCALE = \"ar-AR\"; // because ur-PK is not supported\nexport const translations: Record = {\n [DEFAULT_LOCALE]: flattenMessages(ur_PK_messages),\n};\n\nexport class I18n {\n private locale: string;\n constructor() {\n this.locale = DEFAULT_LOCALE;\n }\n\n get(messageId: string) {\n return translations[this.locale][messageId];\n }\n}\n","import { LocaleMessages } from \"./ur-PK/messages\";\n\nexport function flattenMessages(\n list: LocaleMessages,\n prefix: string = \"\"\n): Record {\n const messages: Record = {};\n for (const [key, value] of Object.entries(list)) {\n const k = prefix.length > 0 ? `${prefix}.${key}` : key;\n\n if (typeof value === \"string\") {\n messages[k] = value;\n } else {\n Object.assign(messages, flattenMessages(value, k));\n }\n }\n\n return messages;\n}\n","export type LocaleMessages = Record>;\n\nexport const ur_PK_messages: LocaleMessages = {\n loading: \"ابتداء\",\n\n site: {\n title: \"قلم\",\n description: \"لکھو، پڑھو اور علم بانٹو\",\n },\n\n contact: {\n facebook: \"فیس بُک\",\n description:\n \"آپ باآسانی فیس بُک پر ہم سے رابطہ کر سکتے ہیں. ہمارے پیج کو پسند کیجئے اور دوسروں تک اس پیغام کو پہنچائے.\",\n },\n\n topMenu: {\n facebook: \"فیس بُک\",\n help: \"مدد\",\n contact: \"رابطہ\",\n homepage: \"صفحہ اؤل\",\n copyrights: \"کاپی رائٹ\",\n terms: \"اصول\",\n },\n\n book: {\n read: \"کتاب پڑھیں\",\n shareOnFacebook: \"فیس بُک پر شیئر کرو\",\n shareWithFriends: \"دوستوں کے ساتھ شئیر کریں\",\n },\n\n featured: {\n weight: \"وزن\",\n tagTitle: \"نمایاں\",\n },\n\n header: {\n loginRegister: \"لاگن / رجسٹریشن\",\n account: \"اکاؤنٹ\",\n writeBook: \"کتاب لِکھو\",\n docs: \"دستاویزات\",\n },\n\n results: {\n loadMore: \"مزید لوڈ کریں\",\n none: \"اس تلاش کے کوئی نتائج برآمد نہیں ہوئے\",\n tagsNone: \"اس ٹیگ کے ساتھ کوئی بھی نتائجہ منسلک نہیں ہے\",\n },\n\n doc: {\n heading: \"ڈاکیومنٹ\",\n title: \"عنوان\",\n access: \"رسائی\",\n public: \"عوامی\",\n private: \"ذاتی\",\n created: \"دستاویز کامیابی کے ساتھ تخلیق پا گئی.\",\n saved: \"دستاویز کامیابی کے ساتھ محفوظ کر لی گئی.\",\n failed: \"دستاویز محفوظ کرنے میں ناکامی.\",\n passwordProtected: \"محفوظ بمعہ پاسورڈ\",\n new: \"نئ دستاویز\",\n preview: \"پیش نظر\",\n edit: \"معلومات بدلو\",\n editDoc: \"دستاویز ایڈیٹر\",\n save: \"محفوظ کریں\",\n cancel: \"منسوخ کریں\",\n remove: \"حذف کرو\",\n meta: \"خصوصیات\",\n confirmRemove: \"کیا آپ واقعی دستاویز کو حذف کرنا چاہتے ہیں؟\",\n confirmRemoveAll: \"کیا آپ واقعی تمام دستاویزات کو حذف کرنا چاہتے ہیں؟\",\n search: \"دستاویزات فلٹر کریں\",\n },\n\n pageForm: {\n titleCreate: \"نیا صفحہ\",\n titleEdit: \"صفحہ میں ترمیم\",\n created: \"نیا صفحہ کامیابی سے تخلیق ہو گیا.\",\n saved: \"صفحہ کامیابی محفوظ کر لیا گیا.\",\n failed: \"معلومات محفوظ کرنے میں ناکامی.\",\n new: \"نیا صفحہ\",\n edit: \"معلومات بدلو\",\n save: \"محفوظ کریں\",\n cancel: \"منسوخ کریں\",\n remove: \"حذف کرو\",\n confirmRemove: \"کیا آپ واقعی صفحہ کو حذف کرنا چاہتے ہیں؟\",\n confirmRemoveAll: \"کیا آپ واقعی اِن تمام صفحات کو حذف کرنا چاہتے ہیں؟\",\n onlyPageCannotDelete:\n \"اس دستاویز میں صرف ایک صفحہ ہے، اگر آپ اس صفحہ کو حزف کرنا چاہتے ہیں تو تمام دستویز کو حذف کیجئے.\",\n name: \"نام\",\n status: \"حالت\",\n parent_id: \"احاطی صفحہ\",\n statusDRAFT: \"مسودہ\",\n statusPUBLISHED: \"شائع\",\n pageStatusInvalid: \"مسودے کے لیے صیح آپشن کا انتخاب کیجئے\",\n submitBtnCreate: \"تخلیق کرو\",\n submitBtnEdit: \"محفوظ کرو\",\n alternateBtnCreate: \"واپس\",\n alternateBtnEdit: \"واپس\",\n },\n\n confirm: {\n yes: \"ہاں\",\n no: \"نہیں\",\n },\n\n user: {\n add: \"ممبر شامل کریں\",\n name: \"نام\",\n status: \"حیثیت\",\n },\n\n userDocForm: {\n titleCreate: \"ممبر شامل کریں\",\n submitBtnCreate: \"محفوظ کرو\",\n titleEdit: \"ممبرشپ میں ترمیم\",\n alternateBtnCreate: \"واپس\",\n submitBtnEdit: \"محفوظ کرو\",\n alternateBtnEdit: \"واپس\",\n added:\n \"ممبر کامیابی کے ساتھ شامل. اگلی مرتبہ ممبر لاگن کر کے دستویزات میں اس دستاویز کو دیکھ سکے گا.\",\n alreadyAMember: \"ممبر پہلے سے دستاویز میں شامل ہے.\",\n saved: \"ممبر میں تبدیلی کامیابی کے ساتھ طے پا گئی.\",\n failed: \"ممبر میں تبدیلی میں ناکامی.\",\n email: \"اِی میل\",\n statusEDITOR: \"ایڈیٹر\",\n statusAUTHOR: \"مصنف\",\n statusREVIEWER: \"جائزہ کار\",\n statusREADER: \"پروف ریڈر\",\n edit: \"معلومات بدلو\",\n cancel: \"منسوخ کریں\",\n remove: \"حذف کرو\",\n confirmRemove: \"کیا آپ واقعی ممبر کو حذف کرنا چاہتے ہیں؟\",\n confirmRemoveAll: \"کیا آپ واقعی اِن تمام ممبرز کو حذف کرنا چاہتے ہیں؟\",\n },\n\n tools: {\n format: \"فارمیٹ\",\n insert: \"انسرٹ\",\n design: \"ڈزائین\",\n layout: \"لے آوٹ\",\n collaboration: \"اشتراک\",\n },\n\n lang: {\n eng: \"انگریزی\",\n urd: \"اُردو\",\n },\n\n layout: {\n toc: \"فہرست\",\n margins: \"کنارے\",\n orientation: \"سمت\",\n size: \"ناپ\",\n colors: \"رنگ\",\n newPage: \"نیا صفحہ\",\n },\n\n editor: {},\n\n editorMenu: {\n pages: \"صفحات\",\n users: \"ممبران\",\n toggleTheme: \"رنگ بدلو\",\n translate: \"ترجمہ\",\n export: \"ایکسپورٹ\",\n docs: \"دستاویزات\",\n addPage: \"نیا اضافحہ\",\n },\n\n rsb: {\n width: \"چوڑائی\",\n width_inch: \"چوڑائی (انچ)\",\n height: \"اونچائی\",\n height_inch: \"اونچائی (انچ)\",\n },\n\n rsbSizes: {\n letter: \"خط\",\n tabloid: \"اخبار\",\n legal: \"قانونی\",\n statement: \"بیان\",\n executive: \"ایگزیکٹو\",\n a3: \"اے۳\",\n a4: \"اے۴\",\n a5: \"اے۵\",\n b4: \"بی۴\",\n b5: \"بی۵\",\n },\n\n footer: {\n words: \"الفظ\",\n },\n\n foreground: \"پیش منظر\",\n background: \"پس منظر\",\n\n menu: {\n login: \"لاگ اِن\",\n logout: \"لاگ آوٹ\",\n account: \"اکاؤنٹ\",\n docs: \"دستاویزات\",\n vision: \"سوچ\",\n use: \"استمال\",\n contact: \"رابطہ\",\n },\n\n tab: {\n loginForm: \"لاگن\",\n registerForm: \"رجسٹریشن\",\n resetPasswordForm: \"پاسورڈ بھولنا\",\n },\n\n loginForm: {\n title: \"لاگ اِن\",\n email: \"اِی میل\",\n password: \"پاسورڈ\",\n submitBtn: \"لاگ اِن\",\n failed: \"براہ کرم آپ کا دیا ہو ای میل یا پاسورڈ درست نہیں.\",\n },\n\n onBoarding: {\n next: \"اگلا قدم\",\n startEditor: \"لوڈ کرو\",\n },\n\n registerForm: {\n title: \"رجسٹریشن\",\n name: \"نام\",\n email: \"اِی میل\",\n password: \"پاسورڈ\",\n confirmPassword: \" پاسورڈ دہرایں\",\n submitBtn: \"داخلہ\",\n success:\n \"رجسٹریشن میں کامیابی، اپنا میل چیک کر کے اکاؤنٹ چالو کریں. میل گمشدگی کی صورت میں سپیم باکس چیک کرنا مت بھولیے گا.\",\n failure: \"اس ای میل کا اکاؤنٹ پہلے سے رجسٹرڈ ہے.\",\n },\n\n editProfileForm: {\n title: \"اکاؤنٹ\",\n name: \"نام\",\n email: \"اِی میل\",\n password: \"نیا پاسورڈ\",\n confirmPassword: \"نیا پاسورڈ دہرایں\",\n submitBtn: \"محفوظ کرو\",\n alternateBtn: \"منسوخ کرو\",\n },\n\n resetPasswordForm: {\n title: \"پاسورڈ بھولنا\",\n email: \"موجودہ اِی میل\",\n submitBtn: \"کوشش کرو\",\n failed:\n \"براہ مہربانی، اِی میل پر نظر ڈالیے اس اِی میل سے ہمارے نظام میں کوئی نہیں.\",\n success:\n \"اپنا ای میل چیک کیجئے، ایک نیا پاسورڈ آپ کو ارسال کر دیا گیا ہے.\",\n },\n\n createDocForm: {},\n\n editDocForm: {\n title: \"دستاویز میں ترمیم\",\n },\n\n docForm: {\n titleCreate: \"نئ دستاویز\",\n titleEdit: \"دستاویز میں ترمیم\",\n submitBtnCreate: \"تخلیق کرو\",\n submitBtnEdit: \"محفوظ کرو\",\n alternateBtnCreate: \"واپس\",\n alternateBtnEdit: \"واپس\",\n name: \"نام\",\n status: \"حالت\",\n statusDRAFT: \"مسودہ\",\n statusPUBLISHED: \"شائع\",\n lastUpdated: \"تاریخ\",\n visibility: \"نمائش\",\n visibilityPUBLIC: \"عوامی\",\n visibilityPRIVATE: \"ذاتی\",\n docStatusInvalid: \"مسودے کے لیے صیح آپشن کا انتخاب کیجئے\",\n docVisibilityInvalid: \"نمائش کے لیے صیح آپشن کا انتخاب کیجئے\",\n created: \"دستاویز کامیابی کے ساتھ بنائی جا چکی ہے\",\n saved: \"دستاویز میں ترمیم کامیابی کے ساتھ محفوظ.\",\n failed: \"دستاویز میں ترمیم میں ناکامی.\",\n },\n\n docMetaForm: {\n titleEdit: \"خصوصیات\",\n authors: \"مصنف . ایک سے زیادہ کو ؛ سے الگ کرو\",\n intro: \"تعارف\",\n tags: \"ٹیگز\",\n cover: \"سرورق سائز png 794x1122 ہو جو زیادہ سے زیادہ 1 MB\",\n submitBtnEdit: \"محفوظ کرو\",\n alternateBtnEdit: \"واپس\",\n saved: \"معالومات کو کامیابی کے ساتھ محفوظ کر لیا گیا.\",\n },\n\n createPageForm: {\n title: \"نیا صفحہ\",\n saveBtn: \"تخلیق کرو\",\n },\n\n editPageForm: {\n title: \"صفحہ میں ترمیم\",\n },\n\n form: {\n selectEmptyLabel: \"❊\",\n nameRequired: \"نام فرام کیجئے.\",\n nameMinChars: \"نام کم سے کم ۳ حروف پر مشتمل ہونا چاہیے.\",\n authorsMinChars: \"مصنف کم سے کم ۳ حروف پر مشتمل ہونا چاہیے.\",\n introMinChars: \"تعارف فراہم کیجئے.\",\n emailRequired: \"اِئ میل فرام کیجئے.\",\n emailInvalid: \"درست اِئ میل فراہم کیجئے.\",\n passwordRequired: \"پاسورڈ فرام کیجئے.\",\n passwordMinChars: \"پاسورڈ کم سے کم ۶ حروف پر مشتمل ہونا چاہیے.\",\n confirmPasswordRequired: \"پاسورڈ فرام کیجئے.\",\n confirmPasswordSameAsPassword:\n \"دہرایا ہوا پاسورڈ اور پاسورڈ ایک جیسا ہونا چاہیے.\",\n emailAlreadyRegistered:\n \"اس اِی میل پہلے سے رجسٹرڈ ہے. آپ اس سے لاگ اِن کیجیے یا پاسورڈ بھولنے کے صورت میں پاسورڈ بھولنا میں جا کر تلاش کریں.\",\n introRequired: \"تعارف فرام کیجئے.\",\n authorsRequired: \"مصنف فرام کیجئے.\",\n tagsRequired: \"ٹیگز فرام کیجئے.\",\n tagsCount_1_3: \"۱ سے ۳ کی حد تک ٹیگز چن سکتے ہیں.\",\n invalidLogin:\n \"غلط لاگن، براہ مہربانی صحیح اِی میل اور پاسورڈ فراہم کیجئے.\",\n validLogin: \"لاگ اِن میں کامیابی.\",\n saved: \"کامیابی کے ساتھ محفوظ.\",\n return: \"واپس\",\n date: \"تاریخ\",\n saveBtn: \"محفوظ کرو\",\n unmodified: \"معلومات میں کوئی تبدیلی واقع نہیں ہوئی.\",\n },\n\n copy: {\n translation: \"ترجمعہ کاپی کرو\",\n },\n\n export: {\n title: \"ایکسپورٹ\",\n pdf: \"پی.ڈی.اِیف\",\n epub: \"اِی پَب\",\n mobi: \"موبی\",\n return: \"واپس\",\n },\n\n market: {\n title: \"بازار\",\n },\n\n toolbar: {\n linkPlaceholder: \"یہاں لنک درج کیجئے\",\n uploadingImage: \"تصویر اَپلوڈ ہو رہی ہے\",\n maxImageSizeError:\n \"آپ کو ۱ایم.بی سے بڑی تصویر اپلوڈ کرنے کی اجازت نہیں\",\n },\n\n resize: {\n width: \"چوڑائی :\",\n height: \"اونچائی :\",\n },\n\n tip: {\n share: \"فیسبُک پر شیئر\",\n theme: \"رنگ بدلو\",\n size: \"سائز بدلو\",\n return: \"واپس\",\n toc: \"فہرست\",\n download: \"ڈاؤنلوڈ\",\n },\n\n translate: {\n title: \"ترجمہ\",\n description: \"ایک زبان سے دوسری زبان میں متن کا ترجمہ کریں.\",\n },\n\n merge: {\n title: \"ضم\",\n description:\n \"اس صفحہ میں آپ اپنے کام کو دوسروں کے کام میں شامل کر سکتے ہیں.\",\n src: \"منتخب کریں، صفحہ جس میں آپ نے تبدیلیاں کی ہیں\",\n srcAll: \"منتخب کریں، صفحہ جس سے آپ نے تبدیلیاں لینی ہیں\",\n dst: \"منتخب کریں، صفحہ جس میں آپ کی تبدیلیاں ضم ہوں\",\n confirmRequest: \"ہاں، میں اسے ضم کرنے کی درخواست کرتا ہوں\",\n alreadyUpToDate: \"اِس صفحہ کے مقابلہ میں کوئی تبدیلی دستیاب نہیں.\",\n compareDescription: \"اُوپر سے بلمقابل صفحات کا انتخاب کریں.\",\n split: \"تقسیم\",\n unified: \"متحد\",\n requestCreated: \"آپ کی درخواست کامیابی سے بھیج دی گئی ہے.\",\n noChanges: \"صفحات کے بلمقابل کوئی تبدیلی دستیاب نہیں.\",\n titleRequest: \"درخواستیں\",\n requestDescription:\n \"دوسرے لوگ آپ کے کام میں مدد کے لیے جو کام کریں، اُس کی وہ درخواست بنائیں گئے جو آپ یہاں دیکھ سکیں گئے. یہ آپ پر منحصر ہے کہ آپ اُن کا کام قبول کریں یا رد کر دیں.\",\n number: \"نمبر\",\n status: \"حالت\",\n OPEN: \"سوالیہ\",\n PENDING: \"زیر غور\",\n REJECTED: \"مسترد\",\n RESOLVED: \"حل شدہ\",\n src_name: \"مطلوب\",\n dst_name: \"ذمہ دار\",\n page_name: \"صفحہ\",\n resolveTitle: \"ضم کا فیصلہ\",\n resolveDescription:\n \"یہاں آپ فیصلہ کر سکتے ہیں، اگر آپ تبدیلیوں کو قبول کرنا چاہتے ہیں یا نہیں.\",\n confirmMerge: \"ہاں. میں اِن تبدیلیوں کو قبول کرتا ہوں\",\n cancelMerge: \"نہیں، اِسے رد کریں\",\n accepted:\n \"آپ نے تبدیلیوں کو کامیابی کہ ساتھ اپنے صفحہ میں شامل کر دیا ہے.\",\n rejected:\n \"ان تبدیلیوں کو زائل کر دیا گیا ہے. اگر درخواست کندہ کو اِس صفحہ میں تبدیلیاں مطلوب ہوں تو نئ درخواست دائر کریں.\",\n alreadyRejected:\n \"یہ درخواست پہلے ہی مسترد کی جا چکی ہے. اگر درخواست کندہ کو اِس صفحہ میں تبدیلیاں مطلوب ہوں تو نئ درخواست دائر کریں.\",\n alreadyResolved: \"یہ درخواست پہلے ہی آپ کے صفحہ کا حصہ بن چکی ہے.\",\n bothAreEqual: \"یہ صفحات ہر طرح سے ایک جیسے ہیں.\",\n present: \"حال\",\n future: \"مسقتبل\",\n all: \"تمام\",\n },\n};\n","export function getURLParam(name: string) {\n const url = new URL(window.location.href);\n return url.searchParams.get(name);\n}\n","import { useEffect } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { eventEmitter } from \"../../services\";\n\nexport const EVT_TO = \"navigate.to\";\nexport const EVT_REDIRECT = \"navigate.redirect\";\nexport const EVT_FORWARD = \"navigate.forward\";\nexport const EVT_BACKWARD = \"navigate.backward\";\n\nexport interface RouteLocation {\n hash: string;\n pathname: string;\n search: string;\n}\nexport interface RouteMatch {\n params: Record;\n isExact: boolean;\n path: string;\n url: string;\n}\n\nexport class NavigateService {\n to(path: string) {\n eventEmitter.emit(EVT_TO, path);\n }\n\n redirect(path: string) {\n eventEmitter.emit(EVT_REDIRECT, path);\n }\n\n redirectAfter(path: string, secs: number) {\n setTimeout(() => eventEmitter.emit(EVT_REDIRECT, path), secs * 1000);\n }\n\n forward(pages: number = 1) {\n eventEmitter.emit(EVT_FORWARD, Math.abs(pages));\n }\n\n back(pages: number = 1) {\n eventEmitter.emit(EVT_BACKWARD, Math.abs(pages));\n }\n}\n\nexport function Navigator() {\n const history = useHistory();\n\n useEffect(() => {\n const to = (path: string) => {\n history.push(path);\n };\n\n const back = (pages: number = 1) => {\n history.go(-1 * pages);\n };\n\n const forward = (pages: number = 1) => {\n history.go(pages);\n };\n\n const redirect = (path: string) => {\n history.replace(path);\n };\n\n eventEmitter.on(EVT_TO, to);\n eventEmitter.on(EVT_BACKWARD, back);\n eventEmitter.on(EVT_FORWARD, forward);\n eventEmitter.on(EVT_REDIRECT, redirect);\n\n return () => {\n eventEmitter.off(EVT_TO, to);\n eventEmitter.off(EVT_BACKWARD, back);\n eventEmitter.off(EVT_FORWARD, forward);\n eventEmitter.off(EVT_REDIRECT, redirect);\n };\n }, [history]);\n\n return null;\n}\n","import { FormattedMessage } from \"react-intl\";\nimport styled from \"styled-components\";\nimport { device } from \"../../helpers/style\";\nimport { COLORS, TYPE_PRIMARY } from \"../ui\";\n\nexport const BTN_SMALL = \"btn/small\";\nexport const BTN_MEDIUM = \"btn/medium\";\nexport const BTN_ROUND = \"btn/round\";\n\nconst styles: Record> = {\n [BTN_SMALL]: {\n height: \"33px\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n padding: \"0 16px\",\n spanTop: \"-2px\",\n },\n [BTN_MEDIUM]: {\n height: \"44px\",\n fontSize: \"18px\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n padding: \"0 40px\",\n spanTop: \"-3px\",\n },\n [BTN_ROUND]: {\n height: \"33px\",\n fontSize: \"16px\",\n fontWeight: \"500\",\n borderRadius: \"50%\",\n spanTop: \"-2px\",\n },\n};\n\nconst mobileStyles: Record> = {\n [BTN_SMALL]: {\n height: \"33px\",\n lineHeight: \"33px\",\n fontSize: \"14px\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n padding: \"0 16px\",\n },\n [BTN_MEDIUM]: {\n height: \"40px\",\n lineHeight: \"40px\",\n fontSize: \"16px\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n padding: \"0 30px\",\n },\n};\n\nexport const Container = styled.div<\n Record<\"size\" | \"width\" | \"type\" | \"margin\", string>\n>`\n position: relative;\n user-select: none;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n text-decoration: none;\n transition: all 0.3s;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n font-weight: ${(p) => styles[p.size][\"fontWeight\"]};\n white-space: nowrap;\n width: ${(p) => p.width};\n height: ${(p) => styles[p.size][\"height\"]};\n line-height: ${(p) => styles[p.size][\"lineHeight\"]};\n margin: ${(p) => p.margin};\n padding: ${(p) => styles[p.size][\"padding\"]};\n border-radius: ${(p) => styles[p.size][\"borderRadius\"]};\n background-color: ${(p) => COLORS[p.type][\"backgroundColor\"]};\n color: ${(p) => COLORS[p.type][\"color\"]};\n font-size: ${(p) => styles[p.size][\"fontSize\"]};\n\n &:hover,\n & span:hover {\n color: ${(p) => COLORS[p.type][\"hoverColor\"]};\n background-color: ${(p) => COLORS[p.type][\"hoverBackgroundColor\"]};\n }\n\n span {\n position: relative;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n }\n\n @media ${device.phone} {\n font-size: ${(p) => mobileStyles[p.size][\"fontSize\"]};\n padding: ${(p) => mobileStyles[p.size][\"padding\"]};\n height: ${(p) => mobileStyles[p.size][\"height\"]};\n line-height: ${(p) => mobileStyles[p.size][\"lineHeight\"]};\n } ;\n`;\n\nexport const ButtonGroup = styled.div<{\n margin?: string;\n width?: string;\n}>`\n margin: ${(p) => p.margin || \"60px 0 0 0 \"};\n width: ${(p) => p.width || \"100%\"};\n display: flex;\n justify-content: center;\n`;\n\ntype ButtonProps = {\n size?: string;\n width?: string;\n type?: string;\n margin?: string;\n messageId: string;\n onClick: (evt: React.MouseEvent) => void;\n};\nexport function Button({\n size = BTN_SMALL,\n width = \"auto\",\n type = TYPE_PRIMARY,\n margin = \"0 5px\",\n messageId,\n onClick,\n}: ButtonProps) {\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nimport { FormattedMessage } from \"react-intl\";\nimport { COLORS, TYPE_PRIMARY, TYPE_SECONDARY } from \"../ui/Colors\";\nimport { BTN_SMALL, Button, ButtonGroup } from \"../form/Button\";\n\nconst Wrapper = styled.div<{ type: string }>`\n width: 84%;\n font-size: 14px;\n margin: 20px auto 40px auto;\n padding: 20px 15px;\n border: 1px solid ${(p) => COLORS[p.type][\"borderColor\"]};\n border-radius: 6px;\n background-color: ${(p) => COLORS[p.type][\"backgroundColor\"]};\n color: ${(p) => COLORS[p.type][\"color\"]};\n text-align: center;\n`;\n\nconst Message = styled.div`\n font-size: 18px;\n`;\n\ninterface ConfirmProps {\n type: string;\n messageId: string;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport class Confirm extends React.Component {\n onConfirm = () => this.props.onConfirm();\n\n onCancel = () => this.props.onCancel();\n\n render() {\n const { type, messageId } = this.props;\n\n return (\n \n \n \n \n \n \n \n \n \n );\n }\n}\n","import { eventEmitter } from \"../../services\";\nimport { TYPE_SUCCESS, TYPE_FAILURE, TYPE_INFO, TYPE_WARNING } from \"..\";\nimport { AxiosError } from \"axios\";\n\nexport const NOTIFICATION_SET = \"notification/set\";\nexport const NOTIFICATION_CLEAR = \"notification/clear\";\n\nexport type NotificationType = \"s\" | \"f\" | \"i\" | \"w\";\nconst typeMap: Record = {\n s: TYPE_SUCCESS,\n f: TYPE_FAILURE,\n i: TYPE_INFO,\n w: TYPE_WARNING,\n};\n\nexport class NotificationService {\n set(messageId: string, type: NotificationType = \"i\") {\n eventEmitter.emit(NOTIFICATION_SET, {\n messageId,\n type: typeMap[type],\n });\n }\n\n apiError(e: AxiosError) {\n if (e.response) {\n this.set(e.response.data.errors[0], \"f\");\n }\n }\n\n clear() {\n eventEmitter.emit(NOTIFICATION_CLEAR);\n }\n}\n","import { EventEmitter2 } from \"eventemitter2\";\n\nimport { FileStorage } from \"../lib/storage\";\nimport { AutoCompleteService } from \"../lib/ui/autocomplete\";\nimport { I18n } from \"../lib/i18n\";\nimport { NavigateService } from \"../lib/routing\";\nimport { NotificationService } from \"../lib/dialogs\";\n\nexport const docStore = new FileStorage(\"doc\");\nexport const persistStore = new FileStorage(\"persist\");\n\nexport const eventEmitter = new EventEmitter2();\n\nexport const navigate = new NavigateService();\nexport const notification = new NotificationService();\nexport const autoComplete = new AutoCompleteService();\nexport const i18n = new I18n();\n","import { navigate } from \"../services\";\nimport { ReducerState } from \"./reducers\";\n\nexport function isLoggedIn(user: ReducerState) {\n return user.size > 0;\n}\n\nexport function isUserAdmin(user: ReducerState) {\n if (!isLoggedIn(user)) {\n return false;\n }\n\n return user.get(\"level\") === \"ADMIN\";\n}\n\nexport function authRedirect({\n user,\n locationState,\n}: {\n user: ReducerState;\n locationState?: {\n from: {\n pathname: string;\n };\n };\n}) {\n if (!isLoggedIn(user)) {\n return;\n }\n\n if (locationState) {\n const { pathname } = locationState.from;\n const nextPath = pathname === \"/app/logout\" ? \"/app/docs\" : pathname;\n navigate.redirectAfter(nextPath, 0.5);\n } else {\n navigate.redirectAfter(\"/app/docs\", 0.5);\n }\n}\n","export function addClass(target: HTMLElement, name: string) {\n target.classList.add(name);\n}\n\nexport function removeClass(target: HTMLElement, name: string) {\n target.classList.remove(name);\n}\n\nexport function toggleClass(target: HTMLElement, name: string) {\n target.classList.toggle(name);\n}\n\nexport function htmlEntites(text: string) {\n const list: Array<{\n re: RegExp;\n entity: string;\n }> = [\n { re: /&/g, entity: \"&\" },\n { re: />/g, entity: \">\" },\n { re: /> = validate(data, constraints);\n if (!result) {\n return [];\n }\n\n const errors: Array = [];\n\n for (const list of Object.values(result)) {\n for (const value of list) {\n const e = value.split(\" \");\n if (e.length > 0) {\n errors.push(e[e.length - 1]);\n }\n }\n }\n\n return errors;\n}\n\nexport function submitIfEnter(\n evt: React.KeyboardEvent,\n submitFn: () => void\n) {\n if (evt.key === KEY_ENTER) {\n submitFn();\n }\n}\n","import moment from \"moment\";\nimport \"moment/locale/ur\";\nimport { toArabicNumerals } from \"./numerals\";\n\nmoment.locale(\"ur\");\n\nexport function mysqlDateToArabic(date: Date) {\n if (!date) {\n return \"\";\n }\n\n return toArabicNumerals(moment(date).utc().format(\"D MMM YYYY\"));\n}\n\nexport function publishedDate(date: Date) {\n if (!date) {\n return \"\";\n }\n\n return toArabicNumerals(moment(date).utc().format(\"MMM YYYY\"));\n}\n","export function setWindowTitle(title: string) {\n window.document.title = title;\n}\n","interface Point {\n x: number;\n y: number;\n}\n\ninterface Rectangle {\n left: number;\n top: number;\n right: number;\n bottom: number;\n}\n\nexport function isPointInRect(\n { x, y }: Point,\n { left, top, right, bottom }: Rectangle\n) {\n if (x >= left && x <= right && y >= top && y <= bottom) {\n return true;\n }\n\n return false;\n}\n","export function shareOnFacebook(url: string) {\n const u = `https://www.facebook.com/sharer/sharer.php?u=${url}`;\n window.open(u, \"_blank_fb_share\");\n}\n","export const TOKEN_WORD = \"WORD\";\nexport const TOKEN_INT = \"INT\";\nexport const TOKEN_FLOAT = \"FLOAT\";\nexport const TOKEN_SPACE = \"SPACE\";\nexport const TOKEN_COMMA = \"COMMA\";\nexport const TOKEN_DOT = \"DOT\";\nexport const TOKEN_BRACKET_BEGIN = \"BRACKET_BEGIN\";\nexport const TOKEN_BRACKET_END = \"BRACKET_END\";\nexport const TOKEN_SINGLE_QUOTE = \"'\";\nexport const TOKEN_DOUBLE_QUOTE = '\"';\nexport const TOKEN_NEW_LINE = \"NEW_LINE\";\nexport const TOKEN_UNKNOWN = \"UNKNOWN\";\n\nconst reList: Array<[TokenType, RegExp]> = [\n [TOKEN_WORD, RegExp(/^[-'a-zA-Z]+/)],\n [TOKEN_FLOAT, RegExp(/^[0-9]+\\.[0-9]+/)],\n [TOKEN_INT, RegExp(/^[0-9]+/)],\n [TOKEN_SPACE, RegExp(/^ /)],\n [TOKEN_DOT, RegExp(/^\\./)],\n [TOKEN_COMMA, RegExp(/^,/)],\n [TOKEN_BRACKET_BEGIN, RegExp(/^\\(/)],\n [TOKEN_BRACKET_END, RegExp(/^\\)/)],\n [TOKEN_SINGLE_QUOTE, RegExp(/'/)],\n [TOKEN_DOUBLE_QUOTE, RegExp(/\"/)],\n [TOKEN_NEW_LINE, RegExp(/\\n/)],\n [TOKEN_UNKNOWN, RegExp(/./)],\n];\n\nexport type TokenType =\n | \"WORD\"\n | \"INT\"\n | \"FLOAT\"\n | \"SPACE\"\n | \"COMMA\"\n | \"DOT\"\n | \"BRACKET_BEGIN\"\n | \"BRACKET_END\"\n | \"'\"\n | '\"'\n | \"NEW_LINE\"\n | \"UNKNOWN\";\n\nexport function findTokens(\n text: string,\n list: Array<{\n type: TokenType;\n value: string;\n }>\n) {\n for (let i = 0; i < reList.length; i += 1) {\n const [type, re] = reList[i];\n const found = text.match(re);\n if (found) {\n list.push({ type, value: found[0] });\n findTokens(text.substr(found[0].length), list);\n }\n }\n\n return list;\n}\n","export * from './tokens'\n\nexport const LANG_ENG = 'eng'\nexport const LANG_URD = 'urd'\n","import React, { DragEventHandler } from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport styled from \"styled-components\";\nimport {\n COLORS,\n TYPE_INFO,\n CLR_BLACK,\n CLR_GREY,\n CLR_LIGHTGREY,\n CLR_TRANSPARENT,\n} from \"./Colors\";\nimport { device } from \"../../helpers/style\";\nimport { addClass, fixArabicText, removeClass } from \"../../helpers\";\n\nconst { color, backgroundColor } = COLORS[TYPE_INFO];\n\nconst Container = styled.table`\n user-select: none;\n border-collapse: collapse;\n width: 100%;\n`;\n\nconst Heading = styled.th`\n padding: 0 20px 5px 0;\n border-bottom: 2px solid ${CLR_GREY};\n font-size: 20px;\n\n span {\n font-weight: 500;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n }\n\n @media ${device.phone} {\n padding: 0 10px 8px 0px;\n } ;\n`;\n\nconst Head = styled.thead`\n text-align: right;\n`;\nconst HeadRow = styled.tr``;\n\ninterface TBodyProps {\n onDragOver?: DragEventHandler;\n onDragEnter?: DragEventHandler;\n onDragLeave?: DragEventHandler;\n onDragEnd?: DragEventHandler;\n}\nconst TBody = styled.tbody``;\n\ninterface BodyRowProps {\n index?: number;\n selected: boolean;\n draggable?: boolean;\n}\nconst BodyRow = styled.tr.attrs({\n index: (p: BodyRowProps) => p.index,\n})`\n position: relative;\n color: ${(p) => (p.selected ? color : CLR_BLACK)};\n background-color: ${(p) =>\n p.selected ? backgroundColor : CLR_TRANSPARENT};\n\n &:nth-child(2n) {\n background-color: ${(p) => (p.selected ? backgroundColor : \"#f5f5f5\")};\n }\n\n &:hover {\n background-color: ${(p) =>\n p.selected ? backgroundColor : CLR_LIGHTGREY};\n }\n\n &.drop {\n cursor: move;\n }\n\n &.drop * {\n background-color: ${backgroundColor};\n }\n\n & td:first-of-type:before {\n position: absolute;\n content: \" \";\n top: calc(50% - 8px);\n right: -24px;\n width: 0;\n height: 0;\n border-top: 8px solid transparent;\n border-bottom: 8px solid transparent;\n border-right: 8px solid transparent;\n }\n\n &:hover td:first-of-type:before {\n border-right-color: ${CLR_GREY};\n }\n`;\n\ninterface ItemProps {\n paddingRight?: number;\n isFocused?: boolean;\n}\nconst Item = styled.td`\n position: relative;\n border-bottom: 1px solid #e6e6e6;\n padding: 10px 20px;\n padding-right: ${(p) => (p.paddingRight ? p.paddingRight * 50 : 20)}px;\n font-size: 18px;\n font-weight: ${(p) => (p.isFocused ? 700 : 500)};\n\n [lang=\"ar\"] {\n font-size: 16px;\n }\n\n @media ${device.phone} {\n font-size: 15px;\n padding: 6px 10px 6px 0;\n padding-right: ${(p) => (p.paddingRight ? p.paddingRight * 30 : 20)}px;\n }\n`;\n\nexport type RowProps = Record;\nexport type RowPositions = Array<{ position: number; id: number }>;\ninterface TableProps {\n fields: string[];\n titles: string[];\n rows: Array;\n indent?: boolean;\n transform?: Record string>;\n focusedRowIndex?: number;\n width: string[];\n draggable?: boolean;\n rowId?: string;\n isSelected?: (row: RowProps) => boolean;\n onRowClick: (row: RowProps) => void;\n onDragEnd?: (positions: RowPositions) => void;\n}\ntype DraggedElement = HTMLElement | null;\nexport class Table extends React.Component {\n private dragged: DraggedElement;\n\n constructor(props: TableProps) {\n super(props);\n this.dragged = null;\n }\n\n head() {\n const { titles } = this.props;\n return (\n \n \n {titles.map((messageId: string) => (\n \n \n \n ))}\n \n \n );\n }\n\n col(\n field: string,\n value: string | number,\n rowNum: number,\n colNum: number,\n row: RowProps\n ) {\n const { indent, transform, focusedRowIndex } = this.props;\n let v = value;\n\n if (\n transform &&\n transform[field] &&\n typeof transform[field] === \"function\"\n ) {\n v = transform[field](value);\n }\n\n if (colNum === 0 && indent) {\n return (\n \n );\n }\n\n return (\n \n );\n }\n\n getTR(evt: React.DragEvent): DraggedElement {\n const node = evt.target as HTMLElement;\n if (!node) {\n return null;\n }\n\n if (node.nodeName.toLowerCase() === \"tr\") {\n return node as HTMLElement;\n }\n\n return node.parentNode as HTMLElement;\n }\n\n onDragStart = (evt: React.DragEvent) => {\n if (evt.dataTransfer) {\n evt.dataTransfer.effectAllowed = \"move\";\n this.dragged = this.getTR(evt);\n }\n };\n\n onDragOver = (evt: React.DragEvent) => {\n evt.preventDefault();\n\n const target = this.getTR(evt);\n addClass(target as HTMLElement, \"drop\");\n };\n\n onDragEnter = (evt: React.DragEvent) => {\n evt.preventDefault();\n };\n\n onDragLeave = (evt: React.DragEvent) => {\n const target = this.getTR(evt);\n removeClass(target as HTMLElement, \"drop\");\n };\n\n onDrop = (evt: React.DragEvent) => {\n if (!this.dragged) {\n return;\n }\n\n const d = this.dragged;\n const parent = (d.nodeName.toLowerCase() === \"tr\"\n ? d.parentNode\n : d) as HTMLElement;\n\n const target = this.getTR(evt);\n if (!target) {\n return;\n }\n\n removeClass(target as HTMLElement, \"drop\");\n if (target.nextSibling === null) {\n parent.insertBefore(this.dragged, target.nextSibling);\n } else {\n console.log(\"this.dragged\", this.dragged, \"target\", target);\n if (this.dragged.nextSibling === target) {\n parent.insertBefore(this.dragged, target.nextSibling);\n } else {\n parent.insertBefore(this.dragged, target);\n }\n }\n\n const rows = parent.querySelectorAll(\"tr\");\n\n let positions: RowPositions = [];\n for (let i = 0; i < rows.length; i += 1) {\n positions.push({\n position: i + 1,\n id: parseInt(rows[i].dataset.index!),\n });\n }\n\n if (this.props.onDragEnd) {\n this.props.onDragEnd(positions);\n }\n };\n\n onDragEnd = (_evt: React.DragEvent) => {\n this.dragged = null;\n };\n\n row(row: RowProps, rowNum: number) {\n const { fields, isSelected, onRowClick, draggable, rowId } = this.props;\n const selected = isSelected ? isSelected(row) : false;\n\n if (draggable) {\n const index = rowId ? row[rowId] : undefined;\n return (\n onRowClick(row)}\n selected={selected}\n draggable={draggable}\n onDragStart={this.onDragStart}\n onDrop={this.onDrop}\n >\n {fields.map((field, j: number) =>\n this.col(field, row[field], rowNum, j, row)\n )}\n \n );\n }\n\n return (\n onRowClick(row)}\n >\n {fields.map((field, j: number) =>\n this.col(field, row[field], rowNum, j, row)\n )}\n \n );\n }\n\n body() {\n const { rows, draggable } = this.props;\n\n if (draggable) {\n return (\n \n {rows.map((row, i: number) => this.row(row, i))}\n \n );\n }\n\n return {rows.map((row, i: number) => this.row(row, i))};\n }\n\n width() {\n return (\n \n {this.props.width.map((w: string, i: number) => (\n \n ))}\n \n );\n }\n\n render() {\n return (\n \n {this.width()}\n {this.head()}\n {this.body()}\n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { i18n } from \"../../services\";\nimport { device } from \"../../helpers/style\";\n\nconst Container = styled.div``;\nconst Titles = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n color: #999;\n background-color: #ebebeb;\n`;\nconst Title = styled.div<{\n isActive: boolean;\n}>`\n border-bottom: 2px solid #000;\n color: ${(p) => (p.isActive ? \"#fff\" : \"#000\")};\n background-color: ${(p) => (p.isActive ? \"#000\" : \"#fff\")};\n user-select: none;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n flex: 1;\n padding: 10px 0;\n font-size: 18px;\n font-weight: 500;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n\n @media ${device.phone} {\n font-size: 16px;\n } ;\n`;\n\ninterface TabsProps {\n titles: string[];\n activeTab: string;\n onSelect: (name: string) => void;\n}\nexport class Tabs extends React.Component {\n titles() {\n return (\n \n {this.props.titles.map((name) => (\n this.props.onSelect(name)}\n >\n {i18n.get(`tab.${name}`)}\n \n ))}\n \n );\n }\n\n render() {\n return (\n \n {this.titles()}\n {this.props.children}\n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { device } from \"../../helpers/style\";\n\nconst LEFT_TOP = \"left-top\";\nconst LEFT_BOTTOM = \"left-bottom\";\nconst RIGHT_TOP = \"right-top\";\nconst RIGHT_BOTTOM = \"right-bottom\";\ntype ANCHOR_POSITION =\n | \"left-top\"\n | \"left-bottom\"\n | \"right-top\"\n | \"right-bottom\";\n\nconst OFFSET = 7;\n\nconst Container = styled.div`\n position: relative;\n`;\nconst InnerContainer = styled.div`\n z-index: 100;\n user-select: none;\n position: absolute;\n border-radius: 3px;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n color: #fff;\n background-color: #000;\n white-space: nowrap;\n\n & > div {\n flex: 1;\n }\n\n @media ${device.phone} {\n display: none;\n }\n`;\n\nconst Contents = styled.div`\n display: flex;\n flex-direction: row;\n height: 31px;\n line-height: 31px;\n`;\n\nconst RTL = styled.div`\n display: flex;\n font-size: 18px;\n line-height: 26px;\n`;\n\nconst LTR = styled.div`\n display: flex;\n padding: 0 8px;\n font-size: 18px;\n font-family: \"Source Code Pro\", monospace;\n font-weight: 500;\n background-color: #4d8cf5;\n color: #fff;\n\n &:empty {\n display: none;\n }\n`;\n\ninterface LeftProps {\n right: number;\n top: number;\n hasLTR: boolean;\n}\nconst Left = styled(InnerContainer)`\n right: ${(p: LeftProps) => p.right}px;\n top: ${(p: LeftProps) => p.top}px;\n padding: ${(p: LeftProps) => (p.hasLTR ? \"0 10px 0 0\" : \"0 10px 0 10px\")};\n\n &:after {\n position: absolute;\n content: \" \";\n width: 0;\n height: 0;\n }\n\n & ${Contents} {\n flex-direction: row;\n }\n\n & ${LTR} {\n margin: 0 10px 0 0;\n }\n`;\n\nconst LeftTop = styled(Left)`\n border-bottom-right-radius: 0;\n\n &:after {\n right: -${OFFSET}px;\n bottom: 0;\n border-bottom: solid ${OFFSET}px #000;\n border-right: solid ${OFFSET}px transparent;\n }\n`;\n\nconst LeftBottom = styled(Left)`\n border-top-right-radius: 0;\n\n &:after {\n right: -${OFFSET}px;\n top: 0;\n border-top: solid ${OFFSET}px #000;\n border-right: solid ${OFFSET}px transparent;\n }\n`;\n\ninterface RightProps {\n left: number;\n top: number;\n hasLTR: boolean;\n}\n\nconst Right = styled(InnerContainer)`\n left: ${(p: RightProps) => p.left}px;\n top: ${(p: RightProps) => p.top}px;\n\n &:after {\n position: absolute;\n content: \" \";\n width: 0;\n height: 0;\n }\n\n & ${Contents} {\n flex-direction: row-reverse;\n }\n\n & ${LTR} {\n margin: 0 0 0 10px;\n }\n\n & ${RTL} {\n padding-left: 10px;\n }\n`;\n\nconst RightTop = styled(Right)`\n border-bottom-left-radius: 0;\n\n &:after {\n left: -${OFFSET}px;\n bottom: 0;\n border-bottom: solid ${OFFSET}px #000;\n border-left: solid ${OFFSET}px transparent;\n }\n`;\n\nconst RightBottom = styled(Right)`\n border-top-left-radius: 0;\n\n &:after {\n left: -${OFFSET}px;\n top: 0;\n border-top: solid ${OFFSET}px #000;\n border-left: solid ${OFFSET}px transparent;\n }\n`;\n\ninterface TipProps {\n text: string;\n anchor: ANCHOR_POSITION;\n ltr?: string;\n}\ninterface TipState {\n show: boolean;\n}\nexport class Tip extends React.Component {\n private containerRef: React.RefObject;\n\n constructor(props: TipProps) {\n super(props);\n\n this.state = {\n show: false,\n };\n\n this.containerRef = React.createRef();\n }\n\n onMouseOver = () => this.setState({ show: true });\n onMouseOut = () => this.setState({ show: false });\n\n contents() {\n const { text, ltr } = this.props;\n return (\n \n {text}\n {ltr}\n \n );\n }\n\n view() {\n if (!this.state.show) {\n return null;\n }\n\n const r = this.containerRef;\n if (!r || !r.current) {\n return null;\n }\n\n const width = r.current.offsetWidth;\n const height = r.current.offsetHeight;\n const { anchor, ltr } = this.props;\n const hasLTR = !!ltr;\n\n if (anchor === LEFT_TOP) {\n return (\n \n {this.contents()}\n \n );\n } else if (anchor === LEFT_BOTTOM) {\n return (\n \n {this.contents()}\n \n );\n } else if (anchor === RIGHT_TOP) {\n return (\n \n {this.contents()}\n \n );\n } else if (anchor === RIGHT_BOTTOM) {\n return (\n \n {this.contents()}\n \n );\n }\n\n return null;\n }\n\n render() {\n return (\n }\n onMouseOver={this.onMouseOver}\n onMouseOut={this.onMouseOut}\n >\n {this.props.children}\n {this.view()}\n \n );\n }\n}\n","export const CHARS_URDU: Array = [\n \"ا\",\n \"آ\",\n \"آ\",\n \"أ\",\n \"ب\",\n \"پ\",\n \"ت\",\n \"ٹ\",\n \"ث\",\n \"ج\",\n \"چ\",\n \"ح\",\n \"خ\",\n \"د\",\n \"ڈ\",\n \"ذ\",\n \"ر\",\n \"ڑ\",\n \"ز\",\n \"ژ\",\n \"س\",\n \"ش\",\n \"ص\",\n \"ض\",\n \"ط\",\n \"ظ\",\n \"ع\",\n \"غ\",\n \"ف\",\n \"ق\",\n \"ک\",\n \"گ\",\n \"ل\",\n \"م\",\n \"ن\",\n \"ں\",\n \"و\",\n \"ؤ\",\n \"ه\",\n \"ہ\",\n \"ۂ\",\n \"ھ\",\n \"ء\",\n \"ی\",\n \"ئ\",\n \"ے\",\n \"ً\",\n \"َ\",\n \"ِ\",\n \"ُ\",\n];\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div`\n user-select: none;\n position: relative;\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n padding-top: 44px;\n`;\n\nconst Placeholder = styled.div<{ focused: boolean }>`\n pointer-events: none;\n user-select: none;\n position: absolute;\n top: ${(p) => (p.focused ? 13 : 30)}px;\n transition: all 0.2s;\n color: ${(p) => (p.focused ? \"#000\" : \"#dcdbdc\")};\n font-size: ${(p) => (p.focused ? 12 : 16)}px;\n`;\n\nconst Pill = styled.div<{ selected: boolean }>`\n cursor: pointer;\n padding: 0 16px;\n border-radius: 3px;\n font-size: 15px;\n white-space: nowrap;\n height: 26px;\n line-height: 22px;\n text-decoration: none;\n transition: all 0.2s ease-in-out;\n margin: 0 0 5px 5px;\n font-weight: 500;\n color: ${(p) => (p.selected ? \"#fff\" : \"#7e7e7e\")};\n background-color: ${(p) => (p.selected ? \"#000\" : \"#e8e8e8\")};\n border: 1px solid ${(p) => (p.selected ? \"#000\" : \"#d8d8d8\")};\n\n &:hover {\n border-color: #000;\n }\n`;\n\ninterface PillsProps {\n placeholder: string;\n id: string;\n name: string;\n value: string[];\n labels: string[];\n values: string[];\n onChange: (name: string, value: string[]) => void;\n}\nexport class Pills extends React.Component {\n state = {\n focused: false,\n };\n\n placeholder() {\n return (\n {this.props.placeholder}\n );\n }\n\n onChange = (val: string) => {\n const { name, value, onChange } = this.props;\n\n let update;\n if (!value.includes(val)) {\n update = value.slice();\n update.push(val);\n } else {\n update = value.filter((v) => v !== val);\n }\n\n onChange(name, update);\n };\n\n render() {\n const { value, labels, values } = this.props;\n\n return (\n \n {this.placeholder()}\n {values.map((v, i) => (\n this.onChange(v)}\n >\n {labels[i]}\n \n ))}\n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\ntype TextAlign = \"left\" | \"center\" | \"right\";\nconst Container = styled.div<{\n margin: string;\n textAlign?: TextAlign;\n fullWidth: boolean;\n}>`\n position: relative;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n\n & input {\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n outline: none;\n font-family: urdu, sans-serif;\n font-weight: 500;\n font-size: 18px;\n margin: ${(p) => p.margin};\n text-align: ${(p) => p.textAlign || \"right\"};\n\n &:focus {\n border-bottom-color: #000;\n }\n\n &[type=\"email\"] {\n font-size: 18px;\n font-family: Roboto, sans-serif;\n }\n }\n\n input {\n background-color: transparent;\n }\n`;\n\nconst ReadOnlyField = styled.div<{ fullWidth: boolean }>`\n user-select: none;\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n outline: none;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n font-weight: 500;\n font-size: 18px;\n margin-top: 26px;\n line-height: 36px;\n`;\n\nconst Placeholder = styled.div<{ focused: boolean }>`\n pointer-events: none;\n user-select: none;\n position: absolute;\n top: ${(p) => (p.focused ? 13 : 30)}px;\n transition: all 0.2s;\n color: ${(p) => (p.focused ? \"#000\" : \"#dcdbdc\")};\n font-size: ${(p) => (p.focused ? 12 : 16)}px;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n`;\n\nconst PlaceholderRight = styled(Placeholder)`\n right: 0;\n`;\n\nconst PlaceholderLeft = styled(Placeholder)`\n width: 100%;\n text-align: left;\n`;\n\nconst PlaceholderCenter = styled(Placeholder)`\n width: 100%;\n text-align: center;\n`;\n\nconst FocusLineContainer = styled.div`\n pointer-events: none;\n user-select: none;\n position: absolute;\n bottom: 0px;\n height: 1px;\n width: 100%;\n background-color: transparent;\n`;\nconst FocusLine = styled.div<{ focused: boolean }>`\n position: relative;\n margin: 0 auto;\n height: 1px;\n width: ${(p) => (p.focused ? 100 : 0)}%;\n background-color: ${(p) => (p.focused ? \"#000\" : \"#dcdbdc\")};\n`;\n\ninterface InputProps {\n name: string;\n value: string;\n type?: string;\n placeholder: string;\n textAlign?: TextAlign;\n readOnly?: boolean;\n margin?: string;\n fullWidth: boolean;\n focusOnLoad?: boolean;\n\n onChange: (name: string, value: string) => void;\n onKeyUp?: (evt: React.KeyboardEvent) => void;\n}\ninterface InputState {\n focused: boolean;\n}\nexport class Input extends React.Component {\n private field: React.RefObject;\n\n constructor(props: InputProps) {\n super(props);\n this.field = React.createRef();\n this.state = {\n focused: false,\n };\n }\n\n componentDidMount() {\n const c = this.field.current;\n if (c && !this.props.readOnly && this.props.focusOnLoad) {\n c.focus();\n }\n }\n\n focus = () => {\n const f = this.field;\n if (f && f.current) {\n f.current.focus();\n }\n };\n\n onBlur = () => this.setState({ focused: false });\n onFocus = () => this.setState({ focused: true });\n onChange = (evt: React.ChangeEvent) =>\n this.props.onChange(this.props.name, evt.target.value);\n\n placeholder() {\n const { focused } = this.state;\n const { value, placeholder, textAlign } = this.props;\n\n const f = focused || (!!value && value.length > 0);\n\n if (textAlign === \"left\") {\n return {placeholder};\n } else if (textAlign === \"center\") {\n return (\n {placeholder}\n );\n }\n\n return {placeholder};\n }\n\n placeholderLine() {\n const { focused } = this.state;\n if (!focused) {\n return null;\n }\n\n return (\n \n \n \n );\n }\n\n render() {\n const {\n value,\n type,\n margin,\n fullWidth,\n readOnly,\n textAlign,\n } = this.props;\n\n return (\n \n {this.placeholder()}\n {this.placeholderLine()}\n {readOnly && (\n {value}\n )}\n {!readOnly && (\n \n )}\n \n );\n }\n}\n","import React from \"react\";\nimport { i18n } from \"../../services\";\nimport { EVT_MOUSEDOWN } from \"../../lib\";\nimport styled from \"styled-components\";\nimport { isPointInRect } from \"../../helpers\";\n\nconst Container = styled.div<{ fullWidth: boolean }>`\n position: relative;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n`;\n\nconst Placeholder = styled.div<{ margin: string }>`\n margin: ${(p) => p.margin};\n font-family: urdu;\n font-weight: 500;\n font-size: 12px;\n`;\n\nconst Value = styled.div<{ fullWidth: boolean; open: boolean }>`\n user-select: none;\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n outline: none;\n font-family: urdu;\n font-weight: 500;\n font-size: 18px;\n\n &:hover {\n border-bottom-color: ${(p) => (p.open ? \"#dcdbdc\" : \"#000\")};\n }\n\n &:after {\n display: ${(p) => (p.open ? \"none\" : \"block\")};\n position: absolute;\n content: \" \";\n left: 10px;\n bottom: 13px;\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-top: 5px solid #000;\n }\n\n &:before {\n display: ${(p) => (p.open ? \"block\" : \"none\")};\n position: absolute;\n content: \" \";\n left: 10px;\n bottom: 13px;\n width: 0;\n height: 0;\n border-left: 5px solid transparent;\n border-right: 5px solid transparent;\n border-bottom: 5px solid #000;\n }\n`;\n\nconst List = styled.div<{ top: number; fullWidth: boolean; open: boolean }>`\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n z-index: 50;\n position: absolute;\n display: ${(p) => (p.open ? \"block\" : \"none\")};\n top: ${(p) => p.top}px;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n max-height: 250px;\n overflow-x: hidden;\n overflow-y: auto;\n color: #fff;\n background-color: #000;\n`;\n\nconst Item = styled.div<{ isActive: boolean; fullWidth: boolean }>`\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n user-select: none;\n padding: 3px 0;\n cursor: ${(p) => (p.isActive ? \"not-allowed\" : \"default\")};\n pointer-events: ${(p) => (p.isActive ? \"none\" : \"auto\")};\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n background-color: ${(p) => (p.isActive ? \"#333\" : \"transparent\")};\n\n &:hover {\n background-color: #333;\n }\n`;\n\nconst Text = styled.div<{ hasIndent: boolean }>`\n font-family: urdu;\n font-weight: 500;\n padding-right: ${(p) => (p.hasIndent ? 10 : 15)}px;\n`;\n\nconst INDENT_OFFSET = 36;\nconst INDENT_PADDING = 15;\n\nconst IndentMark = styled.div<{ amount: number }>`\n position: relative;\n margin-right: ${(p) => (p.amount - 1) * INDENT_OFFSET + INDENT_PADDING}px;\n width: ${INDENT_OFFSET}px;\n border-bottom: 1px solid #fff;\n margin-bottom: 10px;\n`;\n\ninterface SelectProps {\n id: string;\n name: string;\n value: string;\n labels: string[];\n values: string[];\n margin?: string;\n fullWidth: boolean;\n placeholder?: string;\n indents?: Array;\n\n onChange: (name: string, value: string) => void;\n}\ninterface SelectState {\n open: boolean;\n}\nexport class Select extends React.Component {\n private fieldValue: React.RefObject;\n private elmList: React.RefObject;\n\n constructor(props: SelectProps) {\n super(props);\n\n this.fieldValue = React.createRef();\n this.elmList = React.createRef();\n\n this.state = {\n open: false,\n };\n }\n\n componentDidMount() {\n window.addEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n onMouseDown = (evt: MouseEvent) => {\n if (!this.state.open || !this.elmList) {\n return;\n }\n\n const c = this.elmList.current;\n if (!c) {\n return;\n }\n\n if (\n !isPointInRect(\n { x: evt.clientX, y: evt.clientY },\n c.getBoundingClientRect()\n )\n ) {\n setTimeout(() => this.setState({ open: false }), 250);\n }\n };\n\n toggleOpen = () => this.setState({ open: !this.state.open });\n\n onSelect = (v: string) => {\n this.props.onChange(this.props.name, v);\n this.setState({ open: false });\n };\n\n list = () => {\n const {\n id,\n name,\n value,\n values,\n labels,\n indents,\n fullWidth,\n } = this.props;\n\n return values.map((v, i) => {\n const relativeIndex = values.indexOf(v);\n const indent =\n typeof indents !== \"undefined\" ? indents[relativeIndex] : 0;\n const label =\n typeof labels !== \"undefined\"\n ? labels[i]\n : i18n.get(`${id}Form.${name}${v}`);\n\n return (\n this.onSelect(v)}\n >\n {indent > 0 && }\n 0}>{label}\n \n );\n });\n };\n\n render() {\n const {\n id,\n name,\n value,\n labels,\n values,\n margin,\n fullWidth,\n placeholder,\n } = this.props;\n\n const valueLabel =\n typeof labels !== \"undefined\"\n ? labels[values.indexOf(value)]\n : i18n.get(`${id}Form.${name}${value}`);\n\n let listTop = 0;\n const f = this.fieldValue;\n if (!!f && !!f.current) {\n listTop = f.current.offsetTop + f.current.offsetHeight;\n }\n\n return (\n \n \n {placeholder}\n \n \n {valueLabel}\n \n \n {this.list()}\n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div<{ fullWidth: boolean; margin: string }>`\n position: relative;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n\n & textarea {\n overflow: hidden;\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n margin: ${(p) => p.margin};\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n height: auto;\n min-height: 80px;\n outline: none;\n font-family: urdu;\n font-weight: 500;\n font-size: 18px;\n line-height: 150%;\n\n &:focus {\n border-bottom-color: #000;\n }\n }\n`;\n\nconst ReadOnlyField = styled.div<{ fullWidth: boolean }>`\n user-select: none;\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n outline: none;\n font-family: urdu, QuranFont;\n font-weight: 500;\n font-size: 18px;\n margin-top: 26px;\n line-height: 36px;\n`;\n\nconst Placeholder = styled.div<{ focused: boolean }>`\n pointer-events: none;\n user-select: none;\n position: absolute;\n right: 0;\n top: ${(p) => (p.focused ? 13 : 30)}px;\n transition: all 0.2s;\n color: ${(p) => (p.focused ? \"#000\" : \"#dcdbdc\")};\n font-size: ${(p) => (p.focused ? 12 : 16)}px;\n`;\n\nconst FocusLineContainer = styled.div`\n pointer-events: none;\n user-select: none;\n position: absolute;\n bottom: 30px;\n height: 1px;\n width: 100%;\n background-color: transparent;\n`;\nconst FocusLine = styled.div<{ focused: boolean }>`\n position: relative;\n margin: 0 auto;\n height: 1px;\n width: ${(p) => (p.focused ? 100 : 0)}%;\n background-color: ${(p) => (p.focused ? \"#000\" : \"#dcdbdc\")};\n`;\n\ninterface TextAreaProps {\n placeholder: string;\n name: string;\n value: string;\n margin?: string;\n fullWidth: boolean;\n readOnly: boolean;\n focusOnLoad: boolean;\n\n onChange: (name: string, value: string) => void;\n onKeyUp: (evt: React.KeyboardEvent) => void;\n}\ninterface TextAreaState {\n focused: boolean;\n}\nexport class TextArea extends React.Component {\n private field: React.RefObject;\n constructor(props: TextAreaProps) {\n super(props);\n this.field = React.createRef();\n this.state = {\n focused: false,\n };\n }\n\n componentDidMount() {\n const c = this.field.current;\n if (c && this.props.value.length > 0) {\n c.style.height = `${c.scrollHeight}px`;\n }\n\n if (c && !this.props.readOnly && this.props.focusOnLoad) {\n c.focus();\n }\n }\n\n focus = () => {\n if (this.field && this.field.current) {\n this.field.current.focus();\n }\n };\n\n onBlur = () => this.setState({ focused: false });\n onFocus = () => this.setState({ focused: true });\n onChange = (evt: React.ChangeEvent) => {\n this.props.onChange(this.props.name, evt.target.value);\n\n if (this.field && this.field.current) {\n const c = this.field.current;\n c.style.height = \"auto\";\n c.style.height = `${c.scrollHeight}px`;\n }\n }\n\n placeholder() {\n const { focused } = this.state;\n const { value, placeholder } = this.props;\n\n const f = focused || (value !== null && value.length > 0);\n return {placeholder};\n }\n\n placeholderLine() {\n const { focused } = this.state;\n if (focused) {\n return null;\n }\n\n return (\n \n \n \n );\n }\n\n render() {\n const { value, margin, fullWidth, readOnly } = this.props;\n\n return (\n \n {this.placeholder()}\n {this.placeholderLine()}\n {readOnly && (\n {value}\n )}\n {!readOnly && (\n \n )}\n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div<{\n fullWidth: boolean;\n hasPreview: boolean;\n margin?: string;\n}>`\n cursor: pointer;\n position: relative;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n\n & input {\n display: none;\n border: 0;\n border-bottom: 1px solid #dcdbdc;\n width: ${(p) => (p.fullWidth ? \"100%\" : \"auto\")};\n outline: none;\n font-family: urdu;\n font-weight: 500;\n font-size: 18px;\n margin: ${(p) => p.margin || \"40px 0 0 0\"};\n\n &:focus {\n border-bottom-color: #000;\n }\n }\n\n & svg {\n margin-top: ${(p) => (p.hasPreview ? 15 : 40)}px;\n }\n`;\n\nconst Icon = () => (\n \n \n \n \n);\n\nconst PreviewLink = styled.a`\n display: block;\n width: 100%;\n margin: 40px auto 0 auto;\n text-align: center;\n`;\nconst PreviewImg = styled.img`\n max-width: 100%;\n`;\nfunction Preview({ src }: Record<\"src\", string>) {\n return (\n \n \n \n );\n}\n\nconst Placeholder = styled.div`\n pointer-events: none;\n user-select: none;\n margin-top: 15px;\n margin-bottom: 15px;\n color: #000;\n font-size: 16px;\n`;\n\ninterface FileInputProps {\n placeholder: string;\n name: string;\n value: string;\n margin?: string;\n accept: string;\n readOnly: boolean;\n focusOnLoad: boolean;\n fullWidth: boolean;\n onChange: (name: string, file: File) => void;\n}\ninterface FileInputState {\n preview: string | null;\n}\nexport class FileInput extends React.Component {\n private field: React.RefObject;\n\n constructor(props: FileInputProps) {\n super(props);\n this.field = React.createRef();\n this.state = {\n preview: null,\n };\n }\n\n componentDidMount() {\n const c = this.field.current;\n if (c && this.props.readOnly && this.props.focusOnLoad) {\n c.focus();\n }\n }\n\n onChange = (evt: React.ChangeEvent) => {\n const { files } = evt.target;\n if (!files || files.length === 0) {\n return;\n }\n\n const file = files[0];\n if (!file) {\n return;\n }\n\n const { type, size } = file;\n if ([\"image/jpeg\", \"image/png\"].includes(type)) {\n const kbSize = size / 1000;\n const maxSize = 1000.0;\n if (kbSize <= maxSize) {\n this.setState({ preview: URL.createObjectURL(file) });\n this.props.onChange(this.props.name, file);\n }\n }\n };\n\n placeholder() {\n const { placeholder } = this.props;\n return {placeholder};\n }\n\n onClick = () => {\n if (this.field && this.field.current) {\n this.field.current.click();\n }\n };\n\n render() {\n const { preview } = this.state;\n const { margin, fullWidth, accept, value } = this.props;\n\n const hasPreview = !!value || !!preview;\n\n return (\n \n {hasPreview && (\n \n )}\n\n \n {this.placeholder()}\n\n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\n\nconst Wrapper = styled.ul`\n margin: 20px 0 10px 0;\n padding: 15px;\n width: 100%;\n color: #ff9bac;\n list-style-type: none;\n`;\n\nconst ErrorWrapper = styled.li`\n position: relative;\n\n &:before {\n content: \"\\u25CB\";\n position: absolute;\n right: -25px;\n top: 3px;\n }\n`;\nconst Error = ({ message }: { message: string }) => (\n \n \n \n);\n\ninterface ValidationErrorsProps {\n show: boolean;\n errors: Array;\n}\nexport class ValidationErrors extends React.Component {\n render() {\n const { show, errors } = this.props;\n\n if (!show) {\n return null;\n }\n\n return (\n \n {errors.map((m) => (\n \n ))}\n \n );\n }\n}\n","import React from \"react\";\nimport { eventEmitter } from \"../../services\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\nimport { COLORS, TYPE_INFO } from \"../ui/Colors\";\nimport { NOTIFICATION_SET, NOTIFICATION_CLEAR } from \"../dialogs/Notification\";\n\nconst Wrapper = styled.div<{\n margin?: string;\n type: string;\n}>`\n width: 100%;\n font-size: 14px;\n margin: ${(p) => p.margin || \"20px 0 40px 0\"};\n padding: 10px 15px;\n border-radius: 2px;\n border: 1px solid ${(p) => COLORS[p.type][\"borderColor\"]};\n background-color: ${(p) => COLORS[p.type][\"backgroundColor\"]};\n color: ${(p) => COLORS[p.type][\"color\"]};\n text-align: center;\n`;\n\ninterface NotificationProps {\n margin?: string;\n}\ninterface NotificationState {\n type: string;\n messageId: string;\n}\nexport class Notification extends React.Component<\n NotificationProps,\n NotificationState\n> {\n constructor(props: NotificationProps) {\n super(props);\n this.state = {\n type: TYPE_INFO,\n messageId: \"\",\n };\n }\n\n onNotificationSet = ({ type, messageId }: NotificationState) =>\n this.setState({ type, messageId });\n\n onNotificationClear = () =>\n this.setState({\n type: TYPE_INFO,\n messageId: \"\",\n });\n\n componentDidMount() {\n eventEmitter.on(NOTIFICATION_SET, this.onNotificationSet);\n eventEmitter.on(NOTIFICATION_CLEAR, this.onNotificationClear);\n }\n\n componentWillUnmount() {\n eventEmitter.off(NOTIFICATION_SET, this.onNotificationSet);\n eventEmitter.off(NOTIFICATION_CLEAR, this.onNotificationClear);\n }\n\n render() {\n const { type, messageId } = this.state;\n if (\n !messageId ||\n (typeof messageId === \"string\" && messageId.length === 0)\n ) {\n return null;\n }\n\n const { margin } = this.props;\n return (\n \n \n \n );\n }\n}\n","export const KEY_BACKSPACE = \"Backspace\";\nexport const KEY_TAB = \"Tab\";\nexport const KEY_ENTER = \"Enter\";\nexport const KEY_SHIFT = \"Shift\";\nexport const KEY_CTRL = \"Control\";\nexport const KEY_ALT = \"Alt\";\nexport const KEY_PAUSE_BREAK = \"Pause/Break\";\nexport const KEY_CAPS_LOCK = \"CapsLock\";\nexport const KEY_ESC = \"Escape\";\nexport const KEY_SPACE = \" \";\nexport const KEY_PAGE_UP = \"PageUp\";\nexport const KEY_PAGE_DOWN = \"PageDown\";\nexport const KEY_END = \"End\";\nexport const KEY_HOME = \"Home\";\nexport const KEY_LEFT_ARROW = \"ArrowLeft\";\nexport const KEY_UP_ARROW = \"ArrowUp\";\nexport const KEY_RIGHT_ARROW = \"ArrowRight\";\nexport const KEY_DOWN_ARROW = \"ArrowDown\";\nexport const KEY_INSERT = \"Insert\";\nexport const KEY_DELETE = \"Delete\";\n\nexport const KEY_0 = \"0\";\nexport const KEY_1 = \"1\";\nexport const KEY_2 = \"2\";\nexport const KEY_3 = \"3\";\nexport const KEY_4 = \"4\";\nexport const KEY_5 = \"5\";\nexport const KEY_6 = \"6\";\nexport const KEY_7 = \"7\";\nexport const KEY_8 = \"8\";\nexport const KEY_9 = \"9\";\n\nexport const KEY_NUMPAD_0 = \"Numpad 0\";\nexport const KEY_NUMPAD_1 = \"Numpad 1\";\nexport const KEY_NUMPAD_2 = \"Numpad 2\";\nexport const KEY_NUMPAD_3 = \"Numpad 3\";\nexport const KEY_NUMPAD_4 = \"Numpad 4\";\nexport const KEY_NUMPAD_5 = \"Numpad 5\";\nexport const KEY_NUMPAD_6 = \"Numpad 6\";\nexport const KEY_NUMPAD_7 = \"Numpad 7\";\nexport const KEY_NUMPAD_8 = \"Numpad 8\";\nexport const KEY_NUMPAD_9 = \"Numpad 9\";\n\nexport const KEY_MULTIPLY = \"Multiply\";\nexport const KEY_ADD = \"Add\";\nexport const KEY_SUBTRACT = \"Subtract\";\nexport const KEY_DECIMAL_POINT = \"Decimal Point\";\nexport const KEY_DIVIDE = \"Divide\";\n\nexport const KEY_A = \"A\";\nexport const KEY_B = \"B\";\nexport const KEY_C = \"C\";\nexport const KEY_D = \"D\";\nexport const KEY_E = \"E\";\nexport const KEY_F = \"F\";\nexport const KEY_G = \"G\";\nexport const KEY_H = \"H\";\nexport const KEY_I = \"I\";\nexport const KEY_J = \"J\";\nexport const KEY_K = \"K\";\nexport const KEY_L = \"L\";\nexport const KEY_M = \"M\";\nexport const KEY_N = \"N\";\nexport const KEY_O = \"O\";\nexport const KEY_P = \"P\";\nexport const KEY_Q = \"Q\";\nexport const KEY_R = \"R\";\nexport const KEY_S = \"S\";\nexport const KEY_T = \"T\";\nexport const KEY_U = \"U\";\nexport const KEY_V = \"V\";\nexport const KEY_W = \"W\";\nexport const KEY_X = \"X\";\nexport const KEY_Y = \"Y\";\nexport const KEY_Z = \"Z\";\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\nimport { submitIfEnter, validateForm } from \"../../helpers\";\n\nimport { Pills } from \"./Pills\";\nimport { Input } from \"./Input\";\nimport { Select } from \"./Select\";\nimport { TextArea } from \"./TextArea\";\nimport { FileInput } from \"./FileInput\";\n\nimport { TYPE_SECONDARY, Progress, TYPE_PRIMARY } from \"../ui\";\nimport { BTN_MEDIUM, Button, ButtonGroup } from \"./Button\";\nimport { ValidationErrors } from \"./ValidationErrors\";\nimport { Notification } from \"./Notification\";\nimport { i18n, notification, eventEmitter } from \"../../services\";\nimport pick from \"lodash/pick\";\nimport isUndefined from \"lodash/isUndefined\";\nimport isEqual from \"lodash.isequal\";\nimport { KEY_ENTER } from \"../keyboard/keys\";\nimport { Constraints } from \"../../components/Forms/types\";\n\nexport const FORM_CLEAR = \"form.clear\";\nexport const FORM_END_PROCESSING = \"form.endProcessing\";\n\nexport const TEXT_FIELD = \"text\";\nexport const PASSWORD_FIELD = \"password\";\nexport const EMAIL_FIELD = \"email\";\nexport const FILE_FIELD = \"file\";\nexport const TEXTAREA_FIELD = \"textarea\";\nexport const SELECT_FIELD = \"select\";\nexport const PILLS_FIELD = \"pills\";\n\nconst Container = styled.form`\n width: 100%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Heading = styled.h2`\n margin-bottom: 16px;\n width: 100%;\n text-align: center;\n\n span {\n font-weight: 500;\n }\n`;\n\nconst Description = styled.p<{\n dangerouslySetInnerHTML: {\n __html: string;\n };\n}>`\n margin-bottom: 20px;\n width: 100%;\n font-size: 17px;\n text-align: center;\n`;\n\ninterface FormProps {\n editing?: \"Edit\" | \"Create\";\n focusOnFirst: boolean;\n\n updateProp?: string;\n order: string[];\n\n fields: {\n [k: string]: Record;\n };\n\n constraints: Constraints;\n\n id: string;\n heading?: string;\n description?: {\n __html: string;\n };\n\n primaryBtnType?: string;\n\n [x: string]: any;\n\n onSubmit: (arg: Record) => void;\n onAlternate?: (evt: React.MouseEvent) => void;\n}\ninterface FormState {\n processing: boolean;\n showFormErrors: boolean;\n [x: string]: any;\n}\nexport class Form extends React.Component {\n private initialState: Record;\n\n constructor(props: FormProps) {\n super(props);\n\n const { order, fields } = props;\n const initialState: Record = {};\n\n // default values, supplied with fields\n order.forEach((k) => {\n initialState[k] = !isUndefined(fields[k][\"value\"])\n ? fields[k][\"value\"]\n : \"\";\n });\n\n // reducer supplied values\n const { updateProp } = props;\n if (updateProp) {\n const update = props[updateProp];\n if (update) {\n order.forEach((k) => {\n initialState[k] = !isUndefined(update.get(k))\n ? update.get(k)\n : initialState[k];\n });\n }\n }\n\n this.initialState = initialState;\n this.state = {\n ...initialState,\n ...this.additionalState(),\n };\n }\n\n additionalState = () => ({\n processing: false,\n showFormErrors: false,\n });\n\n componentDidMount() {\n eventEmitter.on(FORM_CLEAR, this.onFormClear);\n eventEmitter.on(FORM_END_PROCESSING, this.onFormEndProcessing);\n }\n\n componentWillUnmount() {\n eventEmitter.off(FORM_CLEAR, this.onFormClear);\n eventEmitter.off(FORM_END_PROCESSING, this.onFormEndProcessing);\n }\n\n componentWillReceiveProps(nextProps: FormProps) {\n this.setFields(nextProps);\n }\n\n setFields = (props: FormProps) => {\n if (!props.editing || !props.updateProp) {\n return;\n }\n\n const nextState: Record = {};\n const { order, updateProp } = props;\n const update = props[updateProp];\n\n if (update) {\n for (const k of order) {\n nextState[k] = !!update.get(k) ? update.get(k) : this.state[k];\n }\n }\n\n this.initialState = nextState;\n this.setState(nextState);\n };\n\n onFormEndProcessing = () => this.setState({ processing: false });\n onFormClear = () => {\n this.setState({\n ...this.initialState,\n ...this.additionalState(),\n });\n };\n\n restrictSubmitNodes = [\"textarea\"];\n onKeyUp = (\n evt: React.KeyboardEvent\n ) => {\n const t = evt.target;\n if (!t) {\n return;\n }\n\n const nodeName = (t as HTMLElement).nodeName.toLowerCase();\n if (\n this.restrictSubmitNodes.includes(nodeName) &&\n evt.key === KEY_ENTER\n ) {\n evt.stopPropagation();\n } else {\n submitIfEnter(evt, this.onSubmit);\n }\n };\n\n onChange = (key: string, value: any) => {\n notification.clear();\n this.setState({ [key]: value });\n };\n\n inputTypes = [TEXT_FIELD, PASSWORD_FIELD, EMAIL_FIELD];\n\n fields = () => {\n const { id, order, fields, focusOnFirst } = this.props;\n\n return order.map((name, index) => {\n const field = fields[name];\n const { type } = field;\n const fullWidth = field.fullWidth || true;\n\n const readOnly =\n typeof field.readOnly !== \"undefined\" ? field.readOnly : false;\n const focusOnLoad = focusOnFirst && index === 0;\n const value =\n typeof this.state[name] !== \"undefined\"\n ? this.state[name]\n : undefined;\n\n if (this.inputTypes.includes(type)) {\n return (\n \n );\n } else if (type === FILE_FIELD) {\n return (\n \n );\n } else if (type === TEXTAREA_FIELD) {\n return (\n \n );\n } else if (type === SELECT_FIELD) {\n const { values, labels, indents } = field;\n return (\n \n );\n } else if (type === PILLS_FIELD) {\n const { values, labels } = field;\n return (\n \n );\n }\n\n return null;\n });\n };\n\n buttons = () => {\n const { id, primaryBtnType, onAlternate } = this.props;\n\n return (\n \n \n\n {onAlternate && (\n \n )}\n \n );\n };\n\n formValidation = () => (\n \n );\n\n onSubmit = () => {\n if (this.state.processing) {\n return ;\n }\n\n notification.clear();\n\n const errors = validateForm(this.state, this.props.constraints);\n if (errors.length > 0) {\n return this.setState({ showFormErrors: true });\n }\n\n const modifiedState = pick(this.state, this.props.order);\n if (isEqual(this.initialState, modifiedState)) {\n return notification.set(\"form.unmodified\", \"i\");\n }\n\n this.setState({ processing: true });\n this.props.onSubmit(modifiedState);\n };\n\n appendMsg() {\n const { editing } = this.props;\n if (typeof editing === \"undefined\") {\n return \"\";\n }\n\n return editing ? \"Edit\" : \"Create\";\n }\n\n render() {\n if (this.state.processing) {\n return ;\n }\n\n const { id, heading, description } = this.props;\n\n return (\n \n \n\n {heading && (\n \n \n \n )}\n\n {description && (\n \n )}\n\n {this.formValidation()}\n {this.fields()}\n {this.buttons()}\n \n );\n }\n}\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div<{\n enabled: boolean;\n width: number;\n height: number;\n fontSize: number;\n}>`\n position: relative;\n border-radius: 50%;\n outline: none;\n font-family: urdu;\n font-weight: 500;\n font-size: ${(p) => p.fontSize}px;\n text-align: center;\n width: ${(p) => p.width}px;\n height: ${(p) => p.height}px;\n line-height: ${(p) => p.height}px;\n\n border: 1px solid #dcdbdc;\n color: ${(p) => (p.enabled ? \"#fff\" : \"#000\")};\n background-color: ${(p) => (p.enabled ? \"#000\" : \"#fff\")};\n`;\n\ninterface SwitchProps {\n name: string;\n enabled: boolean;\n messageId: string;\n fontSize?: number;\n width?: number;\n height?: number;\n onChange: (name: string, enabled: boolean) => void;\n}\ninterface SwitchState {\n enabled: boolean;\n}\nexport class Switch extends React.Component {\n constructor(props: SwitchProps) {\n super(props);\n this.state = {\n enabled: false,\n };\n }\n\n onClick = () => {\n this.setState({ enabled: !this.state.enabled }, () => {\n this.props.onChange(this.props.name, this.state.enabled);\n });\n };\n\n render() {\n const { enabled, messageId, fontSize, width, height } = this.props;\n\n return (\n \n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\n\nconst Container = styled.div`\n user-select: none;\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n text-decoration: none;\n font-family: urdu;\n font-weight: 500;\n`;\n\nconst Button = styled.div<{ selected: boolean }>`\n padding: 3px 15px;\n font-size: 18px;\n color: ${(p) => (p.selected ? \"#000\" : \"#000\")};\n background-color: ${(p) => (p.selected ? \"#edeced\" : \"#fff\")};\n min-width: 75px;\n text-align: center;\n\n &:first-of-type {\n border-top-right-radius: 5px;\n border-bottom-right-radius: 5px;\n border: 1px solid #ccc;\n }\n\n &:last-of-type {\n border-top-left-radius: 5px;\n border-bottom-left-radius: 5px;\n border-left: 1px solid #ccc;\n border-top: 1px solid #ccc;\n border-bottom: 1px solid #ccc;\n }\n`;\n\nexport interface SplitButtonProps {\n values: Array<{ label: string; value: string }>;\n selected: string;\n onChange: (value: string) => void;\n}\n\nexport function SplitButton({ values, selected, onChange }: SplitButtonProps) {\n return (\n \n {values.map(({ label, value }) => (\n {\n const v = values.find((v) => v.value !== selected);\n if (v) {\n onChange(v.value);\n }\n }}\n >\n \n \n ))}\n \n );\n}\n","import styled from \"styled-components\";\nimport { device } from \"../../helpers/style\";\n\nexport const ButtonActionGroup = styled.div<{\n margin?: string;\n}>`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n margin: ${(p) => p.margin || \"20px 0 40px 0\"};\n\n & div:first-of-type {\n margin-right: 0;\n }\n\n & div:last-of-type {\n margin-left: 0;\n }\n\n @media ${device.phone} {\n flex-direction: column;\n margin: 0 0 30px 0;\n\n > div {\n margin-bottom: 15px;\n }\n } ;\n`;\n","import axios, { AxiosResponse } from \"axios\";\n\nconst config = {\n withCredentials: true,\n};\n\nexport class APIRequest {\n async get(url: string): Promise> {\n return await axios.get(url, config);\n }\n\n async post(url: string, data: any): Promise> {\n return await axios.post(url, data, config);\n }\n\n async put(url: string, data: any): Promise> {\n return await axios.put(url, data, config);\n }\n\n async delete(url: string): Promise> {\n return await axios.delete(url, config);\n }\n\n async _upload(url: string, data: any): Promise> {\n return await axios.put(url, data, config);\n }\n}\n","import { APIRequest } from \"./APIRequest\";\nimport { API_BASE_URL } from \"../../settings\";\n\ntype Params = Record;\n\n/**\n * Make REST calls onto Model. e.g. user\n */\n\ntype ID = string | number;\ntype MethodType = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\nexport class ModelRequest extends APIRequest {\n constructor(private path: string) {\n super();\n }\n\n url(method: MethodType, id: ID = \"\", params?: Params) {\n let path = this.path;\n if (path.indexOf(\"/\") === -1) {\n path = `/${path}/`;\n }\n\n let endpoint = `${API_BASE_URL}${path}`;\n if (typeof id !== \"undefined\") {\n const i = typeof id === \"number\" ? id.toString() : id;\n\n if (i.length > 0) {\n endpoint += `${i}/`;\n }\n }\n\n if (typeof params !== \"undefined\" && Object.keys(params).length > 0) {\n if (method === \"GET\" && params.url) {\n endpoint += `?${params.url}`;\n }\n\n let re;\n for (let k in params) {\n re = new RegExp(`:${k}`, \"g\");\n endpoint = endpoint.replace(re, params[k]);\n }\n }\n\n return endpoint;\n }\n\n list(params?: Params) {\n return this.get(this.url(\"GET\", \"\", params));\n }\n\n fetch(id: ID, params?: Params) {\n return this.get(this.url(\"GET\", id, params));\n }\n\n create(data: any, params?: Params) {\n return this.post(this.url(\"POST\", \"\", params), data);\n }\n\n save(data: any, id: ID, params?: Params) {\n return this.put(this.url(\"PUT\", id, params), data);\n }\n\n destroy(id: ID, params?: Params) {\n return this.delete(this.url(\"DELETE\", id, params));\n }\n\n upload(data: any, params?: Params) {\n return this._upload(this.url(\"PUT\", \"\", params), data);\n }\n\n fileURL(name: string, params?: Params) {\n return this.url(\"GET\", name, params);\n }\n}\n","export const EVT_WIN_BEFOREUNLOAD = 'beforeunload'\nexport const EVT_WIN_RESIZE = 'resize'\n\nexport const EVT_KEYUP = 'keyup'\nexport const EVT_KEYDOWN = 'keydown'\n\nexport const EVT_CLICK = 'click'\nexport const EVT_MOUSEUP = 'mouseup'\nexport const EVT_MOUSEOUT = 'mouseout'\nexport const EVT_MOUSEOVER = 'mouseover'\nexport const EVT_MOUSEDOWN = 'mousedown'\nexport const EVT_MOUSEMOVE = 'mousemove'\n\nexport const EVT_SCROLL = 'scroll'\n\nexport const EVT_DBLCLICK = 'dblclick'\n","const THRESHOLD = 160;\n\nexport function areDevToolOpen() {\n const width = window.outerWidth - window.innerWidth > THRESHOLD;\n const height = window.outerHeight - window.innerHeight > THRESHOLD;\n\n return width || height;\n}\n","export function hasSelection() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n if (!range.collapsed) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function getSelectionRange() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n if (!range.collapsed) {\n return range;\n }\n }\n\n return null;\n}\n\nexport function getCursorRange() {\n const sel = window.getSelection();\n if (sel && sel.rangeCount) {\n return sel.getRangeAt(0);\n }\n\n return null;\n}\n\nexport function setSelectionRange(range: Range) {\n const s1 = window.getSelection();\n if (s1) {\n s1.removeAllRanges();\n }\n\n const s2 = window.getSelection();\n if (s2) {\n s2.addRange(range);\n }\n}\n\nexport function clearSelection() {\n const sel = window.getSelection();\n\n if (sel && sel.rangeCount) {\n const range = sel.getRangeAt(0);\n range.collapse(true);\n }\n}\n\nexport function getSelectedText() {\n const s = window.getSelection();\n return s ? s.toString() : \"\";\n}\n\nexport function setPositionInContentEditable(\n elm: HTMLElement,\n position: number\n) {\n try {\n const range = document.createRange();\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n range.setStart(elm.childNodes[0], position);\n range.collapse(true);\n sel.addRange(range);\n }\n } catch (e) {\n console.warn(\"setPositionInContentEditable\");\n console.warn(e);\n }\n}\n","export const UR_WORDS_LIST = []\n","export default \"data:image/png;base64,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\"","import styled from \"styled-components\";\nimport { logo } from \"../../images\";\nimport { device } from \"../../helpers/style\";\n\nconst width = 131;\nconst height = 201;\nconst scale = 1;\n\nconst marginLeft = -1 * (width / 2);\n\nexport const Logo = styled.img.attrs({\n src: logo,\n})`\n position: fixed;\n left: 50%;\n top: 50%;\n margin-top: -${height * 0.5}px;\n margin-left: ${marginLeft}px;\n width: ${width}px;\n height: ${height}px;\n\n @media ${device.phone} {\n width: ${width * scale}px;\n height: ${height * scale}px;\n }\n`;\n","import styled from \"styled-components\";\nimport { Logo } from \"./Logo\";\n\nconst Container = styled.div`\n position: fixed;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background-color: #fff;\n`;\n\nexport function Loading() {\n return (\n \n \n \n );\n}\n","import debounce from \"lodash/debounce\";\nimport React from \"react\";\nimport { connect } from \"react-redux\";\nimport { EVT_WIN_BEFOREUNLOAD } from \"../../lib\";\nimport { persistStore } from \"../../services\";\nimport { AppState } from \"../../store\";\nimport { Loading } from \"../Loading\";\n\nexport const APP_REHYDRATE = \"app/REHYDRATE\";\ntype Payload = { name: string; value: any };\nfunction rehydrate(payload: Payload) {\n return {\n payload,\n type: APP_REHYDRATE,\n };\n}\n\nconst mapDispatch = { rehydrate };\nconst mapStateToProps = (state: AppState) => ({ state });\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n children: JSX.Element | JSX.Element[];\n};\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n loaded: boolean;\n};\n\nclass AppRehydrate extends React.Component {\n private fetching: boolean;\n private save: ReturnType;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loaded: false,\n };\n\n this.fetching = false;\n this.save = debounce(this._save, 0);\n\n window.addEventListener(EVT_WIN_BEFOREUNLOAD, () => {\n this.save.flush();\n });\n }\n\n componentDidMount() {\n this.fetch();\n }\n\n componentDidUpdate() {\n this.save();\n }\n\n async fetch() {\n if (this.fetching) {\n return;\n }\n\n this.fetching = true;\n await this.fetchSet(\"reader\");\n await this.fetchSet(\"settings\");\n await this.fetchSet(\"autocomplete\");\n this.fetching = false;\n\n this.setState({ loaded: true });\n }\n\n private async fetchSet(name: string) {\n const { value } = await persistStore.get(name);\n if (value) {\n this.props.rehydrate({ name, value: JSON.parse(value) });\n }\n }\n\n _save() {\n const { state } = this.props;\n\n //@ts-ignore\n persistStore.set(\"reader\", JSON.stringify(state.reader.toJS()));\n //@ts-ignore\n persistStore.set(\"settings\", JSON.stringify(state.settings.toJS()));\n persistStore.set(\n \"autocomplete\",\n //@ts-ignore\n JSON.stringify(state.autocomplete.toJS())\n );\n }\n\n render() {\n if (!this.state.loaded) {\n return ;\n }\n\n return this.props.children;\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(AppRehydrate);\n","import { Map, OrderedMap, fromJS } from \"immutable\";\nimport { APP_REHYDRATE } from \"../components/App/AppRehydrate\";\n\nexport type ReducerState =\n | ReturnType\n | ReturnType;\nexport type OptionsType = \"Map\" | \"OrderedMap\";\ninterface Options {\n type?: OptionsType;\n transformRehydrate?: any;\n}\nexport type InitialState = Record;\n\nexport interface Action {\n type: string;\n payload: T;\n}\nexport type FnMap = Record<\n string,\n (state: ReducerState, action: Action) => ReducerState\n>;\n\nexport interface SagaAction {\n payload: any;\n}\n\nexport function actionType(type: string) {\n return function actionTypeInner(payload: any): Action {\n return { type, payload };\n };\n}\n\nfunction stateWrapper(\n options: Options,\n initialState: InitialState\n): ReducerState {\n if (!!options && options.type === \"OrderedMap\") {\n return OrderedMap(initialState);\n }\n\n return Map(initialState);\n}\n\nexport function reducerFn(\n name: string,\n initialState: InitialState,\n fnMap: FnMap,\n options: Options = {}\n) {\n return function reducerFnInner(\n state = stateWrapper(options, initialState),\n action: Action\n ) {\n const { type, payload } = action;\n\n if (fnMap[type]) {\n return fnMap[type](state, action);\n }\n\n if (!payload) {\n return state;\n }\n\n if (type === APP_REHYDRATE && name === payload.name) {\n if (options && options.transformRehydrate) {\n return state.merge(options.transformRehydrate(payload.value));\n } else {\n return state.merge(fromJS(payload.value));\n }\n }\n\n return state;\n };\n}\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const USER_SET = \"user/SET\";\nexport const USER_CLEAR = \"user/CLEAR\";\n\nexport const setUser = actionType(USER_SET);\n\n// API\nexport const USER_CHK_AUTH = \"user/CHK_AUTH\";\nexport const USER_CHK_AUTH_STATUS = \"user/CHK_AUTH_STATUS\";\nexport const USER_CREATE = \"user/CREATE\";\nexport const USER_SAVE = \"user/SAVE\";\nexport const USER_LOGOUT = \"user/LOGOUT\";\n\nexport const checkAuth = actionType(USER_CHK_AUTH);\nexport const checkAuthStatus = actionType(USER_CHK_AUTH_STATUS);\nexport const createUser = actionType(USER_CREATE);\nexport const saveUser = actionType(USER_SAVE);\nexport const logoutUser = actionType(USER_LOGOUT);\n","import { fromJS, Map } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { USER_SET, USER_CLEAR } from \"./actions\";\n\ninterface User {\n [x: string]: any;\n}\ntype UserAction = Action;\n\nconst initialState = Map({});\n\nconst fnMap = {\n [USER_SET]: (s: ReducerState, a: UserAction) => fromJS(a.payload),\n [USER_CLEAR]: (s: ReducerState) => s.clear(),\n};\n//@ts-ignore\nexport const userReducer = reducerFn(\"user\", initialState, fnMap);\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const STATUS_USER_LOADED = \"status/USER_LOADED\";\n\nexport const statusUserLoaded = actionType(STATUS_USER_LOADED);\n","import { Map } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { STATUS_USER_LOADED } from \"./actions\";\n\ninterface Status {\n userLoaded: boolean;\n}\ntype StatusAction = Action;\n\nconst initialState = Map({\n userLoaded: false,\n});\n\nconst fnMap = {\n [STATUS_USER_LOADED]: (s: ReducerState, a: StatusAction) =>\n s.set(\"userLoaded\", a.payload),\n};\nexport const statusReducer = reducerFn(\"status\", initialState, fnMap);\n","import { actionType } from \"../../helpers/reducers\";\n\n/*\n Document is an over arching concept. Document contains one or more pages. Pages in way can be thought of as chapters\n */\n\n// Documents\nexport const DOC_SET = \"doc/SET\";\nexport const DOC_CLEAR = \"doc/CLEAR\";\nexport const DOC_REMOVE = \"doc/REMOVE\";\nexport const DOC_SET_MULTIPLE = \"doc/SET_MULTIPLE\";\n\nexport const setDoc = actionType(DOC_SET);\n\n// API\nexport const DOC_FETCH = \"doc/FETCH\";\nexport const DOC_FETCH_ALL = \"doc/FETCH_ALL\";\nexport const DOC_SAVE = \"doc/SAVE\";\nexport const DOC_CREATE = \"doc/CREATE\";\nexport const DOC_DESTROY = \"doc/DESTROY\";\n\nexport const fetchDoc = actionType(DOC_FETCH);\nexport const fetchDocs = actionType(DOC_FETCH_ALL);\nexport const createDoc = actionType(DOC_CREATE);\nexport const saveDoc = actionType(DOC_SAVE);\nexport const destroyDoc = actionType(DOC_DESTROY);\n","import { fromJS } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { DOC_SET, DOC_CLEAR, DOC_REMOVE, DOC_SET_MULTIPLE } from \"./actions\";\n\ninterface Docs {\n id: string;\n doc_id: string;\n data: any;\n}\ntype DocsAction = Action & Action>;\n\nconst fnMap = {\n [DOC_CLEAR]: (s: ReducerState) => s.clear(),\n [DOC_SET]: (s: ReducerState, { payload: { id, data } }: DocsAction) => {\n if (typeof data.doc === \"undefined\") {\n return s;\n }\n //@ts-ignore\n return s.set(parseInt(id, 10), fromJS(data.doc));\n },\n [DOC_REMOVE]: (s: ReducerState, { payload: { doc_id } }: DocsAction) =>\n //@ts-ignore\n s.delete(parseInt(doc_id, 10)),\n [DOC_SET_MULTIPLE]: (s: ReducerState, { payload: rows }: DocsAction) => {\n for (let r of rows) {\n //@ts-ignore\n s = s.set(parseInt(r.id, 10), fromJS(r));\n }\n return s;\n },\n};\n\nconst initialState = {};\nexport const docsReducer = reducerFn(\"docs\", initialState, fnMap);\n","import { actionType } from \"../../helpers/reducers\";\n\n// DocUsers\nexport const DOC_USER_SET = \"doc_user/SET\";\nexport const DOC_USER_CLEAR = \"doc_user/CLEAR\";\nexport const DOC_USER_REMOVE = \"doc_user/REMOVE\";\n\nexport const setDocUser = actionType(DOC_USER_SET);\n\n// API\nexport const DOC_USER_FETCH = \"doc_user/FETCH\";\nexport const DOC_USER_FETCH_ALL = \"doc_user/FETCH_ALL\";\nexport const DOC_USER_SAVE = \"doc_user/SAVE\";\nexport const DOC_USER_CREATE = \"doc_user/CREATE\";\nexport const DOC_USER_DESTROY = \"doc_user/DESTROY\";\n\nexport const fetchDocUser = actionType(DOC_USER_FETCH);\nexport const fetchDocUsers = actionType(DOC_USER_FETCH_ALL);\nexport const createDocUser = actionType(DOC_USER_CREATE);\nexport const saveDocUser = actionType(DOC_USER_SAVE);\nexport const destroyDocUser = actionType(DOC_USER_DESTROY);\n","import { fromJS } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { DOC_USER_SET, DOC_USER_CLEAR, DOC_USER_REMOVE } from \"./actions\";\n\ninterface DocUsers {\n doc_id: string;\n user_id: string;\n}\ntype DocUsersAction = Action;\n\nfunction getId(payload: DocUsers) {\n return `${payload.doc_id}-${payload.user_id}`;\n}\n\nconst fnMap = {\n [DOC_USER_CLEAR]: (s: ReducerState) => s.clear(),\n [DOC_USER_SET]: (s: ReducerState, { payload }: DocUsersAction) => {\n if (!getId(payload)) {\n return s;\n }\n\n return s.set(getId(payload), fromJS(payload));\n },\n [DOC_USER_REMOVE]: (s: ReducerState, { payload }: DocUsersAction) =>\n s.delete(getId(payload)),\n};\n\nconst initialState = {};\nexport const docUsersReducer = reducerFn(\"doc_users\", initialState, fnMap);\n","import { actionType } from \"../../helpers/reducers\";\n\n// Pages\nexport const PAGE_SET = \"page/SET\";\nexport const PAGE_SET_MULTIPLE = \"page/SET_MULTIPLE\";\nexport const PAGE_CLEAR = \"page/CLEAR\";\nexport const PAGE_REMOVE = \"page/REMOVE\";\n\nexport const setPage = actionType(PAGE_SET);\n\n// API\nexport const PAGE_FETCH = \"page/FETCH\";\nexport const PAGE_FETCH_ALL = \"page/FETCH_ALL\";\nexport const PAGE_SAVE = \"page/SAVE\";\nexport const PAGE_SET_POSITION = \"page/SET_POSITION\";\nexport const PAGE_CREATE = \"page/CREATE\";\nexport const PAGE_DESTROY = \"page/DESTROY\";\n\nexport const fetchPage = actionType(PAGE_FETCH);\nexport const fetchPages = actionType(PAGE_FETCH_ALL);\nexport const createPage = actionType(PAGE_CREATE);\nexport const savePage = actionType(PAGE_SAVE);\nexport const setPagePositions = actionType(PAGE_SET_POSITION);\nexport const destroyPage = actionType(PAGE_DESTROY);\n","import { fromJS } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport {\n PAGE_SET,\n PAGE_CLEAR,\n PAGE_REMOVE,\n PAGE_SET_MULTIPLE,\n} from \"./actions\";\n\ninterface Page {\n id: string;\n page_id: string;\n data: any;\n}\n\ntype PageAction = Action & Action>;\n\nconst fnMap = {\n [PAGE_CLEAR]: (s: ReducerState) => s.clear(),\n [PAGE_SET]: (s: ReducerState, { payload: { id, data } }: PageAction) =>\n // @ts-ignore\n s.set(parseInt(id, 10), fromJS(data)),\n [PAGE_REMOVE]: (s: ReducerState, { payload: { page_id } }: PageAction) =>\n // @ts-ignore\n s.delete(parseInt(page_id)),\n [PAGE_SET_MULTIPLE]: (s: ReducerState, { payload: rows }: PageAction) => {\n for (let r of rows) {\n // @ts-ignore\n s = s.set(parseInt(r.id, 10), fromJS(r));\n }\n return s;\n },\n};\n\nconst initialState = {};\nexport const pagesReducer = reducerFn(\"pages\", initialState, fnMap, {\n type: \"OrderedMap\",\n});\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const SETTINGS_TOGGLE_EDITOR_THEME = \"settings/TOGGLE_EDITOR_THEME\";\nexport const SETTINGS_DOC_LAST_OPENED = \"settings/DOC_LAST_OPENED\";\nexport const SETTINGS_REMOVE_DOC_LAST_OPENED =\n \"settings/REMOVE_DOC_LAST_OPENED\";\n\nexport const toggleEditorTheme = actionType(SETTINGS_TOGGLE_EDITOR_THEME);\nexport const setDocLastOpened = actionType(SETTINGS_DOC_LAST_OPENED);\nexport const removeDocLastOpened = actionType(SETTINGS_REMOVE_DOC_LAST_OPENED);\n","import { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { Map, fromJS } from \"immutable\";\nimport {\n SETTINGS_TOGGLE_EDITOR_THEME,\n SETTINGS_DOC_LAST_OPENED,\n SETTINGS_REMOVE_DOC_LAST_OPENED,\n} from \"./actions\";\n\ninterface Settings {\n doc_id?: string;\n page_id?: string;\n enableDarkTheme: boolean;\n docLastOpened: ReturnType | Array>;\n}\n\nconst initialState: Settings = {\n enableDarkTheme: false,\n docLastOpened: Map({}),\n};\n\ntype SettingsAction = Action;\n\nconst fnMap = {\n [SETTINGS_TOGGLE_EDITOR_THEME]: (s: ReducerState, _a: SettingsAction) =>\n s.set(\"enableDarkTheme\", !s.get(\"enableDarkTheme\")),\n\n [SETTINGS_DOC_LAST_OPENED]: (\n s: ReducerState,\n { payload: { doc_id, page_id } }: SettingsAction\n ) => s.setIn([\"docLastOpened\", doc_id], page_id),\n\n [SETTINGS_REMOVE_DOC_LAST_OPENED]: (\n s: ReducerState,\n { payload: { doc_id } }: SettingsAction\n ) => s.removeIn([\"docLastOpened\", doc_id]),\n};\n\nfunction transformRehydrate(saved: Settings) {\n let next = fromJS(initialState);\n //@ts-ignore\n next = next.set(\"enableDarkTheme\", saved.enableDarkTheme || false);\n\n if (Object.keys(saved.docLastOpened).length > 0) {\n const opened: Record = {};\n for (const [k, v] of Object.entries(saved.docLastOpened)) {\n opened[parseInt(k)] = parseInt(v);\n }\n //@ts-ignore\n next = next.set(\"docLastOpened\", fromJS(opened));\n }\n\n return next;\n}\n\nexport const settingsReducer = reducerFn(\"settings\", initialState, fnMap, {\n transformRehydrate,\n});\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const AUTOCOMPLETE_SET = \"autocomplete/SET\";\nexport const AUTOCOMPLETE_REMOVE = \"autocomplete/REMOVE\";\nexport const AUTOCOMPLETE_PAGE_REMOVE = \"autocomplete/PAGE_REMOVE\";\n\nexport const setAutoComplete = actionType(AUTOCOMPLETE_SET);\nexport const removeAutoComplete = actionType(AUTOCOMPLETE_REMOVE);\nexport const removePageAutoComplete = actionType(AUTOCOMPLETE_PAGE_REMOVE);\n","import { fromJS, OrderedMap } from \"immutable\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport {\n AUTOCOMPLETE_SET,\n AUTOCOMPLETE_REMOVE,\n AUTOCOMPLETE_PAGE_REMOVE,\n} from \"./actions\";\n\nexport interface AutoComplete {\n doc_id: string;\n page_id: string;\n list: any;\n}\ntype AutoCompleteAction = Action;\n\nfunction getId(payload: AutoComplete) {\n return `${payload.doc_id}-${payload.page_id}`;\n}\n\nconst fnMap = {\n [AUTOCOMPLETE_SET]: (s: ReducerState, a: AutoCompleteAction) =>\n s.set(getId(a.payload), fromJS(a.payload.list)),\n [AUTOCOMPLETE_REMOVE]: (\n s: ReducerState,\n { payload }: AutoCompleteAction\n ) => {\n const prefix = `${payload.doc_id}-`;\n return OrderedMap(\n s.filterNot((_v, k) => (k as string).startsWith(prefix))\n );\n },\n [AUTOCOMPLETE_PAGE_REMOVE]: (\n s: ReducerState,\n { payload }: AutoCompleteAction\n ) => s.delete(getId(payload)),\n};\n\nconst initialState = {};\nexport const autoCompleteReducer = reducerFn(\n \"autocomplete\",\n initialState,\n fnMap\n);\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const READER_SET_THEME = \"reader/setTheme\";\nexport const READER_SET_FONT_SIZE = \"reader/setFontSize\";\n\nexport const setReaderTheme = actionType(READER_SET_THEME);\nexport const setReaderFontSize = actionType(READER_SET_FONT_SIZE);\n","import { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\nimport { READER_SET_THEME, READER_SET_FONT_SIZE } from \"./actions\";\n\nexport const THEME_HIGH = \"theme/BRIGHTNESS_HIGH\";\nexport const THEME_MEDIUM = \"theme/BRIGHTNESS_MEDIUM\";\nexport const THEME_LOW = \"theme/BRIGHTNESS_LOW\";\n\nexport const THEME_FONT_SIZE_SMALL = \"reader/fontSizeSmall\";\nexport const THEME_FONT_SIZE_MEDIUM = \"reader/fontSizeMedium\";\nexport const THEME_FONT_SIZE_LARGE = \"reader/fontSizeLarge\";\n\ninterface Reader {\n theme: string;\n size: string;\n}\ntype ReaderAction = Action;\n\nconst initialState: Reader = {\n theme: THEME_MEDIUM,\n size: THEME_FONT_SIZE_SMALL,\n};\n\nconst fnMap = {\n [READER_SET_THEME]: (s: ReducerState, a: ReaderAction) =>\n s.set(\"theme\", a.payload),\n [READER_SET_FONT_SIZE]: (s: ReducerState, a: ReaderAction) =>\n s.set(\"size\", a.payload),\n};\n\nexport const readerReducer = reducerFn(\"reader\", initialState, fnMap);\n","import { actionType } from \"../../helpers/reducers\";\n\nexport const SEARCH_SET = \"search/SET\";\nexport const setSearch = actionType(SEARCH_SET);\n","import { SEARCH_SET } from \"./actions\";\nimport { Action, reducerFn, ReducerState } from \"../../helpers/reducers\";\n\ninterface Search {\n text: string;\n}\ntype SearchAction = Action;\n\nconst initialState: Search = {\n text: \"\",\n};\n\nconst fnMap = {\n [SEARCH_SET]: (s: ReducerState, a: SearchAction) =>\n s.set(\"text\", a.payload),\n};\nexport const searchReducer = reducerFn(\"search\", initialState, fnMap);\n","import { ModelRequest } from \"../lib\";\n\nexport const Auth = new ModelRequest(\"auth\");\nexport const User = new ModelRequest(\"user\");\nexport const Doc = new ModelRequest(\"docs\");\nexport const DocMeta = new ModelRequest(\"/doc_meta/:doc_id/\");\nexport const DocUser = new ModelRequest(\"/doc_users/:doc_id/\");\nexport const Page = new ModelRequest(\"/pages/:doc_id/\");\nexport const File = new ModelRequest(\"/files/:doc_id/\");\nexport const PageContents = new ModelRequest(\"/page_contents/:doc_id/\");\nexport const Books = new ModelRequest(\"books\");\nexport const Featured = new ModelRequest(\"featured\");\nexport const Tag = new ModelRequest(\"tags\");\nexport const Merge = new ModelRequest(\"/merge/:doc_id/\");\nexport const Translate = new ModelRequest(\"/translate/:src_lang/:dst_lang/\");\nexport const DocPDF = new ModelRequest(\"pdf\");\nexport const Resize = new ModelRequest(\"resize\");\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Form } from \"../../lib\";\nimport { createUser } from \"../../reducers/user/actions\";\nimport { Constraints, Fields } from \"./types\";\n\nexport const EVT_USER_REGISTER = \"user/REGISTER\";\n\nconst mapDispatch = { createUser };\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n redirect: boolean;\n primaryBtnType?: string;\n};\ntype Props = DispatchProps & OwnProps;\n\nclass RegisterForm extends React.Component {\n private order = [\"name\", \"email\"];\n\n private fields: Fields = {\n name: {\n type: \"text\",\n },\n email: {\n type: \"email\",\n },\n };\n\n private constraints: Constraints = {\n name: {\n presence: { message: \"nameRequired\" },\n length: {\n minimum: 3,\n message: \"nameMinChars\",\n },\n },\n\n email: {\n presence: { message: \"emailRequired\" },\n email: { message: \"emailInvalid\" },\n },\n };\n\n onSubmit = (values: Record) => {\n const { createUser, redirect } = this.props;\n createUser({\n ...values,\n redirect,\n password: Math.random().toString(36).substr(2),\n });\n\n const { gtag } = window;\n gtag(\"event\", \"user\", {\n event_category: \"form\",\n event_label: \"register\",\n });\n };\n\n render() {\n return (\n \n );\n }\n}\n\nexport default connect(null, mapDispatch)(RegisterForm);\n","import { call, put, takeLatest } from \"redux-saga/effects\";\nimport { User, Auth } from \"../../models\";\nimport { FORM_CLEAR, FORM_END_PROCESSING } from \"../../lib\";\nimport { notification, navigate, eventEmitter } from \"../../services\";\nimport {\n USER_SET,\n USER_CLEAR,\n USER_CHK_AUTH,\n USER_CHK_AUTH_STATUS,\n USER_LOGOUT,\n USER_SAVE,\n USER_CREATE,\n} from \"./actions\";\nimport { DOC_CLEAR } from \"../docs/actions\";\nimport { PAGE_CLEAR } from \"../pages/actions\";\nimport { DOC_USER_CLEAR } from \"../doc_users/actions\";\nimport { STATUS_USER_LOADED } from \"../status/actions\";\nimport { EVT_USER_REGISTER } from \"../../components/Forms/RegisterForm\";\nimport { AxiosResponse } from \"axios\";\n\nfunction* checkAuthStatus(_action: { type: typeof USER_CHK_AUTH_STATUS }) {\n try {\n const { data }: AxiosResponse = yield call([Auth, \"fetch\"], \"\");\n yield put({\n type: USER_SET,\n payload: data,\n });\n } catch (e) {\n console.log(e);\n } finally {\n yield put({\n type: STATUS_USER_LOADED,\n payload: true,\n });\n }\n}\n\nfunction* onCheckAuthStatus() {\n yield takeLatest(USER_CHK_AUTH_STATUS, checkAuthStatus);\n}\n\nfunction* checkAuth(action: { type: typeof USER_CHK_AUTH; payload: any }) {\n try {\n const { data }: AxiosResponse = yield call(\n [Auth, \"create\"],\n action.payload\n );\n yield put({\n type: USER_SET,\n payload: data,\n });\n } catch (e) {\n notification.apiError(e);\n } finally {\n eventEmitter.emit(FORM_END_PROCESSING);\n }\n}\n\nfunction* onCheckAuth() {\n yield takeLatest(USER_CHK_AUTH, checkAuth);\n}\n\nfunction* logoutUser(action: { type: typeof USER_LOGOUT }) {\n try {\n yield call([Auth, \"destroy\"], \"\");\n yield put({ type: USER_CLEAR });\n yield put({ type: DOC_CLEAR });\n yield put({ type: PAGE_CLEAR });\n yield put({ type: DOC_USER_CLEAR });\n // navigate.to(\"/app/\");\n window.location.assign(\"/\");\n } catch (e) {}\n}\n\nfunction* onLogoutUser() {\n yield takeLatest(USER_LOGOUT, logoutUser);\n}\n\nfunction* createUser(action: {\n type: typeof USER_CREATE;\n payload: {\n redirect: boolean;\n [x: string]: any;\n };\n}) {\n try {\n const {\n data,\n }: AxiosResponse<{\n errors?: Array;\n }> = yield call([User, \"create\"], action.payload);\n yield put({\n type: USER_SET,\n payload: data,\n });\n\n const { errors } = data;\n if (errors && errors.length > 0) {\n eventEmitter.emit(FORM_END_PROCESSING);\n return notification.set(errors[0], \"f\");\n }\n\n eventEmitter.emit(FORM_END_PROCESSING);\n eventEmitter.emit(FORM_CLEAR);\n eventEmitter.emit(EVT_USER_REGISTER);\n\n if (action.payload.redirect) {\n navigate.to(\"/app/docs\");\n }\n\n notification.set(\"registerForm.success\", \"s\");\n } catch (e) {\n notification.apiError(e);\n } finally {\n eventEmitter.emit(FORM_END_PROCESSING);\n }\n}\n\nfunction* onCreateUser() {\n yield takeLatest(USER_CREATE, createUser);\n}\n\nfunction* saveUser(action: { type: typeof USER_SAVE; payload: any }) {\n try {\n const { data }: AxiosResponse = yield call(\n [User, \"save\"],\n action.payload,\n \"\"\n );\n yield put({\n type: USER_SET,\n payload: data,\n });\n } catch (e) {\n notification.apiError(e);\n } finally {\n eventEmitter.emit(FORM_END_PROCESSING);\n }\n}\n\nfunction* onSaveUser() {\n yield takeLatest(USER_SAVE, saveUser);\n}\n\nexport {\n onCheckAuth,\n onCheckAuthStatus,\n onLogoutUser,\n onCreateUser,\n onSaveUser,\n};\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { Form } from \"../../lib\";\nimport { createDoc, fetchDoc, saveDoc } from \"../../reducers/docs/actions\";\nimport { navigate } from \"../../services\";\nimport { AppState } from \"../../store\";\nimport { Constraints, Editing, Fields } from \"./types\";\n\nconst Container = styled.div`\n margin: 0 auto 60px auto;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n width: 100%;\n`;\n\nexport const EVT_DOC_CREATE = \"doc/CREATE\";\n\nfunction mapStateToProps(state: AppState, ownProps?: { doc_id: number }) {\n return {\n //@ts-ignore\n doc: state.docs.get(ownProps!.doc_id),\n };\n}\nconst mapDispatch = { fetchDoc, createDoc, saveDoc };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n doc_id?: number;\n editing: Editing;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\n\nclass DocForm extends React.Component {\n private order = [\"name\"];\n\n private fields: Fields = {\n name: {\n type: \"text\",\n },\n };\n\n private constraints: Constraints = {\n name: {\n presence: { message: \"nameRequired\" },\n length: {\n minimum: 3,\n message: \"nameMinChars\",\n },\n },\n };\n\n componentDidMount() {\n const { editing, doc_id } = this.props;\n if (editing === \"Edit\" && !doc_id) {\n this.props.fetchDoc(doc_id);\n\n this.order = [\"name\", \"status\", \"visibility\"];\n this.fields.status = {\n type: \"select\",\n value: \"PUBLISHED\",\n values: [\"DRAFT\", \"PUBLISHED\"],\n };\n\n this.fields.visibility = {\n type: \"select\",\n value: \"PUBLIC\",\n values: [\"PUBLIC\", \"PRIVATE\"],\n };\n }\n }\n\n onSubmit = (values: any) => {\n const { editing, doc_id } = this.props;\n if (editing === \"Edit\") {\n this.props.saveDoc({\n doc_id,\n data: values,\n });\n } else {\n this.props.createDoc({\n ...values,\n status: \"PUBLISHED\",\n visibility: \"PUBLIC\",\n redirect: true,\n });\n\n const { gtag } = window;\n gtag(\"event\", \"doc\", {\n event_label: \"create\",\n });\n }\n };\n\n onCancel = () => navigate.to(\"/app/docs\");\n\n render() {\n return (\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(DocForm);\n","import { call, put, takeLatest, takeEvery } from \"redux-saga/effects\";\nimport { Doc } from \"../../models\";\nimport { FORM_CLEAR, FORM_END_PROCESSING } from \"../../lib\";\nimport { navigate, notification, eventEmitter } from \"../../services\";\nimport {\n DOC_FETCH_ALL,\n DOC_FETCH,\n DOC_SET,\n DOC_DESTROY,\n DOC_SAVE,\n DOC_REMOVE,\n DOC_CREATE,\n DOC_SET_MULTIPLE,\n} from \"./actions\";\nimport { EVT_DOC_CREATE } from \"../../components/Forms/DocForm\";\nimport { AxiosResponse } from \"axios\";\n\nfunction* fetchDocs(_action: { type: typeof DOC_FETCH_ALL }) {\n try {\n const {\n data: { count, rows },\n }: AxiosResponse<{ count: number; rows: Array }> = yield call([\n Doc,\n \"list\",\n ]);\n if (count > 0) {\n yield put({\n type: DOC_SET_MULTIPLE,\n payload: rows,\n });\n }\n } catch (e) {}\n}\n\nfunction* onFetchDocs() {\n yield takeLatest(DOC_FETCH_ALL, fetchDocs);\n}\n\nfunction* fetchDoc(action: { type: typeof DOC_FETCH; payload: any }) {\n try {\n const { data }: AxiosResponse<{ id: number }> = yield call(\n [Doc, \"fetch\"],\n action.payload\n );\n yield put({\n type: DOC_SET,\n payload: {\n data,\n id: data.id,\n },\n });\n } catch (e) {}\n}\n\nfunction* onFetchDoc() {\n yield takeEvery(DOC_FETCH, fetchDoc);\n}\n\nfunction* createDoc(action: {\n type: typeof DOC_CREATE;\n payload: {\n redirect: boolean;\n [x: string]: any;\n };\n}) {\n try {\n const {\n data,\n }: AxiosResponse<{\n doc: { id: number };\n page: { id: number };\n }> = yield call([Doc, \"create\"], action.payload);\n yield put({\n type: DOC_SET,\n payload: {\n data,\n id: data.doc.id,\n },\n });\n\n const {\n doc: { id: doc_id },\n page: { id: page_id },\n } = data;\n\n if (action.payload.redirect) {\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n }\n\n eventEmitter.emit(FORM_END_PROCESSING);\n eventEmitter.emit(FORM_CLEAR);\n eventEmitter.emit(EVT_DOC_CREATE, {\n doc_id,\n page_id,\n });\n\n notification.set(\"doc.created\", \"s\");\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"doc.failed\", \"f\");\n }\n}\n\nfunction* onCreateDoc() {\n yield takeLatest(DOC_CREATE, createDoc);\n}\n\nfunction* saveDoc(action: {\n type: typeof DOC_SAVE;\n payload: {\n doc_id: string;\n data: any;\n };\n}) {\n try {\n const { doc_id, data } = action.payload;\n const res: AxiosResponse> = yield call(\n [Doc, \"save\"],\n data,\n doc_id\n );\n yield put({\n type: DOC_SET,\n payload: {\n id: doc_id,\n data: res.data,\n },\n });\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"doc.saved\", \"s\");\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"doc.failed\", \"f\");\n }\n}\n\nfunction* onSaveDoc() {\n yield takeLatest(DOC_SAVE, saveDoc);\n}\n\nfunction* destroyDoc(action: { type: typeof DOC_DESTROY; payload: any }) {\n try {\n yield call([Doc, \"destroy\"], action.payload);\n yield put({\n type: DOC_REMOVE,\n payload: { doc_id: action.payload },\n });\n } catch (e) {}\n}\n\nfunction* onDestroyDoc() {\n yield takeEvery(DOC_DESTROY, destroyDoc);\n}\n\nexport { onFetchDoc, onFetchDocs, onCreateDoc, onSaveDoc, onDestroyDoc };\n","import { call, put, takeLatest, takeEvery } from \"redux-saga/effects\";\nimport { Page } from \"../../models\";\nimport { navigate, eventEmitter, notification } from \"../../services\";\nimport { PAGE_EDITOR } from \"../../settings\";\nimport { FORM_CLEAR, FORM_END_PROCESSING } from \"../../lib\";\nimport { AxiosResponse } from \"axios\";\nimport {\n PAGE_FETCH_ALL,\n PAGE_FETCH,\n PAGE_SET,\n PAGE_DESTROY,\n PAGE_SAVE,\n PAGE_REMOVE,\n PAGE_CREATE,\n PAGE_SET_MULTIPLE,\n PAGE_SET_POSITION,\n} from \"./actions\";\n\nfunction* fetchPages(action: {\n type: typeof PAGE_FETCH_ALL;\n payload: {\n doc_id: number;\n redirect: string;\n };\n}) {\n const { doc_id, redirect } = action.payload;\n try {\n const { data: rows }: AxiosResponse> = yield call(\n [Page, \"list\"],\n { doc_id }\n );\n yield put({\n type: PAGE_SET_MULTIPLE,\n payload: rows,\n });\n\n if (redirect === PAGE_EDITOR) {\n navigate.to(`/app/e/${doc_id}/${rows[0][\"id\"]}`);\n }\n } catch (e) {}\n}\n\nfunction* onFetchPages() {\n yield takeLatest(PAGE_FETCH_ALL, fetchPages);\n}\n\nfunction* fetchPage(action: {\n type: typeof PAGE_FETCH;\n payload: {\n doc_id: number;\n page_id: number;\n };\n}) {\n try {\n const { doc_id, page_id } = action.payload;\n const {\n data,\n }: AxiosResponse<{\n id: number;\n [x: string]: any;\n }> = yield call([Page, \"fetch\"], page_id, { doc_id });\n yield put({\n type: PAGE_SET,\n payload: {\n data,\n id: data.id,\n },\n });\n } catch (e) {}\n}\n\nfunction* onFetchPage() {\n yield takeEvery(PAGE_FETCH, fetchPage);\n}\n\nfunction* createPage(action: {\n type: typeof PAGE_CREATE;\n payload: {\n doc_id: number;\n data: any;\n redirect: string;\n };\n}) {\n try {\n const { doc_id, data, redirect } = action.payload;\n const res: AxiosResponse<{\n id: number;\n [x: string]: any;\n }> = yield call([Page, \"create\"], data, { doc_id });\n yield put({\n type: PAGE_SET,\n payload: {\n id: res.data.id,\n data: res.data,\n },\n });\n\n if (redirect === PAGE_EDITOR) {\n navigate.to(`/app/e/${doc_id}/${res.data.id}`);\n }\n\n if (!redirect) {\n eventEmitter.emit(FORM_END_PROCESSING);\n eventEmitter.emit(FORM_CLEAR);\n notification.set(\"pageForm.created\", \"s\");\n }\n } catch (e) {}\n}\n\nfunction* onCreatePage() {\n yield takeLatest(PAGE_CREATE, createPage);\n}\n\nfunction* savePage(action: {\n type: typeof PAGE_SAVE;\n payload: {\n doc_id: number;\n page_id: number;\n data: any;\n };\n}) {\n try {\n const { doc_id, page_id, data } = action.payload;\n const res: AxiosResponse<{\n id: number;\n [x: string]: any;\n }> = yield call([Page, \"save\"], data, page_id, { doc_id });\n yield put({\n type: PAGE_SET,\n payload: {\n id: res.data.id,\n data: res.data,\n },\n });\n eventEmitter.emit(FORM_END_PROCESSING);\n // notification.set('pageForm.saved', 's')\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n // notification.set('pageForm.failed', 'f')\n }\n}\n\nfunction* onSavePage() {\n yield takeLatest(PAGE_SAVE, savePage);\n}\n\nfunction* destroyPage(action: {\n type: typeof PAGE_DESTROY;\n payload: {\n page_id: number;\n doc_id: number;\n };\n}) {\n try {\n const { doc_id, page_id } = action.payload;\n yield call([Page, \"destroy\"], page_id, { doc_id });\n yield put({\n type: PAGE_REMOVE,\n payload: { page_id },\n });\n eventEmitter.emit(\"page.deleted\");\n } catch (e) {}\n}\n\nfunction* onDestroyPage() {\n yield takeEvery(PAGE_DESTROY, destroyPage);\n}\n\nfunction* setPositions(action: {\n type: typeof PAGE_SET_POSITION;\n payload: {\n doc_id: number;\n positions: Array;\n };\n}) {\n try {\n const { doc_id, positions } = action.payload;\n yield call([Page, \"save\"], positions, \"positions\", { doc_id });\n eventEmitter.emit(\"page.positionsSaved\");\n } catch (e) {}\n}\n\nfunction* onSetPagePositions() {\n yield takeEvery(PAGE_SET_POSITION, setPositions);\n}\n\nexport {\n onFetchPage,\n onFetchPages,\n onCreatePage,\n onSavePage,\n onDestroyPage,\n onSetPagePositions,\n};\n","import { call, put, takeLatest, takeEvery } from \"redux-saga/effects\";\nimport { DocUser } from \"../../models\";\nimport { notification, navigate, eventEmitter } from \"../../services\";\nimport {\n DOC_USER_FETCH_ALL,\n DOC_USER_FETCH,\n DOC_USER_SET,\n DOC_USER_DESTROY,\n DOC_USER_SAVE,\n DOC_USER_REMOVE,\n DOC_USER_CREATE,\n} from \"./actions\";\nimport { FORM_CLEAR, FORM_END_PROCESSING } from \"../../lib\";\nimport { UD_EDITOR } from \"../../settings\";\nimport { AxiosResponse } from \"axios\";\n\nfunction* fetchDocUsers(action: {\n type: typeof DOC_USER_FETCH_ALL;\n payload: { doc_id: number };\n}) {\n const { doc_id } = action.payload;\n try {\n const { data }: AxiosResponse> = yield call(\n [DocUser, \"list\"],\n { doc_id }\n );\n for (let r of data) {\n yield put({\n type: DOC_USER_SET,\n payload: r,\n });\n }\n } catch (e) {}\n}\n\nfunction* onFetchDocUsers() {\n yield takeLatest(DOC_USER_FETCH_ALL, fetchDocUsers);\n}\n\nfunction* fetchDocUser(action: {\n type: typeof DOC_USER_FETCH;\n payload: {\n doc_id: number;\n user_id: number;\n };\n}) {\n try {\n const { doc_id, user_id } = action.payload;\n const { data }: AxiosResponse = yield call(\n [DocUser, \"fetch\"],\n user_id,\n { doc_id }\n );\n yield put({\n type: DOC_USER_SET,\n payload: data,\n });\n } catch (e) {}\n}\n\nfunction* onFetchDocUser() {\n yield takeEvery(DOC_USER_FETCH, fetchDocUser);\n}\n\nfunction* createDocUser(action: {\n type: typeof DOC_USER_CREATE;\n payload: {\n doc_id: number;\n data: any;\n redirect: string;\n };\n}) {\n try {\n const { doc_id, data, redirect } = action.payload;\n const res: AxiosResponse = yield call([DocUser, \"create\"], data, {\n doc_id,\n });\n yield put({\n type: DOC_USER_SET,\n payload: res.data,\n });\n\n if (redirect === UD_EDITOR) {\n navigate.to(`/app/e/${doc_id}/${res.data.id}`);\n }\n\n eventEmitter.emit(FORM_END_PROCESSING);\n eventEmitter.emit(FORM_CLEAR);\n notification.set(\"userDocForm.added\", \"s\");\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.apiError(e);\n }\n}\n\nfunction* onCreateDocUser() {\n yield takeLatest(DOC_USER_CREATE, createDocUser);\n}\n\nfunction* saveDocUser(action: {\n type: typeof DOC_USER_SAVE;\n payload: {\n doc_id: number;\n user_id: number;\n data: any;\n };\n}) {\n try {\n const { doc_id, user_id, data } = action.payload;\n const res: AxiosResponse = yield call(\n [DocUser, \"save\"],\n data,\n user_id,\n { doc_id }\n );\n yield put({\n type: DOC_USER_SET,\n payload: res.data,\n });\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"userDocForm.saved\", \"s\");\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"userDocForm.failed\", \"f\");\n }\n}\n\nfunction* onSaveDocUser() {\n yield takeLatest(DOC_USER_SAVE, saveDocUser);\n}\n\nfunction* destroyDocUser(action: {\n type: typeof DOC_USER_DESTROY;\n payload: {\n user_id: number;\n doc_id: number;\n };\n}) {\n try {\n const { user_id, doc_id } = action.payload;\n yield call([DocUser, \"destroy\"], user_id, { doc_id });\n yield put({\n type: DOC_USER_REMOVE,\n payload: { doc_id, user_id },\n });\n eventEmitter.emit(\"doc_user.deleted\");\n } catch (e) {}\n}\n\nfunction* onDestroyDocUser() {\n yield takeEvery(DOC_USER_DESTROY, destroyDocUser);\n}\n\nexport {\n onFetchDocUser,\n onFetchDocUsers,\n onCreateDocUser,\n onSaveDocUser,\n onDestroyDocUser,\n};\n","import { applyMiddleware, combineReducers, createStore } from \"redux\";\nimport { composeWithDevTools } from \"redux-devtools-extension\";\nimport createSagaMiddleware from \"redux-saga\";\nimport {\n autoCompleteReducer,\n docsReducer,\n docUsersReducer,\n pagesReducer,\n readerReducer,\n searchReducer,\n settingsReducer,\n statusReducer,\n userReducer,\n} from \"./reducers\";\nimport * as sagas from \"./sagas\";\n\n//@ts-ignore\nconst rootReducers = combineReducers({\n docs: docsReducer,\n doc_users: docUsersReducer,\n pages: pagesReducer,\n user: userReducer,\n settings: settingsReducer,\n autocomplete: autoCompleteReducer,\n reader: readerReducer,\n search: searchReducer,\n status: statusReducer,\n});\n\nexport type AppState = ReturnType;\n\nconst sagaMiddleware = createSagaMiddleware();\n\nconst store = createStore(\n //@ts-ignore\n rootReducers,\n composeWithDevTools(applyMiddleware(sagaMiddleware))\n);\n\nObject.entries(sagas).forEach(([_k, v]) => sagaMiddleware.run(v));\n\nexport { store };\n","import React from \"react\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { logo } from \"../../../images\";\nimport { device } from \"../../../helpers\";\n\nconst Image = styled.img`\n display: block;\n width: 48px;\n\n @media ${device.phone} {\n display: none;\n } ;\n`;\n\nexport default function Logo() {\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Link } from \"react-router-dom\";\nimport { device } from \"../../helpers\";\n\nconst Container = styled.div`\n user-select: none;\n position: absolute;\n left: 32px;\n top: 10px;\n color: #d2d2d2;\n\n @media ${device.phone} {\n position: relative;\n left: auto;\n top: auto;\n text-align: center;\n width: 100%;\n margin-bottom: 5px;\n } ;\n`;\n\nconst LinkA = styled(Link)`\n display: inline-block;\n margin: 0 10px;\n font-size: 14px;\n font-weight: 500;\n color: #8e8e8e;\n text-decoration: none;\n\n span {\n font-weight: 500;\n }\n`;\n\nconst A = styled.a.attrs({\n target: \"_blank\",\n})`\n display: inline-block;\n margin: 0 10px;\n font-size: 14px;\n font-weight: 500;\n color: #8e8e8e;\n text-decoration: none;\n\n span {\n font-weight: 500;\n }\n\n &:first-child {\n margin-right: 0;\n }\n\n &:last-child {\n margin-left: 0;\n }\n\n &:hover span {\n color: #000;\n }\n`;\n\nfunction TopMenu() {\n return (\n \n \n \n \n .\n \n \n \n .\n \n \n \n .\n \n \n \n .\n \n \n \n \n );\n}\n\nexport default TopMenu;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { search } from '../../images';\nimport { connect } from 'react-redux';\nimport { setSearch } from '../../reducers/search/actions';\nimport { navigate } from '../../services';\nimport { device } from '../../helpers';\nimport trimStart from 'lodash/trimStart';\nimport { RouteLocation } from '../../lib/routing/Navigator';\nimport { AppState } from '../../store';\n\nconst Container = styled.div`\n cursor: pointer;\n display: flex;\n flex-direction: row;\n position: relative;\n align-items: center;\n bottom: -2px;\n margin: 0 17px 0 26px;\n padding: 0 19px;\n width: 100%;\n height: 38px;\n font-weight: 500;\n background: ${(p) => (p.focused ? '#fff' : '#ebebeb')};\n border-radius: 24px;\n border: 1px solid #ebebeb;\n transition: all 0.2s ease-in-out;\n\n &:hover {\n border-color: #d1d1d1;\n }\n\n @media ${device.phone} {\n margin: 0;\n }\n`;\n\nconst Image = styled.img`\n width: 18px;\n height: 18px;\n margin-left: 15px;\n`;\n\nconst Input = styled.input`\n border: 0;\n white-space: nowrap;\n font-size: 15px;\n font-weight: 500;\n font-family: urdu;\n height: 38px;\n width: 100%;\n line-height: 26px;\n color: ${(p) => (p.focused ? '#111' : '#838383')};\n background-color: transparent;\n\n &:focus {\n border: 0;\n outline: 0;\n }\n`;\n\nconst mapStateToProps = (state: AppState) => ({\n // @ts-ignore\n search: state.search.get('text') as string,\n});\nconst mapDispatch = { setSearch };\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n location: RouteLocation;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n focused: boolean;\n};\nclass HeaderSearch extends React.Component {\n state = {\n focused: false,\n };\n\n onFocus = () => this.setState({ focused: true });\n onBlur = () => this.setState({ focused: false });\n onChange = (evt: React.ChangeEvent) => {\n const search = trimStart(evt.target.value);\n this.props.setSearch(search);\n\n if (search) {\n navigate.to(`/app/s/${search}`);\n\n const { gtag } = window;\n gtag('event', 'search', {\n event_category: 'header',\n event_label: search,\n });\n } else {\n navigate.to('/app/');\n }\n };\n\n render() {\n return (\n \n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(HeaderSearch);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABGdBTUEAALGPC/xhBQAAAh1JREFUOBGdlE1oE0EUx3fXNWqKSKEHIeCh6kWUqHhr9aREREQxLNFbKzWUQL5uhfYkFPGQj0OEBCGQo7bVQoXcPHjwaLR40LZH6SUXNQSD+fD30t1lJ61ROzB5b977v9/M7MxE14a0bDZ7tdfrTem6Pok9jv2G/AP9hd/vL0ej0V9Oue44XlssFo81m80Kxbe88QF/0zTNcDweF7C2C1SpVEbq9fpbchf6Al1/zkpeG4ax3m63TxCbYBxjEj+2wfhyKpWq7QJlMpkSyRn6D4rvJ5PJNXylFQqFU61Wa4lgENhWIBA4o4D4JuMkvzDbAQQzzPRMIXgG+Xz+dLfbrcnKCM8anpxG8V0b8mkYRGoSicQG5qldbykgIGftxDvb/s04unMKiCpZprSvO2b4Lzvo67BHB0Gf7dLzwxFu1tFtKyDI723JFe7SmCv/g8OnuCMp7BsFFAwGV4FtkBjlQjofck8MpzaFLiRJLmZJOX4J5nK5eY71kfi0NcAPOcHtnaGmsdKDTLIAZI6YSS+n0+lpBQTkGpBVkkecQuxPe8vrFMvNvkR3tl1lNbd5Ji0XBCQE5BWiw/Q2fRHATYov4iuN+HcCj7nRTyzL6kiyD2K/1zudzkvGfQhPI8LTWBYBuUkmkKdwEmiD0Eefz1eNxWLiu01HeAPhCqJDiOVvIcI3WXEV/+iYQB54IBYQ2d5/N4N93qNqmdWE9wuRWX8DZGXWUdDjHy8AAAAASUVORK5CYII=\"","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport styled from \"styled-components\";\n\nimport { isLoggedIn, isMobile, device } from \"../../helpers\";\nimport Logo from \"./Logo\";\nimport TopMenu from \"./TopMenu\";\nimport Search from \"./Search\";\nimport { FormattedMessage } from \"react-intl\";\nimport { getURLParam, RouteLocation } from \"../../lib/routing\";\nimport { AppState } from \"../../store\";\n\nconst Container = styled.div`\n position: fixed;\n z-index: 1000;\n top: 0;\n overflow: hidden;\n height: 100px;\n color: #000;\n background-color: #fafafa;\n border-bottom: 1px solid #ebebeb;\n\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n padding: 0 30px 15px;\n\n @media ${device.phone} {\n padding: 14px 15px 7px 15px;\n height: 136px;\n } ;\n`;\n\nconst Main = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n align-items: flex-end;\n width: 100%;\n\n @media ${device.phone} {\n flex-direction: column;\n align-items: flex-start;\n } ;\n`;\n\nconst Actions = styled.div`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n\n @media ${device.phone} {\n flex-direction: row-reverse;\n justify-content: center;\n width: 100%;\n margin-top: 14px;\n } ;\n`;\n\nconst ButtonBordered = styled(Link)`\n user-select: none;\n cursor: pointer;\n padding: 0 16px;\n border: 1px solid #d8d8d8;\n border-radius: 4px;\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n color: #999;\n height: 33px;\n line-height: 31px;\n text-decoration: none;\n transition: all 0.2s ease-in-out;\n\n &:hover {\n color: #000;\n border-color: #000;\n }\n\n span {\n font-family: Cairo, QuranFont, urdu, sans-serif;\n }\n`;\n\nconst ActionButton = styled(Link)`\n user-select: none;\n cursor: pointer;\n padding: 0 16px;\n border-radius: 2px;\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n color: #fff;\n background-color: #34a962;\n height: 33px;\n line-height: 33px;\n text-decoration: none;\n transition: all 0.2s ease-in-out;\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);\n\n &:hover {\n background-color: #37a866 !important;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);\n }\n\n span {\n font-family: Cairo, QuranFont, urdu, sans-serif;\n }\n\n @media ${device.phone} {\n margin-left: 15px;\n } ;\n`;\n\nconst Spacer = styled.div`\n position: relative;\n width: 20px;\n height: 42px;\n\n @media ${device.phone} {\n display: none;\n } ;\n`;\n\nconst hidePaths = [\"/app/r-\", \"/app/e/\", \"/app/merge/\", \"/app/pdf/\"];\nconst hideMobilePaths = [\n \"/app/login\",\n \"/app/docs\",\n \"/app/doc/create\",\n \"/app/doc/edit\",\n \"/app/doc/meta\",\n \"/app/pages\",\n \"/app/page/edit\",\n \"/app/users\",\n];\n\nfunction hideHeader(path: string, isLoggedIn: boolean) {\n if (!isLoggedIn && path.startsWith(\"/b-170-\")) {\n return true;\n }\n\n for (let i = 0; i < hidePaths.length; i += 1) {\n if (path.startsWith(hidePaths[i])) {\n return true;\n }\n }\n\n if (isMobile()) {\n for (let i = 0; i < hideMobilePaths.length; i += 1) {\n if (path.startsWith(hideMobilePaths[i])) {\n return true;\n }\n }\n\n const fromFB = !!getURLParam(\"fbclid\");\n if (path.startsWith(\"/b-\") && fromFB) {\n return true;\n }\n }\n\n return false;\n}\n\nconst mapStateToProps = (state: AppState) => ({ user: state.user });\ntype StateProps = ReturnType;\ntype OwnProps = {\n location: RouteLocation;\n};\ntype Props = StateProps & OwnProps;\n\nclass Header extends React.Component {\n primaryBtn() {\n if (!isLoggedIn(this.props.user)) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n );\n }\n\n secondaryBtn() {\n if (!isLoggedIn(this.props.user)) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n );\n }\n\n render() {\n const { location } = this.props;\n if (hideHeader(location.pathname, isLoggedIn(this.props.user))) {\n return null;\n }\n\n return (\n \n \n
\n \n \n\n \n {this.secondaryBtn()}\n \n {this.primaryBtn()}\n \n
\n
\n );\n }\n}\n\nexport default connect(mapStateToProps)(Header);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { isUserLoaded } from \"../../helpers/status\";\nimport { checkAuthStatus } from \"../../reducers/user/actions\";\nimport { AppState } from \"../../store\";\n\nconst mapState = (state: AppState) => ({ status: state.status });\nconst mapDispatch = { checkAuthStatus };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n children: JSX.Element | JSX.Element[];\n};\ntype Props = StateProps & DispatchProps & OwnProps;\n\nclass AppUser extends React.Component {\n componentDidMount() {\n this.props.checkAuthStatus(null);\n }\n\n render() {\n if (!isUserLoaded(this.props.status)) {\n return null;\n }\n\n return this.props.children;\n }\n}\n\nexport default connect(mapState, mapDispatch)(AppUser);\n","import { ReducerState } from \"./reducers\";\n\nexport function isUserLoaded(status: ReducerState) {\n return status.get(\"userLoaded\");\n}\n","import { Redirect, Route } from \"react-router\";\nimport React from \"react\";\n\nfunction RedirectTo({\n to = \"/\",\n location: from,\n}: {\n to: string;\n location: string;\n}) {\n return ;\n}\n\nconst AuthRoute = ({\n isAuth,\n component: C,\n ...rest\n}: {\n isAuth: boolean;\n component: any;\n}) => (\n ) =>\n isAuth ? (\n \n ) : (\n \n )\n }\n />\n);\n\nconst AdminRoute = ({\n isAuth,\n isAdmin,\n component: C,\n ...rest\n}: {\n isAuth: boolean;\n isAdmin: boolean;\n component: any;\n}) => (\n ) =>\n isAuth && isAdmin ? (\n \n ) : (\n \n )\n }\n />\n);\n\nfunction pathRoutes({\n paths,\n Page,\n Route,\n ...rest\n}: {\n paths: string[];\n Page: React.Component;\n [x: string]: any;\n}) {\n return paths.map((path) => (\n \n ));\n}\n\nexport function configureRoutes({\n list,\n isAuth = false,\n isAdmin = false,\n ...props\n}: {\n list: Record;\n isAuth: boolean;\n isAdmin: boolean;\n [x: string]: any;\n}): any {\n return Object.keys(list).map((p) => {\n const { paths, requiresAuth, requiresAdmin } = list[p];\n const Page = list[p];\n\n if (!requiresAuth && !requiresAdmin) {\n return pathRoutes({ ...props, paths, Page, Route: Route });\n }\n\n if (requiresAdmin) {\n return pathRoutes({\n ...props,\n paths,\n Page,\n Route: AdminRoute,\n isAuth,\n isAdmin,\n });\n }\n\n if (requiresAuth) {\n return pathRoutes({ paths, Page, Route: AuthRoute, isAuth });\n }\n\n return null;\n });\n}\n","import { navigate } from \"../../services\";\nimport { BTN_MEDIUM, Button, ButtonGroup, TYPE_FAILURE } from \"../../lib\";\n\nexport default function LogoutLink() {\n return (\n \n navigate.to(\"/app/logout\")}\n />\n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { device } from \"../../helpers\";\n\nexport const ContentWrapper = styled.div`\n display: flex;\n flex-direction: column;\n margin-top: 100px;\n width: 100%;\n\n @media ${device.phone} {\n margin-top: ${(p) => (p.isLandingPage ? 0 : 146)}px;\n } ;\n`;\n\ntype TemplateContent = {\n isLandingPage?: boolean;\n children: JSX.Element | JSX.Element[];\n};\nexport const Content = ({\n isLandingPage = false,\n children,\n}: TemplateContent) => (\n {children}\n);\n\nexport * from \"./Header\";\nexport * from \"./LogoutLink\";\n\nexport const Container = styled.div<{\n width?: string;\n margin?: string;\n}>`\n display: flex;\n flex-direction: column;\n width: ${(p) => p.width || \"80%\"};\n margin: ${(p) => p.margin || \"40px auto\"};\n\n @media ${device.phone} {\n margin: 20px auto;\n width: 95%;\n } ;\n`;\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { notification } from \"../../services\";\nimport { checkAuth } from \"../../reducers/user/actions\";\nimport { authRedirect } from \"../../helpers\";\nimport { Form } from \"../../lib\";\nimport { AppState } from \"../../store\";\n\nconst mapState = (state: AppState) => ({ user: state.user });\nconst mapDispatch = { checkAuth };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype Props = StateProps & DispatchProps;\ntype State = {};\ntype Snapshot = Props & State;\n\nclass LoginForm extends React.Component {\n componentDidMount() {\n authRedirect(this.props);\n }\n\n componentDidUpdate(\n _prevProps: Props,\n _prevState: State,\n _snapshot: Snapshot\n ) {\n authRedirect(this.props);\n }\n\n order = [\"email\", \"password\"];\n\n fields = {\n email: {\n type: \"email\",\n },\n password: {\n type: \"password\",\n },\n };\n\n constraints = {\n email: {\n presence: { message: \"emailRequired\" },\n email: { message: \"emailInvalid\" },\n },\n\n password: {\n presence: { message: \"passwordRequired\" },\n length: {\n minimum: 6,\n message: \"passwordMinChars\",\n },\n },\n };\n\n onSubmit = (values: Record) => {\n try {\n this.props.checkAuth(values);\n } catch (e) {\n notification.set(\"loginForm.failed\", \"f\");\n }\n };\n\n render() {\n return (\n \n );\n }\n}\n\nexport default connect(mapState, mapDispatch)(LoginForm);\n","import React from \"react\";\nimport { Form, FORM_CLEAR, FORM_END_PROCESSING } from \"../../lib\";\nimport { eventEmitter, notification } from \"../../services\";\nimport { User } from \"../../models\";\nimport { Constraints, Fields } from \"./types\";\n\ntype Props = {};\nexport class ResetPasswordForm extends React.Component {\n private order = [\"email\"];\n\n private fields: Fields = {\n email: {\n type: \"email\",\n value: \"\",\n },\n };\n\n private constraints: Constraints = {\n email: {\n presence: { message: \"emailRequired\" },\n email: { message: \"emailInvalid\" },\n },\n };\n\n constructor(props: Props) {\n super(props);\n this.onSubmit = this.onSubmit.bind(this);\n }\n\n async onSubmit(value: Record) {\n try {\n await User.save(value, \"reset-password\");\n eventEmitter.emit(FORM_END_PROCESSING);\n eventEmitter.emit(FORM_CLEAR);\n notification.set(\"resetPasswordForm.success\", \"s\");\n } catch (e) {\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"resetPasswordForm.failed\", \"f\");\n }\n }\n\n render() {\n return (\n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { saveUser } from \"../../reducers/user/actions\";\nimport { navigate } from \"../../services\";\nimport { Form } from \"../../lib\";\nimport { Constraints, Fields } from \"./types\";\nimport { AppState } from \"../../store\";\n\nconst mapStateToProps = (state: AppState) => ({ user: state.user });\nconst mapDispatchToProps = { saveUser };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatchToProps;\ntype Props = StateProps & DispatchProps;\n\nclass EditProfileForm extends React.Component {\n private order = [\"name\", \"email\", \"password\", \"confirmPassword\"];\n\n private fields: Fields = {\n name: {\n type: \"text\",\n },\n email: {\n type: \"email\",\n },\n password: {\n type: \"password\",\n },\n confirmPassword: {\n type: \"password\",\n },\n };\n\n private constraints: Constraints = {\n name: {\n presence: { message: \"nameRequired\" },\n length: {\n minimum: 3,\n message: \"nameMinChars\",\n },\n },\n\n email: {\n presence: { message: \"emailRequired\" },\n email: { message: \"emailInvalid\" },\n },\n\n password: {\n presence: { message: \"passwordRequired\" },\n },\n\n confirmPassword: function (\n value,\n attrs,\n _attrName,\n _options,\n _constraints\n ) {\n if (attrs.password.length === 0) {\n return {};\n }\n\n if (attrs.password.length > 0 && attrs.password.length < 6) {\n return {\n presence: { message: \"passwordRequired\" },\n length: {\n minimum: 6,\n message: \"passwordMinChars\",\n },\n };\n }\n\n if (attrs.password !== value) {\n return {\n presence: { message: \"confirmPasswordRequired\" },\n equality: {\n attribute: \"password\",\n message: \"confirmPasswordSameAsPassword\",\n },\n };\n }\n },\n };\n\n onSubmit = (values: Record) => this.props.saveUser(values);\n\n onCancel = () => navigate.to(\"/app/docs\");\n\n render() {\n return (\n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditProfileForm);\n","import React from \"react\";\nimport { Form, FORM_END_PROCESSING } from \"../../lib\";\nimport { Doc, DocMeta, Tag } from \"../../models\";\nimport { navigate, eventEmitter, notification, i18n } from \"../../services\";\nimport { Map } from \"immutable\";\nimport styled from \"styled-components\";\nimport { fixArabicText } from \"../../helpers/text\";\nimport { connect } from \"react-redux\";\nimport { isUserAdmin } from \"../../helpers\";\nimport { Fields, Constraints } from \"./types\";\nimport { AxiosResponse } from \"axios\";\nimport { AppState } from \"../../store\";\nimport { RouteMatch } from \"../../lib/routing/Navigator\";\n\nconst Container = styled.div`\n margin: 0 auto 60px auto;\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n`;\n\nconst mapStateToProps = (state: AppState) => ({ user: state.user });\ntype StateProps = ReturnType;\ntype OwnProps = {\n doc_id: number;\n match: RouteMatch;\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n doc: {\n name: string;\n };\n doc_meta: Record;\n};\n\ntype DocMetaFields = {\n authors: string;\n intro: string;\n cover: string;\n tags: number[];\n};\nclass DocMetaForm extends React.Component {\n private order = [\"authors\", \"intro\", \"cover\"];\n\n private fields: Fields = {\n authors: {\n type: \"text\",\n value: \"\",\n },\n intro: {\n type: \"textarea\",\n value: \"\",\n },\n cover: {\n type: \"file\",\n accept: [\".png\", \"image/png\", \".jpeg\", \"image/jpeg\"],\n },\n };\n\n private constraints: Constraints = {\n authors: {\n presence: { message: \"authorsRequired\" },\n length: {\n minimum: 3,\n message: \"authorsMinChars\",\n },\n },\n intro: {\n presence: { message: \"introRequired\" },\n length: {\n minimum: 10,\n message: \"introMinChars\",\n },\n },\n };\n\n constructor(props: Props) {\n super(props);\n this.onSubmit = this.onSubmit.bind(this);\n\n if (isUserAdmin(this.props.user)) {\n this.order = [\"authors\", \"tags\", \"intro\", \"cover\"];\n this.fields.tags = {\n type: \"pills\",\n value: [],\n values: [],\n labels: [i18n.get(\"form.selectEmptyLabel\")],\n };\n\n this.constraints.tags = {\n presence: { message: \"tagsRequired\" },\n length: {\n minimum: 1,\n maximum: 3,\n message: \"tagsCount_1_3\",\n },\n };\n }\n\n this.state = {\n doc: {\n name: \"\",\n },\n doc_meta: {\n authors: \"\",\n tags: [],\n intro: \"\",\n cover: \"\",\n },\n };\n }\n\n async componentDidMount() {\n await this.fetch();\n }\n\n async fetch() {\n try {\n const { doc_id } = this.props;\n const {\n data: tags,\n }: AxiosResponse<\n Array<{\n id: number;\n name: string;\n }>\n > = await Tag.list();\n const { data: doc }: AxiosResponse = await Doc.fetch(doc_id);\n const {\n data,\n }: AxiosResponse<\n Array<{\n name: string;\n value: string | number[];\n }>\n > = await DocMeta.list({ doc_id });\n\n let doc_meta = this.state.doc_meta;\n\n if (isUserAdmin(this.props.user)) {\n const values: number[] = [];\n const labels: string[] = [];\n tags.forEach((t) => {\n values.push(t.id);\n labels.push(t.name);\n });\n\n this.fields.tags.values = values;\n this.fields.tags.labels = labels;\n }\n\n this.fields = {\n ...this.fields,\n };\n\n for (const item of data) {\n let { name, value } = item;\n if (this.order.includes(name)) {\n if (name === \"cover\") {\n value = DocMeta.url(\"GET\", \"cover\", { doc_id });\n } else if (name === \"tags\" && typeof value === \"string\") {\n value = value.split(\",\").map((v) => parseInt(v));\n }\n\n doc_meta[name] = value;\n }\n }\n\n this.setState({ doc, doc_meta });\n } catch (e) {\n console.warn(\"fetch\", e);\n }\n }\n\n async onSubmit(values: Record) {\n try {\n const { doc_id } = this.props;\n const { authors, intro, cover } = values;\n const data: Partial = {\n authors,\n intro,\n };\n\n if (isUserAdmin(this.props.user)) {\n data.tags = values.tags;\n }\n\n await DocMeta.create(data, { doc_id });\n\n if (typeof cover !== \"string\") {\n const formData = new FormData();\n formData.append(\"file\", cover);\n await DocMeta.upload(formData, { doc_id });\n }\n\n eventEmitter.emit(FORM_END_PROCESSING);\n notification.set(\"docMetaForm.saved\", \"s\");\n\n await this.fetch();\n } catch (e) {\n console.warn(e);\n }\n }\n\n onCancel = () => navigate.to(\"/app/docs\");\n\n render() {\n let description = undefined;\n if (this.state.doc !== null) {\n description = fixArabicText(this.state.doc!.name);\n }\n\n return (\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps)(DocMetaForm);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n createPage,\n fetchPage,\n fetchPages,\n savePage,\n} from \"../../reducers/pages/actions\";\nimport { Form, getURLParam, FORM_END_PROCESSING } from \"../../lib\";\nimport { i18n, navigate, eventEmitter } from \"../../services\";\nimport { Constraints, Fields, Editing } from \"./types\";\nimport { Map } from \"immutable\";\nimport { AppState } from \"../../store\";\n\ninterface OwnProps {\n doc_id: number;\n page_id: number;\n editing: Editing;\n}\ntype PagesList = ReturnType;\nconst mapState = (state: AppState, { doc_id, page_id }: OwnProps) => {\n const list = state.pages as PagesList;\n //@ts-ignore\n const page = list.get(page_id);\n const pages = list.filter((p: any) => p.get(\"doc_id\") === doc_id);\n\n return { page, pages };\n};\nconst mapDispatch = { fetchPage, fetchPages, createPage, savePage };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps & DispatchProps & OwnProps;\n\nclass PageForm extends React.Component {\n private order = [\"name\", \"parent_id\"];\n\n private fields: Fields = {\n name: {\n type: \"text\",\n },\n parent_id: {\n type: \"select\",\n value: parseInt(getURLParam(\"parent_id\")!) || 0,\n values: [0],\n labels: [i18n.get(\"form.selectEmptyLabel\")],\n },\n };\n\n private constraints: Constraints = {\n name: {\n presence: { message: \"nameRequired\" },\n length: {\n minimum: 3,\n message: \"nameMinChars\",\n },\n },\n };\n\n componentDidMount() {\n const { doc_id } = this.props;\n this.props.fetchPages({ doc_id });\n\n if (this.props.editing === \"Edit\") {\n this.order = [\"name\", \"parent_id\", \"status\"];\n this.fields.status = {\n type: \"select\",\n value: \"PUBLISHED\",\n values: [\"DRAFT\", \"PUBLISHED\"],\n };\n }\n\n eventEmitter.on(FORM_END_PROCESSING, () =>\n this.props.fetchPages({ doc_id })\n );\n }\n\n componentWillReceiveProps(nextProps: Props) {\n this.fillPages(nextProps.pages as any);\n }\n\n fillPages = (pages: PagesList) => {\n const values = [0];\n const indents = [0];\n const hasChildren = [false];\n const labels = [i18n.get(\"form.selectEmptyLabel\")];\n\n pages.forEach((p: any) => {\n hasChildren.push(p.get(\"_hasChildren\"));\n indents.push(parseInt(p.get(\"_indent\")));\n values.push(p.get(\"id\"));\n labels.push(p.get(\"name\"));\n });\n\n this.fields.parent_id.hasChildren = hasChildren;\n this.fields.parent_id.indents = indents;\n this.fields.parent_id.values = values;\n this.fields.parent_id.labels = labels;\n this.fields = {\n ...this.fields,\n };\n };\n\n onSubmit = (values: Record) => {\n const { doc_id, page_id, editing } = this.props;\n\n if (editing === \"Edit\") {\n this.props.savePage({\n doc_id,\n page_id,\n data: values,\n redirect: false,\n });\n } else {\n this.props.createPage({\n doc_id,\n data: {\n ...values,\n status: \"PUBLISHED\",\n },\n redirect: getURLParam(\"redirect\") || false,\n });\n }\n };\n\n onCancel = () => navigate.to(`/app/pages/${this.props.doc_id}`);\n\n render() {\n return (\n \n );\n }\n}\n\nexport default connect(mapState, mapDispatch)(PageForm);\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport {\n createDocUser,\n saveDocUser,\n fetchDocUser,\n} from \"../../reducers/doc_users/actions\";\nimport { Form, Progress, RouteMatch } from \"../../lib\";\nimport { navigate } from \"../../services\";\nimport { UD_EDITOR, UD_AUTHOR, UD_REVIEWER } from \"../../settings\";\nimport { Editing, Fields, Constraints } from \"./types\";\nimport { AppState } from \"../../store\";\n\nconst Container = styled.div`\n margin: 0 auto 60px auto;\n width: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n`;\n\ntype OwnProps = {\n doc_id: number;\n user_id: number;\n editing: Editing;\n match: RouteMatch;\n};\nconst mapStateToProps = (state: AppState, { doc_id, user_id }: OwnProps) => ({\n user: state.user,\n //@ts-ignore\n loggedInDocUser: state.doc_users.get(`${doc_id}-${state.user.get(\"id\")}`),\n //@ts-ignore\n doc_user: state.doc_users.get(`${doc_id}-${user_id}`),\n});\nconst mapDispatch = { createDocUser, saveDocUser, fetchDocUser };\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype Props = StateProps & DispatchProps & OwnProps;\n\ntype State = {\n loading: boolean;\n};\n\nclass DocUserForm extends React.Component {\n private order = [\"name\", \"status\"];\n private fields: Fields = {};\n private constraints: Constraints = {};\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n loading: true,\n };\n\n if (props.editing === \"Edit\") {\n this.fields = {\n name: {\n type: \"text\",\n readOnly: true,\n },\n status: {\n type: \"select\",\n value: UD_REVIEWER,\n values: [UD_AUTHOR, UD_REVIEWER],\n },\n };\n } else {\n this.order = [\"email\", \"status\"];\n\n this.fields = {\n email: {\n type: \"text\",\n },\n status: {\n type: \"select\",\n value: UD_REVIEWER,\n values: [UD_AUTHOR, UD_REVIEWER],\n },\n };\n\n this.constraints = {\n email: {\n presence: { message: \"emailRequired\" },\n email: { message: \"emailInvalid\" },\n },\n };\n }\n }\n\n componentDidMount() {\n const { user, doc_id, user_id, editing } = this.props;\n\n // fetch user status, the one editing the form\n //@ts-ignore\n this.props.fetchDocUser({ doc_id, user_id: user.get(\"id\") });\n\n if (editing === \"Edit\") {\n // fetching user in edit mode\n this.props.fetchDocUser({ doc_id, user_id });\n }\n }\n\n componentWillReceiveProps(nextProps: Props) {\n const { loggedInDocUser } = nextProps;\n if (loggedInDocUser) {\n const status = (loggedInDocUser as any).get(\"status\");\n\n if (![UD_EDITOR, UD_AUTHOR].includes(status)) {\n return navigate.to(\"/app/docs\");\n }\n\n let statusValues = [UD_EDITOR, UD_AUTHOR, UD_REVIEWER];\n if (status === UD_AUTHOR) {\n statusValues = [UD_AUTHOR, UD_REVIEWER];\n }\n this.fields.status.values = statusValues;\n\n this.setState({\n loading: false,\n });\n }\n }\n\n onSubmit = (values: Record) => {\n const { editing, doc_id, user_id } = this.props;\n if (editing === \"Edit\") {\n this.props.saveDocUser({\n doc_id,\n user_id,\n data: values,\n });\n } else {\n // TODO\n this.props.createDocUser({\n doc_id,\n data: values,\n });\n }\n };\n\n onCancel = () => navigate.to(`/app/users/${this.props.doc_id}`);\n\n render() {\n if (this.state.loading) {\n return ;\n }\n\n return (\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(DocUserForm);\n","import React from \"react\";\nimport { KEY_ENTER, KEY_ESC } from \"../../lib\";\nimport styled from \"styled-components\";\n\nconst Input = styled.input`\n margin: 0;\n padding: 0;\n border: 0;\n background-color: transparent;\n outline: none;\n font-family: urdu, sans-serif;\n background-color: transparent;\n`;\n\ntype Props = {\n value: string;\n onChange: (value: string) => void;\n};\ntype State = {\n value: string;\n editable: boolean;\n};\n\nexport class EditableText extends React.Component {\n private input: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n value: \"\",\n editable: false,\n };\n\n this.input = React.createRef();\n }\n\n onClick = () => {\n this.setState(\n {\n editable: true,\n value: this.props.value,\n },\n () => {\n if (this.input && this.input.current) {\n this.input.current.focus();\n }\n }\n );\n };\n\n onChange = (evt: React.ChangeEvent) => {\n this.setState({\n value: evt.target.value,\n });\n };\n\n onKeyUp = (evt: React.KeyboardEvent) => {\n if (evt.key === KEY_ENTER) {\n this.setState(\n {\n editable: false,\n },\n () => this.props.onChange(this.state.value)\n );\n } else if (evt.key === KEY_ESC) {\n this.setState({\n editable: false,\n value: this.props.value,\n });\n }\n };\n\n render() {\n if (this.state.editable) {\n return (\n
\n \n
\n );\n }\n\n return
{this.props.value}
;\n }\n}\n","import React from \"react\";\nimport { eventEmitter } from \"../../services\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\n\nimport { NOTIFICATION_SET, NOTIFICATION_CLEAR, COLORS } from \"../../lib\";\n\nconst Wrapper = styled.div<{\n type: string;\n}>`\n width: 100%;\n font-size: 14px;\n margin: 20px 0 40px 0;\n padding: 10px 15px;\n border-radius: 2px;\n border: 1px solid ${(p) => COLORS[p.type][\"borderColor\"]};\n background-color: ${(p) => COLORS[p.type][\"backgroundColor\"]};\n color: ${(p) => COLORS[p.type][\"color\"]};\n text-align: center;\n`;\n\ntype Props = {};\ntype State = {\n type: string;\n messageId: string;\n};\n\nexport class FormNotification extends React.Component {\n state = {\n type: \"\",\n messageId: \"\",\n };\n\n onNotificationSet = ({ type, messageId }: State) =>\n this.setState({ type, messageId });\n\n onNotificationClear = () =>\n this.setState({\n type: \"\",\n messageId: \"\",\n });\n\n componentDidMount() {\n eventEmitter.on(NOTIFICATION_SET, this.onNotificationSet);\n eventEmitter.on(NOTIFICATION_CLEAR, this.onNotificationClear);\n }\n\n componentWillUnmount() {\n eventEmitter.off(NOTIFICATION_SET, this.onNotificationSet);\n eventEmitter.off(NOTIFICATION_CLEAR, this.onNotificationClear);\n }\n\n render() {\n const { type, messageId } = this.state;\n if (!type || !messageId) {\n return null;\n }\n\n return (\n \n \n \n );\n }\n}\n","import { CTX_MORE, CTX_TEXT_SIZE } from \"../../Toolbar\";\n\nexport const S_NEW_PAGE = \"shortcut/newPage\";\nexport const S_LINK = \"shortcut/link\";\nexport const S_IMAGE = \"shortcut/image\";\nexport const S_ALIGN_LEFT = \"shortcut/leftAlign\";\nexport const S_ALIGN_RIGHT = \"shortcut/rightAlign\";\nexport const S_ALIGN_CENTER = \"shortcut/centerAlign\";\nexport const S_LTR = \"shortcut/ltr\";\nexport const S_RTL = \"shortcut/rtl\";\nexport const S_ARABIC = \"shortcut/arabic\";\nexport const S_TEXTSIZE_1 = \"shortcut/textSize1\";\nexport const S_TEXTSIZE_2 = \"shortcut/textSize2\";\nexport const S_TEXTSIZE_3 = \"shortcut/textSize3\";\nexport const S_TEXTSIZE_4 = \"shortcut/textSize4\";\nexport const S_TEXTSIZE_5 = \"shortcut/textSize5\";\nexport const S_TEXTSIZE_6 = \"shortcut/textSize6\";\nexport const S_SOURCE_CODE = \"shortcut/sourceCode\";\nexport const S_REMOVE_FORMAT = \"shortcut/removeFormat\";\n\nconst table: Record = {\n \"alt+ctrl+n\": S_NEW_PAGE, // alt+ctrl+n\n \"ctrl+k\": S_LINK, // ctrl+k\n \"ctrl+i\": S_IMAGE, // ctrl+i\n \"ctrl+[\": S_ALIGN_LEFT, // ctrl+[\n \"ctrl+]\": S_ALIGN_RIGHT, // ctrl+]\n \"ctrl+.\": S_ALIGN_CENTER, // ctrl+.\n \"ctrl+shift+e\": S_LTR, // ctrl+shift+e\n \"ctrl+shift+u\": S_RTL, // ctrl+shift+u\n \"ctrl+shift+a\": S_ARABIC, // ctrl+shift+a\n \"ctrl+shift+c\": S_SOURCE_CODE, // ctrl+shift+c\n \"ctrl+shift+d\": S_REMOVE_FORMAT, // ctrl+shift+d\n \"ctrl+shift+1\": S_TEXTSIZE_1, // ctrl+shift+1\n \"ctrl+shift+2\": S_TEXTSIZE_2, // ctrl+shift+2\n \"ctrl+shift+3\": S_TEXTSIZE_3, // ctrl+shift+3\n \"ctrl+shift+4\": S_TEXTSIZE_4, // ctrl+shift+4\n \"ctrl+shift+5\": S_TEXTSIZE_5, // ctrl+shift+5\n \"ctrl+shift+6\": S_TEXTSIZE_6, // ctrl+shift+6\n};\n\nfunction getContext(code: string | null) {\n if (!code) {\n return null;\n }\n\n if ([S_RTL, S_LTR, S_SOURCE_CODE, S_REMOVE_FORMAT].includes(code)) {\n return CTX_MORE;\n }\n\n if (\n [\n S_TEXTSIZE_1,\n S_TEXTSIZE_2,\n S_TEXTSIZE_3,\n S_TEXTSIZE_4,\n S_TEXTSIZE_5,\n S_TEXTSIZE_6,\n ].includes(code)\n ) {\n return CTX_TEXT_SIZE;\n }\n\n return null;\n}\n\nexport function isShortcut(evt: KeyboardEvent) {\n const shortcut: string[] = [];\n\n if (evt.altKey) {\n shortcut.push(\"alt\");\n }\n\n if (evt.ctrlKey) {\n shortcut.push(\"ctrl\");\n }\n\n if (evt.shiftKey) {\n shortcut.push(\"shift\");\n }\n\n shortcut.push(evt.key);\n\n const s = shortcut.join(\"+\");\n\n return {\n code: Object.keys(table).includes(s) ? table[s] : null,\n context: getContext(table[s]),\n };\n}\n","import { contentHash } from \"../../helpers\";\n\ntype Props = {\n doc_id: number;\n page_id: number;\n};\nexport function pageOrDocChanged(currentProps: Props, nextProps: Props) {\n let current_doc_id = currentProps.doc_id;\n let current_page_id = currentProps.page_id;\n\n let next_doc_id = nextProps.doc_id;\n let next_page_id = nextProps.page_id;\n\n return current_doc_id !== next_doc_id || current_page_id !== next_page_id;\n}\n\nexport function getIds(props: Props) {\n return {\n doc_id: props.doc_id,\n page_id: props.page_id,\n };\n}\n\nexport function compareHashWithContents(hash: string, contents: string) {\n return hash === contentHash(contents);\n}\n","import styled from \"styled-components\";\nexport const ID_EDITOR_CONTENTS = \"editor-contents\";\n\nexport const Container = styled.div.attrs({\n id: ID_EDITOR_CONTENTS,\n})<{\n enableDarkTheme?: boolean;\n}>`\n position: fixed;\n top: 140px;\n right: 20%;\n bottom: 100px;\n width: 60%;\n color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#000\")};\n\n & > div:first-child {\n display: block;\n width: 100%;\n height: 100%;\n outline: none;\n overflow: auto;\n overflow-x: hidden;\n font-size: 19px;\n font-family: urdu;\n font-weight: 500;\n line-height: 170%;\n text-align: right;\n }\n\n div {\n font-weight: 500;\n }\n\n img {\n max-width: 100%;\n }\n\n blockquote {\n margin: 40px 0;\n padding: 20px;\n color: ${(p) => (p.enableDarkTheme ? \"#666\" : \"#fff\")};\n background-color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#666\")};\n\n * {\n font-weight: 500;\n }\n }\n\n code {\n display: block;\n direction: ltr;\n margin: 40px 0;\n padding: 10px 0 10px 15px;\n border-left: 4px solid #ccc;\n width: 100%;\n font-size: 13px;\n text-align: left;\n line-height: 150%;\n color: ${(p) => (p.enableDarkTheme ? \"#666\" : \"#666\")};\n background-color: #f3f3f3;\n font-family: \"Source Code Pro\", monospace;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin: 15px 0;\n }\n\n b,\n strong {\n font-weight: 700;\n }\n\n a {\n color: #4d8cf5;\n text-decoration: none;\n }\n\n ol {\n list-style: arabic-indic;\n }\n\n ul > li {\n list-style-type: circle;\n }\n\n .ltr-text {\n direction: ltr;\n font-family: Roboto, sans-serif;\n }\n .ltr-text b,\n .ltr-text strong {\n font-weight: 700;\n }\n\n div.ltr-text,\n span.ltr-text {\n font-size: 17px;\n }\n\n h1 span.ltr-text,\n h2 span.ltr-text,\n h3 span.ltr-text,\n h4 span.ltr-text,\n h5 span.ltr-text,\n h6 span.ltr-text {\n font-size: inherit;\n }\n\n .rtl-text {\n direction: rtl;\n }\n\n .__change-added {\n color: #3c763d;\n background-color: #dff0d8;\n }\n\n .__change-removed {\n color: #a94442;\n background-color: #f2dede;\n }\n`;\n\nexport default Container;\n","import React from \"react\";\nimport { OrderedSet } from \"immutable\";\nimport { connect } from \"react-redux\";\nimport debounce from \"lodash/debounce\";\nimport { PageContents } from \"../../../models\";\nimport { setAutoComplete } from \"../../../reducers/autocomplete/actions\";\nimport {\n setDocLastOpened,\n removeDocLastOpened,\n} from \"../../../reducers/settings/actions\";\n\nimport { eventEmitter, autoComplete, navigate } from \"../../../services\";\nimport { contentHash } from \"../../../helpers\";\nimport { areDevToolOpen } from \"../../../lib\";\nimport {\n getVisibilityProps,\n EVT_WIN_BEFOREUNLOAD,\n EVT_WIN_RESIZE,\n AUTOCOMPLETE_SELECT,\n AUTOCOMPLETE_REPLACE_VALUE,\n KEY_UP_ARROW,\n KEY_DOWN_ARROW,\n KEY_ENTER,\n KEY_TAB,\n KEY_ESC,\n KEY_P,\n KEY_N,\n CHARS_URDU,\n} from \"../../../lib\";\nimport { getIds, pageOrDocChanged, compareHashWithContents } from \"../helpers\";\nimport {\n getAutoCompleteList,\n updateAutoCompleteList,\n isAutoCompleteCancelKey,\n getWordForAutoComplete,\n replaceAutoCompleteWord,\n} from \"./helpers\";\nimport {\n hideToolbar,\n onEnterInContentEditable,\n} from \"../Toolbar/tools/commands\";\n\nimport Container from \"./styles\";\nimport { AxiosResponse } from \"axios\";\nimport { AppState } from \"../../../store\";\n\nexport const EVT_EDITOR_CONTENTS_SAVE = \"editor/contentsSave\";\n\nconst { visibilityChange } = getVisibilityProps();\nconst KEYDOWN_AUTOCOMPLETE_KEYS = [\n KEY_UP_ARROW,\n KEY_DOWN_ARROW,\n KEY_ENTER,\n KEY_TAB,\n KEY_ESC,\n];\n\nconst mapDispatch = {\n setAutoComplete,\n setDocLastOpened,\n removeDocLastOpened,\n};\n\nconst mapStateToProps = (state: AppState, { doc_id }: OwnProps) => {\n const { autocomplete, pages } = state;\n\n //@ts-ignore\n const pagesFiltered = pages.filter(\n (p: any) => (p.get(\"doc_id\") as number) === doc_id\n );\n //@ts-ignore\n const autoCompleteFiltered = autocomplete.filter((_v: any, k: any) => {\n const temp = k.split(\"-\");\n const acDocId = parseInt(temp[0]);\n if (acDocId !== doc_id) {\n return false;\n }\n\n const acPageId = parseInt(temp[1]);\n return pagesFiltered.has(acPageId);\n });\n\n return {\n pages: pagesFiltered,\n autocomplete: autoCompleteFiltered,\n };\n};\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n readOnly: boolean;\n enableDarkTheme: boolean;\n};\n\ntype State = {\n devToolsOpen: boolean;\n counter: number;\n};\n\ntype Props = StateProps & DispatchProps & OwnProps;\n\nclass Contents extends React.Component {\n private contents: string = \"\";\n private lastSaveHash: string = \"\";\n\n private askingAutoComplete: boolean = false;\n private autoCompleteSet = OrderedSet();\n\n private field: React.RefObject;\n private save: ReturnType;\n private refreshAutoComplete: ReturnType;\n\n constructor(props: Props) {\n super(props);\n\n this.field = React.createRef();\n\n this.state = {\n devToolsOpen: areDevToolOpen(),\n counter: 0,\n };\n\n this.save = debounce(this._save, 5 * 1000);\n this.refreshAutoComplete = debounce(\n this._refreshAutoComplete,\n 5 * 1000\n );\n }\n\n fetch = async (props: Props) => {\n const { doc_id, page_id } = getIds(props);\n try {\n const { data: contents }: AxiosResponse =\n await PageContents.fetch(page_id, {\n doc_id,\n });\n this.contents = contents;\n const list = getAutoCompleteList(contents);\n this.props.setAutoComplete({ doc_id, page_id, list });\n this.props.setDocLastOpened({ doc_id, page_id });\n this.setState({ counter: this.state.counter + 1 });\n } catch (e) {\n console.log(\"e\");\n console.log(e);\n //@ts-ignore\n if (e.request.status === 404) {\n this.props.removeDocLastOpened({ doc_id });\n navigate.to(\"/app/docs\");\n }\n }\n };\n\n _refreshAutoComplete = (contents: string) => {\n const list = getAutoCompleteList(contents);\n const { doc_id, page_id } = getIds(this.props);\n this.props.setAutoComplete({ doc_id, page_id, list });\n };\n\n componentDidMount() {\n this.focus();\n this.fetch(this.props);\n\n window.addEventListener(visibilityChange, this.onVisibilityChange);\n window.addEventListener(EVT_WIN_BEFOREUNLOAD, this.onWinBeforeUnload);\n window.addEventListener(EVT_WIN_RESIZE, this.onWinResize);\n eventEmitter.on(EVT_EDITOR_CONTENTS_SAVE, this.onEitorContentsSave);\n eventEmitter.on(\n AUTOCOMPLETE_REPLACE_VALUE,\n this.replaceValueFromAutoComplete\n );\n }\n\n componentWillUnmount() {\n this.save.flush();\n autoComplete.clear();\n this.refreshAutoComplete.flush();\n\n window.removeEventListener(visibilityChange, this.onVisibilityChange);\n window.removeEventListener(\n EVT_WIN_BEFOREUNLOAD,\n this.onWinBeforeUnload\n );\n window.removeEventListener(EVT_WIN_RESIZE, this.onWinResize);\n eventEmitter.off(EVT_EDITOR_CONTENTS_SAVE, this.onEitorContentsSave);\n eventEmitter.off(\n AUTOCOMPLETE_REPLACE_VALUE,\n this.replaceValueFromAutoComplete\n );\n }\n\n componentWillReceiveProps(nextProps: Props, nextState: State) {\n if (pageOrDocChanged(this.props, nextProps)) {\n this.save.flush();\n hideToolbar();\n this.fetch(nextProps);\n }\n\n nextProps.autocomplete.valueSeq().forEach((v: any) => {\n this.autoCompleteSet = this.autoCompleteSet.merge(v);\n });\n updateAutoCompleteList(this.autoCompleteSet);\n }\n\n shouldComponentUpdate(nextProps: Props, nextState: State) {\n return (\n this.state.counter !== nextState.counter ||\n this.state.devToolsOpen !== nextState.devToolsOpen ||\n this.props.enableDarkTheme !== nextProps.enableDarkTheme\n );\n }\n\n _save = async () => {\n const contents = this.contents;\n\n // prevent, accident errors sending blank state to server\n // until server level versioning is enabled this check must be here\n if (!contents) {\n return;\n }\n\n if (!compareHashWithContents(this.lastSaveHash, contents)) {\n this.lastSaveHash = contentHash(contents);\n\n try {\n const { doc_id, page_id } = getIds(this.props);\n await PageContents.save({ contents }, page_id, { doc_id });\n } catch (e) {\n console.log(e);\n }\n }\n };\n\n onEitorContentsSave = () => {\n if (this.field && this.field.current) {\n this.onChange(this.field.current.innerHTML);\n }\n };\n\n onWinBeforeUnload = () => this.save.flush();\n\n onWinResize = () => this.setState({ devToolsOpen: areDevToolOpen() });\n\n onVisibilityChange = () => {\n if (document.hidden) {\n this.save.flush();\n }\n };\n\n onChange = (contents: string) => {\n this.contents = contents;\n this.save();\n this.refreshAutoComplete(contents);\n };\n\n onKeyDown = (evt: React.KeyboardEvent) => {\n const key = evt.key.toUpperCase();\n\n if (autoComplete.isVisible()) {\n if (evt.ctrlKey && [KEY_P, KEY_N].includes(key)) {\n if (key === KEY_P) {\n autoComplete.prev();\n } else if (key === KEY_N) {\n autoComplete.next();\n }\n\n evt.preventDefault();\n return false;\n }\n\n if (KEYDOWN_AUTOCOMPLETE_KEYS.includes(key)) {\n if (key === KEY_UP_ARROW) {\n autoComplete.prev();\n } else if (key === KEY_DOWN_ARROW) {\n autoComplete.next();\n } else if (key === KEY_TAB || key === KEY_ENTER) {\n eventEmitter.emit(AUTOCOMPLETE_SELECT);\n autoComplete.hide();\n } else if (key === KEY_ESC) {\n autoComplete.hide();\n }\n\n evt.preventDefault();\n return false;\n }\n\n if (isAutoCompleteCancelKey(key)) {\n autoComplete.hide();\n }\n }\n };\n\n clearAskingAutoComplete = () => (this.askingAutoComplete = false);\n onKeyUp = (evt: React.KeyboardEvent) => {\n const key = evt.key;\n\n if (!this.askingAutoComplete && CHARS_URDU.includes(key)) {\n const word = getWordForAutoComplete();\n if (word && word.length > 0) {\n this.askingAutoComplete = true;\n autoComplete.ask(word);\n\n setTimeout(this.clearAskingAutoComplete, 250);\n }\n }\n\n if (key === KEY_ENTER) {\n onEnterInContentEditable();\n }\n\n if (evt.target) {\n this.onChange((evt.target as HTMLDivElement).innerHTML);\n }\n };\n\n replaceValueFromAutoComplete = (fromWord: string, toWord: string) =>\n replaceAutoCompleteWord(fromWord, toWord);\n\n onClick = () => {\n autoComplete.hide();\n };\n\n markup() {\n return {\n __html: this.contents,\n };\n }\n\n focus = () =>\n this.field && this.field.current && this.field.current.focus();\n\n render() {\n // const { devToolsOpen } = this.state\n const { readOnly, enableDarkTheme } = this.props;\n return (\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(Contents);\n","export function getVisibilityProps() {\n return { hidden: \"hidden\", visibilityChange: \"visibilitychange\" };\n}\n","import { CHARS_URDU } from \"../../../lib\";\nimport { autoComplete, eventEmitter } from \"../../../services\";\nimport { EVT_EDITOR_CONTENTS_SAVE } from \"./index\";\nimport { OrderedSet } from \"immutable\";\n\nimport {\n KEY_BACKSPACE,\n KEY_TAB,\n KEY_ENTER,\n KEY_PAUSE_BREAK,\n KEY_ESC,\n KEY_SPACE,\n KEY_PAGE_UP,\n KEY_PAGE_DOWN,\n KEY_END,\n KEY_HOME,\n KEY_LEFT_ARROW,\n KEY_RIGHT_ARROW,\n KEY_INSERT,\n KEY_DELETE,\n KEY_MULTIPLY,\n KEY_ADD,\n KEY_SUBTRACT,\n KEY_DECIMAL_POINT,\n KEY_DIVIDE,\n} from \"../../../lib\";\n\nexport function getAutoCompleteList(contents: string) {\n const re = /[^\\u0600-\\u06FF]/gi;\n let result = contents.replace(re, \" \");\n\n const reUnWantedChars1 = /[\\u064B-\\u066D]/gi;\n result = result.replace(reUnWantedChars1, \" \");\n\n const reUnWantedChars2 = /[\\u06D4-\\u06FF]/gi;\n result = result.replace(reUnWantedChars2, \" \");\n\n // filter out empty items\n const list = result\n .split(\" \")\n .map((s) => s.replace(\"،\", \"\"))\n .map((s) => s.replace(/\\s/g, \"\"))\n .filter((s) => s.length >= 7);\n\n const unique: string[] = [];\n for (const s of new Set(list)) {\n unique.push(s);\n }\n return unique;\n}\n\nexport function updateAutoCompleteList(set: OrderedSet) {\n autoComplete.set(set);\n}\n\nconst AUTOCOMPLETE_CANCEL_KEYS = [\n KEY_BACKSPACE,\n KEY_TAB,\n KEY_ENTER,\n KEY_PAUSE_BREAK,\n KEY_ESC,\n KEY_SPACE,\n KEY_PAGE_UP,\n KEY_PAGE_DOWN,\n KEY_END,\n KEY_HOME,\n KEY_LEFT_ARROW,\n KEY_RIGHT_ARROW,\n KEY_INSERT,\n KEY_DELETE,\n KEY_MULTIPLY,\n KEY_ADD,\n KEY_SUBTRACT,\n KEY_DECIMAL_POINT,\n KEY_DIVIDE,\n];\nexport function isAutoCompleteCancelKey(key: string) {\n return AUTOCOMPLETE_CANCEL_KEYS.includes(key);\n}\n\nexport function getWordForAutoComplete() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const { endContainer, endOffset } = range;\n const { nodeName, nodeValue } = endContainer;\n\n if (!nodeValue) {\n return;\n }\n\n if (nodeName === \"#text\") {\n let i = endOffset - 1;\n let arr = [];\n while (i >= 0 && CHARS_URDU.includes(nodeValue[i])) {\n arr.unshift(nodeValue[i]);\n i -= 1;\n }\n return arr.join(\"\");\n }\n }\n }\n\n return \"\";\n}\n\nexport function replaceAutoCompleteWord(fromWord: string, toWord: string) {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n if (range.collapsed) {\n const startOffset = range.endOffset - fromWord.length;\n\n if (!sel.focusNode) {\n return;\n }\n\n range.setStart(sel.focusNode, startOffset);\n range.setEnd(sel.focusNode, range.endOffset);\n range.deleteContents();\n\n const replaceNode = document.createTextNode(toWord);\n range.insertNode(replaceNode);\n\n const nextOffset = toWord.length;\n range.setStart(replaceNode, nextOffset);\n range.setEnd(replaceNode, nextOffset);\n\n const spaceNode = document.createTextNode(\"\\u00A0\");\n range.insertNode(spaceNode);\n range.setStart(spaceNode, 1);\n range.setEnd(spaceNode, 1);\n }\n }\n}\n\nexport function saveEditorContents() {\n eventEmitter.emit(EVT_EDITOR_CONTENTS_SAVE);\n}\n","import { eventEmitter } from \"../../../../services\";\nimport { clearSelection } from \"../../../../lib\";\nimport { saveEditorContents } from \"../../Contents/helpers\";\n\nexport const HIDE_TOOLBAR = \"toolbar/hide\";\n\nexport function hideToolbar() {\n eventEmitter.emit(HIDE_TOOLBAR);\n clearSelection();\n}\n\nfunction hideAndSave() {\n hideToolbar();\n saveEditorContents();\n}\n\nfunction insertEmptyDivAfter(context: string) {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n\n let node: Node | null = range.commonAncestorContainer;\n while (node && node.nodeName.toLowerCase() !== context) {\n node = node.parentNode;\n }\n\n if (node) {\n const emptyDiv = document.createElement(\"div\");\n emptyDiv.innerHTML = \" \";\n if (node.parentNode) {\n node.parentNode.insertBefore(emptyDiv, node.nextSibling);\n }\n }\n }\n}\n\nfunction isEnabled(cmd: string) {\n return document.queryCommandState(cmd);\n}\n\nexport const isBold = () => isEnabled(\"bold\");\nexport function onBold() {\n console.log(\"onBold\", onBold);\n document.execCommand(\"bold\");\n hideAndSave();\n}\n\nexport const isItalic = () => isEnabled(\"italic\");\nexport function onItalic() {\n document.execCommand(\"italic\");\n hideAndSave();\n}\n\nexport const isUnderline = () => isEnabled(\"underline\");\nexport function onUnderline() {\n document.execCommand(\"underline\");\n hideAndSave();\n}\n\nexport const isAlignRight = () => isEnabled(\"justifyRight\");\nexport function onAlignRight() {\n document.execCommand(\"justifyRight\");\n hideAndSave();\n}\n\nexport const isAlignCenter = () => isEnabled(\"justifyCenter\");\nexport function onAlignCenter() {\n document.execCommand(\"justifyCenter\");\n hideAndSave();\n}\n\nexport const isAlignLeft = () => isEnabled(\"justifyLeft\");\nexport function onAlignLeft() {\n document.execCommand(\"justifyLeft\");\n hideAndSave();\n}\n\nexport const isAlignJustifyFull = () => isEnabled(\"justifyFull\");\nexport function onAlignJustifyFull() {\n document.execCommand(\"justifyFull\");\n hideAndSave();\n}\n\nexport const isListOrdered = () => isEnabled(\"insertOrderedList\");\nexport function onListOrdered() {\n document.execCommand(\"insertOrderedList\");\n hideAndSave();\n}\n\nexport const isListUnOrdered = () => isEnabled(\"insertUnorderedList\");\nexport function onListUnOrdered() {\n document.execCommand(\"insertUnorderedList\");\n hideAndSave();\n}\n\nexport const isIndentIncrease = () => isEnabled(\"indent\");\nexport function onIndentIncrease() {\n document.execCommand(\"indent\");\n hideAndSave();\n}\n\nexport const isIndentDecrease = () => isEnabled(\"outdent\");\nexport function onIndentDecrease() {\n document.execCommand(\"outdent\");\n hideAndSave();\n}\n\nexport const isLink = () => isEnabled(\"createLink\");\nexport function createLink(link: string) {\n document.execCommand(\"createLink\", false, link);\n hideAndSave();\n}\n\nexport function removeLink() {\n document.execCommand(\"unlink\");\n hideAndSave();\n}\n\nexport function insertImage(path: string) {\n document.execCommand(\"insertImage\", false, path);\n hideAndSave();\n}\n\nexport function onRemoveTextFormat() {\n document.execCommand(\"removeFormat\");\n removeLTR();\n removeHeadings();\n hideAndSave();\n}\n\nexport function onH1() {\n document.execCommand(\"formatBlock\", false, \"H1\");\n // insertEmptyDivAfter('h1')\n hideAndSave();\n}\n\nexport function onH2() {\n document.execCommand(\"formatBlock\", false, \"H2\");\n // insertEmptyDivAfter('h2')\n hideAndSave();\n}\n\nexport function onH3() {\n document.execCommand(\"formatBlock\", false, \"H3\");\n // insertEmptyDivAfter('h3')\n hideAndSave();\n}\n\nexport function onH4() {\n document.execCommand(\"formatBlock\", false, \"H4\");\n // insertEmptyDivAfter('h4')\n hideAndSave();\n}\n\nexport function onH5() {\n document.execCommand(\"formatBlock\", false, \"H5\");\n // insertEmptyDivAfter('h5')\n hideAndSave();\n}\n\nexport function onH6() {\n document.execCommand(\"formatBlock\", false, \"H6\");\n // insertEmptyDivAfter('h6')\n hideAndSave();\n}\nexport function onQuote() {\n document.execCommand(\"formatBlock\", false, \"BLOCKQUOTE\");\n insertEmptyDivAfter(\"blockquote\");\n hideAndSave();\n}\n\nexport function onSourceCode() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n\n const elmCode = document.createElement(\"code\");\n elmCode.appendChild(range.extractContents());\n range.insertNode(elmCode);\n\n const parent = elmCode.parentNode;\n\n const emptyDiv = document.createElement(\"div\");\n emptyDiv.innerHTML = \" \";\n\n if (parent && parent.parentNode) {\n parent.parentNode.insertBefore(emptyDiv, parent.nextSibling);\n }\n\n hideAndSave();\n }\n}\n\nexport function onArabicLang() {\n applyLangOnSelection();\n}\n\nexport function onRTL() {\n applyDirOnSelection(\"rtl\");\n}\n\nexport function onLTR() {\n applyDirOnSelection(\"ltr\");\n}\n\nexport function applyLangOnSelection() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n\n const elmSpan = document.createElement(\"span\");\n elmSpan.lang = \"ar\";\n elmSpan.appendChild(range.extractContents());\n range.insertNode(elmSpan);\n\n hideAndSave();\n }\n}\n\nexport function applyDirOnSelection(dir: string) {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n\n const elmSpan = document.createElement(\"span\");\n elmSpan.className = `${dir}-text`;\n elmSpan.appendChild(range.extractContents());\n range.insertNode(elmSpan);\n\n hideAndSave();\n }\n}\n\nexport function removeLTR() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n let ltrElm: Node | null = range.commonAncestorContainer;\n if (range.commonAncestorContainer.nodeName.toLowerCase() === \"#text\") {\n ltrElm = range.commonAncestorContainer.parentElement;\n }\n\n if (ltrElm) {\n const el = ltrElm as HTMLElement;\n if (el.className.includes(\"ltr-text\")) {\n el.classList.remove(\"ltr-text\");\n }\n }\n }\n}\n\nexport function removeSourceCode() {\n const sel = window.getSelection();\n\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n let codeElm: Node | null = range.commonAncestorContainer;\n if (range.commonAncestorContainer.nodeName.toLowerCase() === \"#text\") {\n codeElm = range.commonAncestorContainer.parentElement;\n }\n\n const sourceCode = [\"code\"];\n\n if (codeElm && !sourceCode.includes(codeElm.nodeName.toLowerCase())) {\n codeElm = codeElm.parentNode;\n }\n\n if (\n codeElm &&\n sourceCode.includes(codeElm.nodeName.toLowerCase()) &&\n codeElm.previousSibling &&\n sourceCode.includes(codeElm.previousSibling.nodeName.toLowerCase())\n ) {\n const div = document.createElement(\"div\");\n div.innerHTML = (codeElm as HTMLElement).innerHTML;\n const parent = (codeElm as HTMLElement).parentNode;\n\n if (parent) {\n parent.replaceChild(div, codeElm);\n }\n }\n }\n}\n\nexport function removeHeadings() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n let headingElm: Node | null = range.commonAncestorContainer;\n if (range.commonAncestorContainer.nodeName.toLowerCase() === \"#text\") {\n headingElm = range.commonAncestorContainer.parentElement;\n }\n\n const headings = [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"];\n\n if (\n headingElm &&\n !headings.includes(headingElm.nodeName.toLowerCase())\n ) {\n headingElm = headingElm.parentNode;\n }\n\n if (\n headingElm &&\n headings.includes(headingElm.nodeName.toLowerCase())\n ) {\n const div = document.createElement(\"div\");\n div.innerHTML = (headingElm as HTMLElement).innerHTML;\n\n const h = headingElm.parentNode as HTMLElement;\n if (h) {\n h.replaceChild(div, headingElm);\n }\n }\n }\n}\n\nexport function onEnterInContentEditable() {\n removeLTR();\n removeHeadings();\n removeSourceCode();\n}\n","export function getPosition() {\n const sel = window.getSelection();\n if (!sel) {\n return;\n }\n\n const sentinel = {\n right: -1,\n top: -1,\n };\n\n if (sel.rangeCount) {\n const range = sel.getRangeAt(0);\n const rects = range.getClientRects();\n\n if (rects.length === 0) {\n return sentinel;\n }\n\n let right = Number.MIN_VALUE;\n for (let i = 0; i < rects.length; i += 1) {\n const rect = rects[i];\n right = Math.max(right, rect.right);\n }\n\n return {\n right: right,\n top: rects[0].top,\n };\n }\n\n return sentinel;\n}\n","import styled from 'styled-components'\n\nconst Icon = styled.img``\nexport default Icon\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACdSURBVGgF7ZVRDsAgCEPd7n/n7QKEoJSYJs9fpZaHqWuxIAABCNwk8CSXf8neja3Q63vDifJOGlDSRAsCENgnEGZrUUb9Txx5IUaL0xo7Zj+BMTIIQ8CEQJa96pzvIgm92qcQDXTfBfUQgECPQJitRUn1P3HkhRgtTmvsmP0ExsggDAETAln2qnO+iyT0ap9CNNB9F9RDAAIQ8CbwA95/BSRAVu80AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACkSURBVGgF7ZVRDsAgCEPn7n/nzQPYsASIdnl+QkR4mPa6OBCAAAR2Ehjq8WceldsRH/Os3r1XQacYAzhti14h8EcCS239Mmi1Tyidj3pBRiNC3Xn7DXQDoj4ETicgfaBa57MglE/YqxADZL8G9yEAgRwB6QNR2WqfUDof9YGMRoS68/Yb6AZEfQicTkD6QLXOZ0Eon7BXIQbIfg3uQwACEPAm8AKoqxQk55suiwAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport styled, { keyframes } from \"styled-components\";\n\nconst Rotate = keyframes`\n 0% {\n transform: rotate(0deg);\n }\n 25% {\n transform: rotate(90deg);\n }\n 50% {\n transform: rotate(180deg);\n }\n 75% {\n transform: rotate(270deg);\n }\n 100% {\n transform: rotate(360deg);\n }\n`;\n\nconst Blink = keyframes`\n 0% {\n opacity: 1;\n }\n 50% {\n opacity: 0;\n }\n`;\n\nconst Container = styled.div<{ fill: string }>`\n position: relative;\n height: 33px;\n line-height: 33px;\n width: 22px;\n\n & .outer {\n animation: ${Rotate} 8s linear infinite;\n position: absolute;\n top: 6px;\n border: 1px dashed ${(p) => p.fill};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n }\n\n & .inner {\n animation: ${Blink} 2s linear infinite;\n position: absolute;\n left: 5px;\n top: 11px;\n width: 0;\n height: 0;\n border-left: 6px solid transparent;\n border-right: 6px solid transparent;\n border-bottom: 10px solid ${(p) => p.fill};\n }\n`;\n\nexport default function UploadProgress({ fill }: { fill: string }) {\n return (\n \n
\n
\n \n );\n}\n","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { File } from \"../../../../models\";\nimport trimEnd from \"lodash/trimEnd\";\nimport { getCursorRange, setSelectionRange } from \"../../../../lib\";\nimport { insertImage } from \"./commands\";\nimport { S_IMAGE } from \"./shortcuts\";\nimport UploadProgress from \"./UploadProgress\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/photo-b.png\";\nimport w from \"./images/photo-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useState, useEffect } from \"react\";\nimport { useCallback } from \"react\";\n\nconst styleFileInput = {\n display: \"none\",\n};\n\nconst mimesAccepted = [\n \".gif\",\n \"image/gif\",\n \".png\",\n \"image/png\",\n \".jpeg\",\n \"image/jpeg\",\n \".webp\",\n \"image/webp\",\n];\n\ntype Props = CommandPropsWithShortcut & {\n doc_id: number;\n setErrorMsg: (msgId: string) => void;\n};\n\nexport default function Image(props: Props) {\n const { enabled, enableDarkTheme } = props;\n const [uploading, setUploading] = useState(false);\n const fileField = React.createRef();\n let savedSelectionRange: Range | null = null;\n\n const onClick = useCallback(() => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n savedSelectionRange = getCursorRange();\n if (fileField && fileField.current) {\n fileField.current.click();\n }\n }, [fileField]);\n\n useEffect(() => {\n if (S_IMAGE === props.shortcut) {\n onClick();\n }\n }, [onClick, props.shortcut]);\n\n if (uploading) {\n return ;\n }\n\n const addImage = (path: string) => {\n if (savedSelectionRange) {\n setSelectionRange(savedSelectionRange);\n savedSelectionRange = null;\n }\n\n insertImage(path);\n setUploading(false);\n };\n\n const onFileInputChange = async () => {\n const ff = fileField;\n if (\n !ff ||\n !ff.current ||\n !ff.current.files ||\n ff.current.files.length === 0\n ) {\n return;\n }\n\n const file = ff.current.files[0];\n const { type, size } = file;\n if (type.startsWith(\"image/\")) {\n const kbSize = size / 1000;\n const maxSize = 1000.0;\n if (kbSize <= maxSize) {\n setUploading(true);\n\n try {\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const { doc_id } = props;\n const {\n data: { name },\n } = await File.upload(formData, { doc_id });\n let url = File.fileURL(name, { doc_id });\n url = trimEnd(url, \"/\");\n addImage(url);\n } catch (e) {}\n } else {\n return props.setErrorMsg(\"toolbar.maxImageSizeError\");\n }\n }\n };\n\n return (\n <>\n \n\n \n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFTSURBVGgF7ZbNDcIwDIULB6ZhKxbpBlyYBokxWIAVOCOwD5aip5TEbezGUiJFaf6c972kaadppOHAcGCtA2eaeKX8pPym/N2YabpPOtEyN8ofyltFp/Nd1LP4R2PhAuECwM7Lgq1LcwA+85pjg4IQGPtX1Y+KWRcaqxmvCO0zlG8bdPFfHVXhWOw3r2uvShRkAhD6SLBDGoAXWtpDXQNw70HwFg1dXqNaIM2HDGObvMS4SKmu+ZXAWF0AsKjan7luAURY6XdaxklpsgMHid6gZIFpwtil/nRu9bPmGq0O6jlwAHi6nVtr7EDOFc+2sQOebufW6mkH5pxAz7bSl7amf3eILYYJYFgIAeAyJEQKEBICAZpD5BbwaGt2nDzELq2xCNHTd4DeXdu05I51+2yL1S56zogw4tkGBAglHgHCiU8BQooXgLDiGSC0eAYYaTiwhwM/1+RQcS7lbXQAAAAASUVORK5CYII=\"","import React, { useEffect } from \"react\";\nimport styled from \"styled-components\";\nimport { KEY_ENTER, KEY_ESC } from \"../../../../lib\";\nimport { hideToolbar } from \"./commands\";\n\nconst Input = styled.input.attrs({\n type: \"text\",\n})<{\n textAlign: string;\n enableDarkTheme?: boolean;\n}>`\n outline: none;\n direction: ltr;\n text-align: ${(p) => p.textAlign};\n margin: 0 0 3px 0;\n border: 0;\n width: ${(p) => p.width}px;\n height: 30px;\n line-height: 30px;\n font-family: \"Source Code Pro\", monospace;\n border-bottom: 1px solid ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: transparent;\n font-size: 14px;\n\n &::placeholder {\n direction: rtl;\n font-family: urdu;\n font-weight: 500;\n color: ${(p) => (p.enableDarkTheme ? \"#333\" : \"#e6e6e6\")};\n }\n`;\n\ntype Props = {\n value?: string;\n width: number;\n textAlign?: string;\n enableDarkTheme?: boolean;\n placeholder: string;\n onClick: (value: string) => void;\n};\n\nexport default function TextField(props: Props) {\n const { width, textAlign, enableDarkTheme, placeholder } = props;\n const fieldRef = React.createRef();\n\n useEffect(() => {\n const f = fieldRef;\n if (f && f.current) {\n f.current.value = props.value || \"\";\n f.current.focus();\n }\n }, [fieldRef, props.value]);\n\n const onKeyUp = (evt: React.KeyboardEvent) => {\n if (evt.key === KEY_ENTER) {\n props.onClick((evt.target as HTMLInputElement).value);\n evt.preventDefault();\n return false;\n } else if (evt.key === KEY_ESC) {\n hideToolbar();\n }\n };\n\n return (\n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div<{ width: number }>`\n padding: 0 10px;\n width: ${(p) => p.width}px;\n font-family: urdu;\n font-weight: 500;\n font-size: 14px;\n color: #bf4543;\n`;\n\nexport default function ErrorMessage({\n errorMsg,\n width,\n}: {\n errorMsg: string;\n width: number;\n}) {\n return {errorMsg};\n}\n","import Bold from \"./Bold\";\nimport Italic from \"./Italic\";\nimport Underline from \"./Underline\";\nimport TextSize from \"./TextSize\";\nimport Tick from \"./Tick\";\nimport RemoveTextFormat from \"./RemoveTextFormat\";\nimport AlignRight from \"./AlignRight\";\nimport AlignCenter from \"./AlignCenter\";\nimport AlignLeft from \"./AlignLeft\";\nimport AlignJustifyFull from \"./AlignJustifyFull\";\nimport ListOrdered from \"./ListOrdered\";\nimport ListUnOrdered from \"./ListUnOrdered\";\nimport IncreaseIndent from \"./IncreaseIndent\";\nimport DecreaseIndent from \"./DecreaseIndent\";\nimport Link from \"./Link\";\nimport More from \"./More\";\nimport Back from \"./Back\";\nimport One from \"./One\";\nimport Two from \"./Two\";\nimport Three from \"./Three\";\nimport Four from \"./Four\";\nimport Five from \"./Five\";\nimport Six from \"./Six\";\nimport Quote from \"./Quote\";\nimport SourceCode from \"./SourceCode\";\nimport Image from \"./Image\";\nimport Video from \"./Video\";\nimport RTL from \"./RTL\";\nimport LTR from \"./LTR\";\nimport TextField from \"./TextField\";\nimport ErrorMessage from \"./ErrorMessage\";\n\nconst tools: Record> = {\n bold: Bold,\n italic: Italic,\n underline: Underline,\n textSize: TextSize,\n h1: One,\n h2: Two,\n h3: Three,\n h4: Four,\n h5: Five,\n h6: Six,\n alignRight: AlignRight,\n alignCenter: AlignCenter,\n alignLeft: AlignLeft,\n alignJustifyFull: AlignJustifyFull,\n ol: ListOrdered,\n ul: ListUnOrdered,\n increaseIndent: IncreaseIndent,\n decreaseIndent: DecreaseIndent,\n quote: Quote,\n sourceCode: SourceCode,\n image: Image,\n video: Video,\n link: Link,\n linkConfirm: Tick,\n linkField: TextField,\n removeFormat: RemoveTextFormat,\n rtl: RTL,\n ltr: LTR,\n more: More,\n back: Back,\n errorMsg: ErrorMessage,\n};\n\nexport default tools;\n","import React from \"react\";\nimport { onBold } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/bold-b.png\";\nimport w from \"./images/bold-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function Bold({ enabled, enableDarkTheme }: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { onItalic } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/italic-b.png\";\nimport w from \"./images/italic-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function Italic({ enabled, enableDarkTheme }: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAD+SURBVGgF7ZjBDcIwDEULB2ZgEhiGAWAkuDMMTNIZ4AL+EococqQUx04Q31Klkjb+9nP7VTFNDBIgARIggX8msHJo/mXMuaimtVGs+3Y20HsEnEDvCUTo30QEzpQf+whxq8ZOKRyN3K2Jo/ZfCw0cogqw6Gxl80NpYJa1jSVxutfThY6FQi+y/kyLGPEchEE6f3ExEUxm+MAznheP33gnfiLgMloDcKXhg9bZc0Qh1pk22NpGT5Jc8/izrNM6U/Ie57ROD6q1OfFprPk+PqVdY9E/AJ9KUKglvtEs6rV2oaKQ1wU24EW2Ni8nUEuK95EACZAACZAACZAACbQn8AabJ1nHsTFG1wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEUSURBVGgF7ZjBDYMwDEWhh87AJDAMA7QjtXeGgUmYob2031IPURQElp0Qqd9SpACO/f2MjETT0EiABEiABP6ZQOtd/AdmidnCNOcvGucafVnA2V1hB87uQPb8GEqzTKaEDdmTWxNAdJ8QLrcWa+wi5yF02ihgLCLAkgTCO6xXooAV966W2OHZnFPohkQpoU98bN+hiOr2QhhLSMcmHemqExwLgsgxVv67nmLfKq8hdtkooK9ScCgKwjk6QyBF96BfZHSGRXmP0TuCp0bng6MzxJ5jj9eHozMH2EMxQX/AStl8KIDBSfUHQPKISkO+RvvXYS+X9xTay+f+nAW4I1UGZAeUwOhOAiRAAiRAAiRAAiTgSOALVQ6QqrKpoXYAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { onUnderline } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/underline-b.png\";\nimport w from \"./images/underline-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function Underline({ enabled, enableDarkTheme }: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFySURBVGgF7VcxTgMxEAzUoaRNCugo+AM91LwiLRT5D0jwBn6R9LTQkQ4pCTNNEp2GO9uLbAGz0ki+ze7s7azPlxuNbFbACliBlgocFRTfipwSHtKEuY7FzfwqlxtoPS5PwBMIKuAtFBQwnO4JhCUMEngCQQHD6Z5AWMIgwb+cwKcQbSx8Qy6Vo7h7eUom8C4Yz4RvyHUuAhS3CNu7ShpY7tN3q+vdKn2hchbp6eWR90jlp+Ah3nB9kkHJWOYccnB9l8FRHDpF5hroFn+CL+XbmDHPIp+c5K5iD6jSbYDXbKJvEvxN3TxzyVnNJqi0AlQT3Bpz4BLgSUNwTZ/aNuT4AMhZ1W5QbQOoJnJ85CBXE5uhaqQJ5pKjqVG977ZT3ySY00z5rmITOPgQqtOp2wRjGMucsKUcezlFpgi+Ba6AC+AUoPENy5fUC/AIvAI2K2AFfkCBnIeYp0lNS7q3kr/TNZsYrOUGBiVygBWwAlbgTyvwBXnFfkzqhRSNAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/size-b.png\";\nimport w from \"./images/size-w.png\";\nimport { CommandPropsWithOnClick } from \"./types\";\n\nexport default function TextSize({\n enabled,\n enableDarkTheme,\n onClick,\n}: CommandPropsWithOnClick) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACqSURBVGgF7ZRBDoAwCATV+P8v68VTN6Qkla2N400kIDMt28YDAQhAAAJ/JrAHw19B/O1w1D/d50hnfjSRAWaLwcBsA6NbINpWo3XTXDhCaVRFicsbOIvAtGWju9Lm9d7lbi1vgAF6zqu/Y6CacK++awvJ9nh+LNpOUb7MwxESJOYABszApR0GBIk5gAEzcGmHAUFiDmDADFzaLW9AJiIAAQhAAAIQgICRwA0V+ARACxh5DwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACqSURBVGgF7ZRBDoAwCARb4/+/rPXWw5KQtKDE4WQI0jDT0hoBAQhAAAJ/JtDV8NcIld+d6yNWex6rDd7+nwEwsEig/BVa2gLWttqxXbxiyhtgAK/qqLozqvHc13orc43nW70trpCHXGQNBiLpenqXN5CyhdT2eOha28mqV0bKG2AApTUzh4FM2uosDCgqmTkMZNJWZ2FAUcnMYSCTNmdBAAIQgAAEIPA1AjcxMBBDNud5HgAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport { onH1 } from \"./commands\";\nimport { S_TEXTSIZE_1 } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/1-b.png\";\nimport w from \"./images/1-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function One({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_1 === shortcut) {\n onH1();\n }\n }, [shortcut]);\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAPNJREFUaAXtmDsKAjEURaPYWIi7sLdxD3Yuxh25D8HaxVj46URfumHIDOZycQicgUA+793knTtpkhIfBCAAgSkJzAyb70LjVKnzivhtZU4xfFGcrZtcRvimLiU9K+MHw+eDK40sUMDURjnuwDuKuPcKybr5bjT77ePkn5H2cFXGHXCRVHVwQCXnysMBF0lVBwdUcq48HHCRVHVwQCXnysMBF0lVBwdUcq48HHCRVHVwQCXnymveAcezSoZ5jrbqUF13+qVufnK59haOMb705v42vMVOY88ov6wdlNM2/wtRgGK7M6d5B5ww0IIABCAAgfYIfAG7zSGvArQ1MgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAQZJREFUaAXtmEEKwjAQRRPppgtRL+FeEO/gfbxR7yG49jhVdxInblpCapvxlzLwA0Immflh3jddxDkOEiABEliSgP/38BDCSTSaQp2X9/5QWJNNr7KrZYu1pO/LStyzMH8wfTW4Y2SDDSxtFOIOvKWJNmkk6sa7YXPIl+ksv1/jgeqMdwBFUqtDB7TkUHV0AEVSq0MHtORQdXQARVKrQwe05FB1dABFUqtDB7TkUHV0AEVSq0MHtORQdeYdQDyrOHl+uArRdY/qpjfPTWupuScbF3kvvSVroyGkATklPtRuR0/rEqLzxy78znZJPCk0/xdiA5N8njHJvAMzsqE0CZAACZCAAQIfDwU07pXuGz0AAAAASUVORK5CYII=\"","import { useEffect } from \"react\";\nimport { onH2 } from \"./commands\";\nimport Icon from \"./Icon\";\nimport b from \"./images/2-b.png\";\nimport w from \"./images/2-w.png\";\nimport { S_TEXTSIZE_2 } from \"./shortcuts\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function Two({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_2 === shortcut) {\n onH2();\n }\n }, [shortcut]);\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAsFJREFUaAXtmLtrFUEUxuP7iUaCjYpv0YCNktq/wMYHCDZBsLIRBAURCxEstBPsAl4IpBALURBbEW1FFBQVIiKIFtr4wIiP3weZZdnMnJnM3c29yh742NnzPmd2Z2d2YKCltgNtB/7pDsxrMHv53gB2gO3gB5gEb8A78Bv0HW0iow54Br6DPwFMwX8JzoAVoOe0hAzOgW8glHSI/wGbU2AZ6AmNEFXdDCWYyn+Cj+VzXcFiAr6oIXlX5MRcF3C2xuRdESdnU0Q3q9BGAj0HoWlXQtfBQ/AaaEU6DA4Ai/QerQK/LKU6ZB2cuK5Vr1qBDgaCnDfsnJ/dAdta2eq+C1i9XjMiLURmLbHyNWrY1yJahJefoJq4ux+ORNF3wun6rlcj9oV4fjGa3WAb6uqkjyZhanYsWm8Jka2OyAtxbgFWh18V3v2DPbAH/aKC+7YYRQa5BWh/EyKtOBZdtoTTstgMJriIq6h47WPWAi2pu8BeoOUyRKcR+J75Mu8TOj3bVoQSF/84KCcaGl+wnPRCppm6lJj8TfRyH+tGatNqcicx+fvoLW0ki0yn+pqm7lKfohtbmTLTyDM7gtkXEHrOy/xb6A3lhanfSpvDK6CcYGj8Fb0T9aeQ71Ff5nEQSrjMv4felvxQ9Vvq5Ut5WT+id7T+8N151LJ3F5Q77BvrWddHr+/oIhn5EnY8PevHmspaL103tB/j2yDk5zMy6TwCPtoKM3Si036o0VPZAgJo4+Y6Xb0qeX0LLHqAsGrn7pO31FYASzZqBFcShyzjaZlVgA5NjZL1O+VGYuRQAVOJ9tkbp80E2GkEGTNkKSL9mUii0MsXM9bj0zGUHiNLeQF1hljp8fMe3joPfwYrdK6doVhh7KvcV291bOyGkmcgd++t5a9JaryANU1mj++2gFiD+2YGYom28rYDbQfaDrQd+L878BfjTUIsPPB9sAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAt5JREFUaAXtmM9LVUEUx71mahmahJsK+2Wo4KYf6/4CN0kQhBCBqzZBUBDRIoIWtc1dkBC0iBZiEG0jahuR8KQMQ4KoRW7KSKrX58Dj+bp3zsx4r3eeyRz48u493zPnfOfMffPuvJaWaLEDsQP/dQeSstRXq1XJvRccBgPgJ1gAH8DHJEn+8LmxDNH7wBSYBT+AZisQb8Fl0NX0WSCiA1wFy2Ct9pkBF8G2pkyEwseBdLOovSbB9qCToGA7mCuqvGH8g9ATuNJQfL0uL6xlErl3IdT2U6gCtGWvwt0DL8A8kB3pFDgJbLYM2c0u9dsWVJhjArLbaCY70JipCP5r2qAG/4hp7Lr6KFZpKJi+nNSKEdgGbFus5DqrjU/7W9MOn3sKbCVOfpw0u6MRPBq/4N5rfM1/zMHX6VwTYPQh0FbP8u/FAiLlu2GzPTYSrsfB1+m8ExiuZ8hevMu6Vj2s3hHudq56jFeLRq/BmXcC8n6jmew4NrtlI2ucawU9UjhC6GQr6AJ9oB8MgaNAtkujwV0CLvtKQHNeK4yqa05ETbiU1/jrtjzBOUTJSt30FP9I4oOL1Aoipgc89hT/jLhOLVdwP2JGgO9b6htiXTtTuDkg5jT4BnxsmqBd4dRZKiEkAbd9VBPzHZy3pAtLIUbece4DH3tK0IGwCi3VENMJfL6sX4g7Y0kVnkKQbJNPgMvkWe8Lr9BREVE3HMrlWT/nSJObzn0ik4oIG+VjBmh5luBGeTt9yWfGGH8Qp3aiq5R6KqP4FjAPNFuCsJ6s4J9rg/F7vVIX+dkep3tyLtBsgg7OaqSHX87G5Rkdsv2d8tCnsmUFVnzGS0yuFaDwfsYOSgLF7ip+X7d397Uvn7UQE5BD95Ql6BWcz98iQ8TtMOT5xOO32+DPuLRzbSYw5TiRuk/fyrGxiHmvQK5HCGWy/ZVppU+gt0z15I4TcDV4w6yAS2jkYwdiB2IHYgc2dwf+Aq701E4GZov/AAAAAElFTkSuQmCC\"","import React, { useEffect } from \"react\";\nimport { onH3 } from \"./commands\";\nimport { S_TEXTSIZE_3 } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/3-b.png\";\nimport w from \"./images/3-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function Three({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_3 === shortcut) {\n onH3();\n }\n }, [shortcut]);\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAwtJREFUaAXtmEuoTVEYx493KKW8rugmBkaIayIRRZEJJXMmysCEiQFlZmKkbmRCMpAyEJnoymPkWbokrysphDyvK8/f/3bWbe9z1lp77X32Pmer/dX/rL2+9/rOeu1dq1VUVaCqwH9dgVEFZj8T3wvqmEA7UMcL2h+glLSerK6BL+CvA3/gvwKHQRcoBfWQxWXgStrF/47NETAXdIx2EFlVdSUZwv+M/epOjECVH2oxeTPAQfwsaecgphFMC9IkkEd7G39j0gwilXKD40P01zXwot2ndE6C0+AOGA/mAB9pUV8Hz3xKecke4shV9bPIJlkCbffYGF+9FrvcWbM8iXxFJrmLjiEwydpa7WbBNDpYM664Jt6N9W7Sex3jxDuX4t2m3vQmjocx1iPzie4h1HSYEYECq6+F6KMpPiGytwnymDjrADT/hSy0McFIi7+0dJDMbPM+yttUpux1ViwGe0A/iCZqe76PTpEXTNyH0wNUbUm6eJ/QXxbuvnjNxykG8BHdVcWnlC5C6ABO4dZ3bnijZj0HvE5TCPViozOj03lYUw79B7QmhoBecLJu69YEWmWmGYBZ2BcIOjlN4CK3rEUkoimihOaD5WAXsF3yYI/QOZ62jPRK9jCbfG4AU3FXu6JkecfS0TvB+4RBnI9ZtKGjadENFgbGOoqeq/rivwz0k0ltK1YXga7NA+AbMMk85zmEdqJkbGytPhIkrZXhOFm2rV9Ybhi2bv7R9NBr6u9mUYyTtNNoc9EABmNWOXV057dVzfCWBsTRe7LRt7W6FxVKj/BuCyzemYTIurD99NjLx60EHy2Lj3sS0Pzd7YjQA/+Jx9YUZb/Dvomd9SBbiacrwPdZ5iryPqB/qwuo8tuAzwZxTV/puoFuqIXSAbybiuXZ7is064hz3SD7ch6EPrm0lXQ1CJnTIf+Q1lVHrtXjCKyDSd/8QxJt1OnHbi3oOE0kg73gLtACbEw02n+H/ATYDFSAzJR1FwoJOBWleXXolfEDeAP0BqadKem0RqWiqgJVBaoKVBUouAL/ABb4m2dC5mJqAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAzhJREFUaAXtmMtrFEEQxncTg7iCIPh+BdFDTkZMBBFBjCAoelAUz8aL4MGLXrwE/ANyEoTgxYMHJSAogiAhkpCThgiiYfFBAgoqUZJVouIj/kp2oNMz3T3TmcmOMAUf213V1fVVbXdPz5RKhRQVKCrwX1egnBX7ubm5tcy9vY6l/E7UMVkul3/Qzp9A+hAYBl+ASf5geAd6wfpcZAGRTjAAkso3HK6CzQ1LhOBngVR1IVLDef+iJ0FQqfz3hTBXfGdp71y0JAi2CkwqBNJojjJJc5IkliQZrI3tob9F06nd13TugTdATqSDYA+wyS6MXeChbVAqNio1bil5P7aKHghdt8UnMF3T/VLvE2ldEC3i96vYTUGx9UX4qKoBk2+UvilKGUN3wDLmMQ+q9xb7A4tNTKsd9nlm3z3wlFm6wRoFElj6o8AmK2xGbB8d9nlmrwSo8DizCHzkiMNJNn8+hYV+RV3shvbR3LCHoDwr2sFF8By45BkDMrtgJioMRF642Gr2GfodiYIw2PcUihOnJc6g+pgZfo+xt1wHQGjKLBMIBTMobqJvg/yQwW5VNzoBebGRZ0ajeYSLxHp+qa1xW1dutPKC43Wsh6OnoIFMkgSC5O7TWJ4kfGZHFkR2QESWiBDaBnaD8yB0yUOnyh32wwlVkZs2SW0AI8Ale3NDWicC803gkyMDeY+IJansfshUQCtoc0VlebxlTL9jXOxXy8S7HpKnCH4GyO0zQLCuJ9BtBS4ZcwzYSJwKyc46xpUSJ8CEv8Bhw8SyPJoJ/NtgD9Suk0YOFymKMwGfJTQSsIj4lYK0R+h1levOU6MIU7pTan2qXAUmuW0LhFMH+Glyruuf2OZQbT7/gPgPq5No7ZOQuKDp/nXRd9K4BVxL926Uf5TO60EGkX1M9gjYvuEMYR8EVSDfQGXZnAY2H8ylGmhlCU1LJzMhiR6QhVzOjLQ6McybwGDKGfSpMTJvQ16uBq9SSuI68/juSf9cCdoCzgH55u8j8q7c5c8gJU9ILAOXwBiYBjaZwngDHAdJXj1DbL1OodAsEQqIrUQt1wqBfGr8DD4AeQOrxnhaM6yQogJFBYoKFBXIuAJ/AdJsaBH63kbJAAAAAElFTkSuQmCC\"","import React, { useEffect } from \"react\";\nimport { onH4 } from \"./commands\";\nimport { S_TEXTSIZE_4 } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/4-b.png\";\nimport w from \"./images/4-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function Four({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_4 === shortcut) {\n onH4();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAiZJREFUaAXtWM8rRUEUfiQ/UkoWlCexINkoRUpZyMLOjiyEHTt/gJWF2ChZ2EjZSGKl/AveghVlQbKwsELIDt/hvnpNM/Nm7syZ917N1Hlz7zkz53zfuefcHy+TiSNmIGagojNQFRh9FvFmNDEPYXvS2EtqqkP0HORHI6O2CKttNzis38beIYf9Jd26iOi6zOdt1lcgBKtBBPniIsBdQi0AfgKph7AMTgLkm+4qnSzIE6ecBNYQY4ITPKfvKTj/huSb03QuiybuAfC3FOCJpDUB3yXUCBCnkCaIbDzLlC463wT2AKZfAYjuRgcKW2q1TwIrQDGtQHID/TyEysTr8EVgDKg2Fcheoaem/lDYndQ+CLQDwRGkRoKE7kSzkDuJzYvKlUAtUBxDWhVoVqE/V9i8qF0JbAHFiAIJNe26wuZN7UJgDiiWFUjYmlaMl5bAABztis6Sc9amFWOmIdAMJ/SwahCd4Zy9acWYtt/ERPgMMik6Ss5fMF8obKTuhXRr7LSXfNB4hCz9HXn8oY8T0xcz13XXJrhtS+gSTq9MHIdaY0uAcO2EAscVh9443yGuJVJsv1EJyR7/xYh/YgH9RZLma6sD+9o0AW5ho+TQuP+fyut3A3B0mS/5B03wdKVp4uAgdQHT9IDOn2gbhqKrQNlXcCw7HIcymxhymB9ki0Lq9hFMV/M624IJ0IovoUjA5DJzrqn4K8CZnOg7ZiBmIGYgZqD8M/ALDdOxcfKrnFIAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAktJREFUaAXtmM8rBGEYx3clP1JKDpSVOJA4KEVKOcjBbW/kINy4+QOcHMRFiXKRuAhxUv4FW7gpB5KDgxOFq/V5mbSN9531zrzvzG69bz1r5nnmfd7P8533MTubSrnhFHAKlLUC6Tjp8/l8hvUmA9Y8SKfTTwHx5ELAV2M5LGgM6xJW6E6IcP0GcwcizE9uKpLPBcleECu9OwBcP9Jt2ZLP6hYCvhHwE6ym7AoAXohzgLXZghd5bd6BZfKP2YS3lhv1s9gnpjuSb2KIO1FmD4vlIWl0CwFfB/gpVo/JxrPMGcVntABAdrAeBZD4b7SviIV2GysA9RehmFCQ3OCfwfKKeGi3kQKAH4FgTUHxij/Ll7R3RTySO3IBwLdAcIhVSkg+8U0BfyeJGXFFKgD4KiiOsSYFzRLw54qYEXekAiBYx4YUJKJpVxQxY+7QBaD+NBQLCpLvpkV9403rXy9UAcD3kWjbn8w7t9q0/jW1CwC+gSTiYVXrT8a59ab1r6n1uAdeFHyGjfsTeecv/L1QxIS7C+sIiIu5IocYj2zB+Z9D9aduAeLl5FKdzmjkhgJ6i2XU2kIkvCLhdbGkcca1CvDANuMELLZWmAKOSGrla0ExWFlc9viXXffrYxt90MziJ5Iwb1utzGv+Tfb34BbXm+e+/xtO2EPhq1jQSP6NLG6NwvRA3IyB62n3QGA2X5C9MoirvcDdXXAsOxxlTsYL5Oi3B9lFsfmA2cXCjtn/gJb9FnIF/Oc227ym7O+ATXFcbqeAU8Ap4BQofQW+AFAJVaLaZEuBAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport { onH5 } from \"./commands\";\nimport { S_TEXTSIZE_5 } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/5-b.png\";\nimport w from \"./images/5-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function Five({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_5 === shortcut) {\n onH5();\n }\n }, [shortcut]);\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAsdJREFUaAXtmLmL10AUx9cLDxQ8Ki8WRFBEEI/CSlhBEBu1E0WwFATxv7CzELV0QZEVbASttNHFSq08C0EX8Vi0UFQ88Px85TcQJjOZ2Z3MpMmDL0m+7827ksxMMjTUS9+BvgN9B7rswIzE4PcZvyjRhz38NMRZm/Rdz/YpIvhZ2GwBqU2wQy2ziabrmU3KgG4x+raTD4Ssq1MKWFp3V55JKWBJ+XTrEVPeAd8d+EuYL/VQNWYhTPIjmKOAJyS2sZZunbgBtatOT43J8QhNRqZwO9Ku0SzHHYgt4BKZfXBkd9fBeakuC5ggq3PezCIVXT5CkSk2m+W+A/MJvxoMA52/HuAdxz+gU7lDdE2ZNvbBHQF6SZWkrdf1ZzAKRkDyVIqPacljRrmS++nhXbbiHoFNoLi8JaIvqany3/F1onQFP1oswBR8tFQRCzIkryLUlO0liphHkDHwG5juuY6adS6D6+BFwNaM11akmKwj0kXwC5gEdBwH0tlyCEKrb9XWdb7THpj7ei0BRoFmoGtAc75P9qJwJV3lrvgG5+aHCRCzOOpbupqwff4qd6Kp/k8FCtACODcmSMpeKMa/z2bCpxjwWp1XBWz+q2Nud4yfOYOA8vcsYsCnlmyinlc71g6I3UDPu8EKznU3H4CYbcEa7JrkK8r3TQYpugMMtl+66rWKCclVDKpj7POnIQcpev2J097FDmquzwecb0Pv26UaH2cCPpLVmutNMNfxOHrXNnkzvLrrGlPlNmATJa4gMQMPY3QhYHgP/U3wHKwE+lOxH4QmjlvYjICsosL1UV7tWhvnH/G5PmvmFedaaMZBG4nLhzaGe0BR0Z/kmGc6VKQ6f7Bo5pVguhPHgPYvoURdem219Y50LvpG0OzzEHwDrmQNp9X6JNgKkmS6s1AoqPwuB1pxBX3BTQ7whuNL0Evfgb4DfQf6DnTfgX9qXk9uU8DNTgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAvJJREFUaAXtmLtrFUEUxu/VaFQMqKmMSkCEiAjio1YiCGKjdkERLAVB/C/sRS0NKAHFRlAbbUywEE3lK0VAriHGoEXE9yPm+jthA5u9Zx67s8M2e+DDmfP85szjbmw0aqk7UHeg7kCVHWiGFG+32+PE94TkUGIvN5vNq4peVXWpWg8l5Ffitg8ENUEp1avojKoVRovbsAGXssm7q2Y8QhawKZOrkmnIAjZWwjhTtPAdII9pB9rYvmXqaNP1KIOPYIwFvOEV2a0xTut4BB4yP5LWFRnHOEKznkRGPf2sbjF2wHcBIzCbU9g9U3RGVWUL4Ji1YHXNyMzTUOUR8qRod4u6A1zUtZTfBvqBjN8n+MgOLDCuTiD3BGhyAuVZMAoWNAd0X8EwGATBT2mhLlD4NdDkr6a06F5h21OIREgQRT9YSOU1/SLgYgif3LEU/J2XpYf/ubxECp0/iKyj0Pe8xTz8/+BziAv+1MN30aXoMyovyC3geklm8LkNHoAWcMlqHK67nEqzsxMD4CaYB2kZYzKQLYTuNJhLOxrGh7OxUeeQ2AGGgbxA94C8+apgOw5cckcNjq2EVT9w/jjiMw5sMu3LtegdUPNz+d6BedW4XDm2fNox62N13R1aRVHqApT8JlXLZEj08jpudfgsmp3b7ZOEbq1KCnaxA5MeMV9K8mnkXgBkD1L8KJAPtCX0MZbdfAF8Pgu242eTHzTik82hsI0FDAGbyGKsQvBdWwJsE9YEIUaS9wD5djGJ9YeIoAPA9JW6lPNKCEdnLFXkrbfJBYwdnyno9oIJW2Bi2+UkkTh0FPEJpMgZ/G44fJ9jfwTegi1A/qfiJHDdu8ec/0H84gkLaIKRpFtl/vOZZDvjMU9lplA3kG+esuQfiY6lSsQfUrAX+Jxp1yKl86fiM1YqUFh24jyYBkXkPkFyR6oVSKwB8vq8BD+BTSYxXgL7Q1kXeoVcRSEmeTcD+cUVyF9wswlmeGWmGNdSd6DuQN2BugPVd+A/nNOTOnwVI1UAAAAASUVORK5CYII=\"","import React, { useEffect } from \"react\";\nimport { onH6 } from \"./commands\";\nimport { S_TEXTSIZE_6 } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/6-b.png\";\nimport w from \"./images/6-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function Six({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_TEXTSIZE_6 === shortcut) {\n onH6();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAvxJREFUaAXtmEuIjlEYx2eMYQZRLuNS7hQht5WwIbHAEgtlYaEkK4lkYcnCzkJSlA3ZzMZKLiXJRsgtkUsTRm5hcgu/f73HYnrPc97LvOf71PvUr/PNec5znkvnPZdpaamlrkBdgf+6Aq0VRz+V+adBV8IX2icJr2n/QNPJfCI6AvdBAfroQ9cN86ApZDRRHINf4As6rV/jT8JEaJjMxfMrSAswa99d7DsbkYGWwJuSwbskT8ROYDgOnw1Q8C6JTTGT0MfqHPvaa4zZB6tgG1wB31j1X4YoMgcvP8EK5jj6/lu1/j5q2H1HNwwqFysIJXUe+gfvghrMj1vgS36tG1hV28bE7iDyBbEw4Hw7+jTbT/TvDdj+U6sSRWQ1RuMNw6vobht6qc7Cb+gF7WJqxTeoXA7hIa16rm9n5REkDgYVdLQoYKdrRBQpuoRCCTwg+nbYDCtgBkwHnRsvE27SngYtn6jSgTe3VNLar+i17/cExsn2B2i3mgLRRB9vWuBl+t4x54ZYGcyuIAElrx1pS4wkllSUgJL4DDrhM0uRXagz8+z5B47A5FR+s3wWixkeWu96pFwAnbbLYTIsg93wFkL2SxlTmcxiZisAPWys11UX+nuBOXQJrExCu9D7DJ51tbaKcCfDHIWHDMVSO4YvAOmyHJAvjDk+osskRT5i3defGrO3ohtj6J3qsfuR0o6iTx90UIokoEn1ALdkkqVMdLo2+6QPhU70oBRNILRGNwY929eHh9hriVYmK5nZ9w2o/1HA8xD0H4w5zgTsS6u1zq2PUEmsN7zsQGcV4IBhO2Cqw4Eg9LJKS0KHVOg5ui5rlKpkUZmAodaqdgyf6ES+nvCcVveorWBdRy6iXwNRZBderKWQV6fdZ2aUyBMn2sW6IW+gvvH7YwbvfLXz41zJJHR66/6juRoibXjVfyJ6wVddX7/ez9qWm0JGEsUeuAS6cviC1il8Aw6C7laFpcwuFHKq/0AsgLEwDjpA9x9VvAdqqStQV6CuQF2BxlfgL2a03kth5atRAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAz1JREFUaAXtmLtrFEEcx+9iYqLRRKImauEbiURRTCH4aBTRQi1VRBDRSgQbES38A7SwswhB1NJgY2UTfEAQsREN5gKi+CCYHCoGTEg05vz8ZDfekZvf7M7tbiLsDz7M3nxnfo+93dnZzWRSS89Aegb+6zOQjTP7QqGwCv+rodnjB+1bj8FsNlvgeHYZSW+Ca9AHmo0i3oe2WVEBiTTBDZiAMCbjb8LyGSuE4BvhM1RivUyel3gRBG2DoUoyL5rbmWgBBK6H90UJRHF4JLEiyFZuVpv1MOAS7IGT8Bg0e5RIAWTQCr+0TNA6oGSplt9wHUw2jjA/9iIIoiUhyd2DkuT9pOivhhdgsv3+2Fhaos6BQVN0r3+LFpwxpw3zh+m/qM0t1qqLf4Q43svYFmX8E56yLxVdpLswCXkY8to888Y4DmyuBey0ROiy6BkSlW3FLds4m15lG2DQtxr6/e4+/yDu1vUfsBWQ4zquIfmjsAvWwhqoh08ez2nv8E/I5ZOckVid4ebzu0c4kHV/wO9Q2p9oslqtTKwCgrUoCblKX5l4yKUIl3ugwSWQZU4Tumytj1nGTZNdClg4zUs0HfLQ66SI1jDuXAqIc8u7gORvx13AaIAAvxnzAM6ArEJyk+6A8/AFNNvOv9CuDahIw/l60ExebIxvV2jN8FpzgNZRUZLaZJzbVqFv2nzR8CFba81e2Xw460SthUklumjWByRjPio+vgdNMPRNzJNzHOfvlACymixWdF964x+UaRspTm5oq4UuwPPYa/G8wqKLPKyMkYViRNGnJNcCbNfo4akI5gNt+9DPPx3oo5drAd3mvP4qxzWdy2Mu+jplTE7RSiTXAnrwIrtKk20gyYMmkf5TsEjRAxeg+NAlErwKmo0hTiuCvnawvY4e0KP/U2XFcDKSWMbEfmhUHEygPfX4QLsNToC2Henm+t/HmPiNIs5BlCYffLV7I9qiCFYFsg2Oyi5Hm2EAb2ReA10VViBPb/kIJq+hyRuB5TvRWchDWJP3593JZ10mIok0wAV4CPKJ0GTy8eoZXIHaMq4CdzmvQrYIJCZfIDbDElgKdSD7nxyrzABtaukZSM9AegbSMzDzZ+APN8gj8tJpZiMAAAAASUVORK5CYII=\"","import React, { useEffect } from \"react\";\nimport { onAlignRight } from \"./commands\";\nimport { S_ALIGN_RIGHT } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/align-right-b.png\";\nimport w from \"./images/align-right-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function AlignRight({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_ALIGN_RIGHT === shortcut) {\n onAlignRight();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACjSURBVGgF7ZVBCsAwCATT/v/PLZQcl4CyIpbJNVHXUTZrcSAAAQh0ErgOxZ/DXceV1Hp3KHHWpAEnTXJBAAJxAtJb42m+iOp/Q2rFRpPTsoWNn4CNBIkgMJSA9NbdS7WvR5FJreNdiAaie8B7CEDAS0B6a7JE9b8htWKjyWnZwsZPwEaCRBAYSkB66+6l2tejyKTW8S5EA9E94D0EIACBfxF4Ab5fBSSraDBAAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACZSURBVGgF7ZVBDsAgCAS1//9z6wPggMmuxQxHqtk6JMwYFAQgAIGTBGYW/q7Kvp3oz1VR7hM1O/V4QKdp8a8QuJFAuFt3Hqr2Bh7YmYrjTnuROSCRAYE/E0g9oN7rVSh4oErMdR4PuEiTAwERgdQD1Ty1N/BAdSKu83jARZocCIgIpB5Q7/Xqe/BAlZjrPB5wkSYHAhC4lMAHKCsUJErFO80AAAAASUVORK5CYII=\"","import React, { useEffect } from \"react\";\nimport { onAlignCenter } from \"./commands\";\nimport { S_ALIGN_CENTER } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/align-center-b.png\";\nimport w from \"./images/align-center-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function AlignCenter({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_ALIGN_CENTER === shortcut) {\n onAlignCenter();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","import React from \"react\";\nimport { onAlignLeft } from \"./commands\";\nimport { S_ALIGN_LEFT } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/align-left-b.png\";\nimport w from \"./images/align-left-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function AlignLeft({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_ALIGN_LEFT === shortcut) {\n onAlignLeft();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACgSURBVGgF7ZVBCgAxCAO7+/8/dy89SlAwFJfptWLMtMS1OBCAAARuEniE+BZ3N67CWd8bk3RqYqCTJr0gAIE6gTBbTxv3HlDaaSfEaBqVqXD8C5i40BYCYwioLHbvgSqkcNbxKYSB6j+gHgIQ6CUQZuuRcO8BpZ12SYymUZkKx7+AiQttITCGgMpi9x6oQgpnHZ9CGKj+A+ohAAEI/IvABx5uBSQWB27qAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAACaSURBVGgF7ZUxDsAgDAOh//8zpTseLKWKjC5jGkF9QfYYFAQgAIFOAlNdvnapbx39uet073NqJvUQkLQt/hUCNxI4eusn9O8cUL7uQsZGXWLV8/EbqAbCeRBII9CWAy4olRvxLoQA9ykwDwEI1BJoywHl6648bNQlVj0fv4FqIJwHgTQCbTngglK5Ee9CCHCfAvMQgAAE7iLwAqg6FCS7ZxPVAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport { onAlignJustifyFull } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/align-center-b.png\";\nimport w from \"./images/align-center-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function AlignJustifyFull({\n enabled,\n enableDarkTheme,\n}: CommandProps) {\n return (\n \n );\n}\n","import React from \"react\";\nimport { onListOrdered } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/ordered-list-b.png\";\nimport w from \"./images/ordered-list-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function ListOrdered({\n enabled,\n enableDarkTheme,\n}: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEYSURBVGgF7VdBDsIwDAPEhY/yGHgLH+FLIEGN6KVyuq5bmxVcaYcFJ3Ecb8BupyMFpIAUkAL/rMCeDP9KYgyTQPxuD36t1+mcUzduwsLEz9dhMl2F8hh+AxpgevNtEccF5aknF9SrSh3eQlVTK0kK/JAC7E1ifcMyrLsUpW+hpzvTCgKnkHMPFzZyJvmI97wIBTsEu9y+BC8GrCd59Jp1rgGNJAxheX+zA8AuIAf7wEbW2ewAj8CYkbMGcY0ze4A8OwzLcIpJASnQUQH2YA71EJf+Fuqo6bxWbANphbiRFBvjKb7Vfdr/0yf3p743warBh7dQbgCsjK6tSqpGSYygZR2GbUSrvGxuA+VVhJQCUkAKSAEp4KTAG+EZiYfkA0XXAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFESURBVGgF7VjbDcIwDKSIHwZiJX7YBGZhCH5ZCSQ4i1oqTiyaqLgpnKUS4vhxPqeJ1NWKQgbIABkgA//MQGeLf0CGug4ynLf2f90aoFI8LrvaCa8Dul6asNbew7H4DrCA2i0xld+mNpC3J2vj1fotfgvVFk4/MvArDCQ3sXfDtnLqWOLHnkJ369jKPLkHlGl0YguQFzw7PAcL2OuUtZtqrrhGxQO4Ds9ZQEKOOafXUtxvDoOrA6xTD02KSN4TcYyD/srkgrULMN/34K4YZRtlpbcJG7IgoEzYBaIb9O674QWaS587hRLwc4FjXjJABj4zkDuF3r4LaYiim1CdAsbcKRSQdroUSQdsaLmpRGc7oHpr/625za953DM/GqACKh0Xv4XcAqRlIqWMRNsnAL2t02oxbgeimWQ+MkAGyAAZIAM1DDwBcD+q35kyEkkAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { onListUnOrdered } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/unordered-list-b.png\";\nimport w from \"./images/unordered-list-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function ListUnOrdered({\n enabled,\n enableDarkTheme,\n}: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADRSURBVGgF7ZhhCsMgDEZLf6zX346w9X7dEbZ8MIuVlCJa0O4FhBitxtdYPjoMGAQgAAEIQOCCBCY708Pa29ry8xXrxpT8J2mKxZaOn92P9z70RT5NSG8itnT87H689+qPq7d1lEwXtneA2cneiznT2giFS6yy6fISt4GRLCAAgf8lED6jaCGrgVoSI6uc0EJZuAomo4UK4PEoBCAAgQsTQAvZy62lgcI6WfWCFsrCVTB5Twu9nDWfTqzZ0M0yu1sL/4XkK4ZBAAIQgAAEIFCTwBeEleFduT45vgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADqSURBVGgF7ZjdCoMwDEbtLvR27MnnI2x7v/kI9RMMVEhgF6VUdwqhafzJ10Or0WGgQQACEIAABK5GIOc8yWbZIvvu/nSaee6C1R3aXE7gcKTBoMxd+qkcmC89i/y7jfd+SSk9LLZpNr9Fr9yu1luQvKm4QMNP4WgCH+dqL+ac1kFIq8M28baBz7eJO2CIBAhA4K8JFI9RaiHBqNKiFeXWF8pILRQRqx2nFqpNlPtBAAIQuAABvYntk5JaqEohpJtE64JaKCLTKh7VQm9HwMuJ9RnSkhtlT5n9F9r8sU+1qIIABCAAAQicmMAKZDUzqSLZm+8AAAAASUVORK5CYII=\"","import React from \"react\";\nimport { onIndentIncrease } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/indent-increase-b.png\";\nimport w from \"./images/indent-increase-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function IncreaseIndent({\n enabled,\n enableDarkTheme,\n}: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEASURBVGgF7ZeNCsMgDIS70Qf3zTeFFaScaazHNNsVCiXm5+6jVbptukRABERgJoGHMfxlrM1YglqfM5QwZ8oAk6Z6iYAI9BOAe2t/G1jBPkeg1r/dRhNkHiRYxHtej5LDvCl4DvEeA5SBzCa1+HAGzuJDGUDiwxhoifcYKDnMO7fru1JOtwRcdbNq76zBeeEPMuiqCqb83KJVpcHHVt3dOBziCaachIZ6apfJQSaWEecVcjbhrVsqrzaxlLAeMYeJqxr03YzE4LwdRu1gspe/uwr/ckgSCm3mBbX+/EHGJKheIrAiAfhlf4Syd5FR/1Br+F1IBkbfC9WLgAiIQGwCb96joAiYxtxmAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAD4SURBVGgF7VjRDoAgCKzWh/fnBW01a5zWYirteCpAuTtTR8NAowJUgAq0VGBExVcxFGvhH8WsupPljOQjgUirRaxU4I8KmGerB1Hve4T3QLoqou6Svod6VvBPPg/N8TQXkQTQDl6BuUxYc5IUfDgCd/ChCFjgwxBA4J8Q0BxPe71dpPi5YS0gpQmtMV98qF74fgAR2/25VcgOlOAXta2xpXowjkjAAT0GLBI94sxiupPIJvcaTEn0irGI6yBRSpQ8V0P1ZhRAfmks9H5A4ep+dmTVJWdBKkAFLgrAU0gP8Utm4xf+F2q8ALD8vxsaSJsBKkAFqICXAht49ZY9T19ulwAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport { onIndentDecrease } from \"./commands\";\nimport Icon from \"./Icon\";\nimport b from \"./images/indent-decrease-b.png\";\nimport w from \"./images/indent-decrease-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function DecreaseIndent({\n enabled,\n enableDarkTheme,\n}: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAD8SURBVGgF7ZeBCsMgDETbfbl/vi6gENpTjAm4lBNGRzTJ3VtVdhwcJEACJLCTwDlo/h3M7ZiCWj87lET2pIFImqxFAiRgJwDPVnsZmBF9j0Ctrz5GC+SaKCivgMeE5Ed+zOhac48Jc9PIhGZAnilNaAMpTdwNpDOBDFhM9PJX4+btMWo0sydG+Stz0ED6iwy6qsEepRn6UqKXvxqvsuYfqFGZT9+/8m4glXjBpw2kE68NpBTfDHjE618w4rtoMo1iWv1cHCFa13h2+EXgvxy40h6U5pEDan31RRZJj7VI4F8JwJ1dxUafIl4GUGv6U4gGvO8F80mABEggN4ELfTez8JzdF6kAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAD4SURBVGgF7ZjhCoUgDIWtJ/fNb44LIcOjzQSdnf2I2prb+SzDQqCRAAmQwEwCByr+S4ZiM/xHslLds+T05KMAT7PFXklgRwLFtXWE0NHfke99BxLBOGImpo0hj0CybhH/9HFHM4isdLcIc9GRCZkAOfUnQgnwJ6IgwJcIIOCxiEp+V8j8ejSqNN+JRr45jAS43w8gYaGCqElfBq3kd4VgoygAqkR0/3L+ggA/zQtNJcBX80qAv+YzAd3Nqxl8fSk9mSxVjKYEdfPrjtUAavj7kjuyGwVPSIAEphCAq5CsYlM6AkW/918IgFjOve+GZjnUbIgESGBPAhcOaOXmuuPgrgAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport { onQuote } from \"./commands\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/quote-b.png\";\nimport w from \"./images/quote-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function Quote({ enabled, enableDarkTheme }: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADUSURBVGgF7ZZBCsMwDATdvkxP189a+WpvQGZpQ2AMOWTZleRRDhmDAwEIQAACEIAABCAAgbsIvA4afw6807rWdvOy/VuqDxK5wN3LYgNswCTAJ2QCtONswEZoFnj8Bsz7j6gC8x9nfbK0zokyrdn5nvX85WR1UQNEs7ubb7bRtihZDZ/avqlRipPfCp4KeTFANAu5+WYbbYuSHXpuXk91oGZ51QWiWcPNN9toW5Sshk9t39QoxclvBU+FvBggmoXcfLMNNghAAAIQgAAEIAABCPyawBd8/WHIOIajVQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADHSURBVGgF7ZZLDgIxDENnOFm5+XAySHZR1UgGI1WIl1U/cdI+d9HjICAAAQhAAAIQgAAEILCLwKk2fkaouZl3RtR8V19r1fGtTn5xzAV2u4YDOGAS4AmZAG05DtgIzQL/40D+beYIePcG4GNen7U5f0c/1/vKPD5oV37SFjGUBqGz9EqPNieaj8XBc+lqRWXD1ZdSnw3zoHnaRQylYugsvdKjzYnm0F84l0uSey1ZZQP6O9++4hA5EIAABCAAAQhAAAIQkAm8AAQBgukbLjjlAAAAAElFTkSuQmCC\"","import React, { useEffect } from \"react\";\nimport { onSourceCode } from \"./commands\";\nimport Icon from \"./Icon\";\nimport b from \"./images/code-b.png\";\nimport w from \"./images/code-w.png\";\nimport { S_SOURCE_CODE } from \"./shortcuts\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function SourceCode({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_SOURCE_CODE === shortcut) {\n onSourceCode();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFKSURBVGgF7ZfNakJBDIWlD1RKsYgIfavus+iyPqla+7evJ9APXMzizjiToZDAcMKY3Hw5iBdXq4x0IB1IB9KBdCAdSAfSgVYHTI2vrc3q834/U8I09ffv7BsIrvs9Dw3TNODRtwqCl0K/PzMkTFOARn9091wx/V61h8JzrOIZTaU+AGi0Fp7B4Uv0hA9fYgR82BIj4YcvEQE/bIlI+O5LzIDvtsRM+Ool7uhYoP67/2/CRMqLCv3W3S5gg24vuNISX1pgO3CJbvAwlpb41IcbCjpqd3jYTAlfI/RDd08UdNBh8LCZEuDRs+7WFNygw+FhMyXAo++6e6SgQcPgYTMlwKMn3T1QUKHh8LCZEuDRo+4caGlMgwfQlACP+t/EpTH1LyWQpgR4z2vD1HBLf+28Yr1D+GkNU6OfjHQgHUgH0oF0IB1IB9KBBgcu5S7j6SP50T4AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFESURBVGgF7ZfNagJBEIQlDxQkGEQCeSvve/AYn9S//Hhfy7AFi9jr7Mx0byC1IC09XdNflQfZ2UyPElACSkAJKAEloASUQFYCbds2+GyyxBB1+iZXX6TrlqP8Ptuxl0F1Nc8n1gS29pcT4iPVBARrino1xgQW3oM/o/8+wsAz5nc9eH71NYEtxfA0ibtiTdSEDzfhAR9mwhPe3UQEvJuJSPjqJqaAr2ZiSvgcE08UJdQ2YeZvjBi/wg/6b96E2FHnD84w8Y3+ystENXgCGia+0F9yplatDk8ww8Qn+q+cKa1u8AQzTJzQX3Amt7rDE8wwcUT/hTNjaxg8wQwTB/TnnEmt4fAEM0zsr0CceVQngyeYYWLN80cV+uleKQl3Y6JhP7WW6lP3DM51EM3g0MBhqX7gah0pASWgBJSAElACSuBfJHABrI86yyLv2DAAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/video-b.png\";\nimport w from \"./images/video-w.png\";\nimport { CommandProps } from \"./types\";\n\nexport default function Video({ enabled, enableDarkTheme }: CommandProps) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEnSURBVGgF7ViLCsIwDJz+nX8Vf1U/RC9oRihp146lbHCBkseR5HoFYS4LjQpQASpABagAFaACVCBS4IHiG+eTfF6Yr7sOtxnkTRy9RMukBdYwGz7L13goeeUwbLOI256IoKDYwqOetWaNs/y6+B8IvN9d4pu5b54Re0KCpNzp8a64HJCdGylBEO0yvNtHQzJrSkxwajsUH7LaoKy6gF1rdkj+FlZ/RR12Jgu53s/EcA8XXmCPakf28AWOVHPPrDO9wHPPBVo9rd/kDEy5CE5ttuJDVhuUVTdygiDaYXi3j4Zk1jwxQVLu8nhXXA7IzktSgoLfWeKbuW+eEUeEBEXbHeHNmjXO8jUyAkA5DNvlP+ov/7fK8JOxgQpQASpABagAFaACF1PgC30QEGR/RFDmAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEsSURBVGgF7ZgBDoIwDEXBeAwvxKnEq4L3wF/NCBntBsiWav6SOWi39f0/UWPTsNEBOkAH6AAdoAN0gA6sHJimqUMf0Uu3AQW6FcC3AWxaAz6YM6R4MalP5dVc2LnWqEIgKPDCYOXNeC3wUEcDQe4NL3O0fDIWNq41xjCoO8MLQ5wP95dw4WkUePDctzC5E7AHXgS6ErAX3pWAI/AioJUXrWFD88HR5peOtWhaDVdvIQ0wF6OAnEOl8zyB0g7n9vd0Ao8crJZ3IwCfkj0Ad4twI0DcPSLClYCjImTdqsk3cc0WA6D2pp/T8br5via81JoLLy6WIhbhbZceBAhpEGFRX60E4k/0WyJ/Zmq0NpMH2zgga8knjkW//bdKWh6zdIAO0AE6QAfoAB34Cwdeq1xOBDGwXn8AAAAASUVORK5CYII=\"","import React from \"react\";\nimport { S_LINK } from \"./shortcuts\";\nimport { createLink } from \"./commands\";\nimport { getSelectedText, isURLValid } from \"../../../../lib\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/link-b.png\";\nimport w from \"./images/link-w.png\";\nimport { CommandPropsWithShortcut, CommandPropsWithOnClick } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function Link({\n enabled,\n enableDarkTheme,\n shortcut,\n onClick,\n}: CommandPropsWithShortcut & CommandPropsWithOnClick) {\n useEffect(() => {\n if (S_LINK === shortcut) {\n const linkText = getSelectedText();\n if (isURLValid(linkText)) {\n createLink(linkText);\n } else {\n onClick();\n }\n }\n }, [shortcut, onClick]);\n\n return (\n \n );\n}\n","export function isURLValid(str: string) {\n const re = /^https?:\\/\\/.+\\..+/i;\n return str.match(re);\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/tick-b.png\";\nimport w from \"./images/tick-w.png\";\nimport { CommandPropsWithOnClick } from \"./types\";\n\nexport default function Tick({\n enabled,\n enableDarkTheme,\n onClick,\n}: CommandPropsWithOnClick) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAD8SURBVGgF7ZZBDoIwFESJG3deR4/mstfyBl7HE+iMZBKTIpQu2l+dn9RPCNg3D1ucJpcN2IAN2IAN2IAN/KSBC1JdR01G+AfGEyNhDFWf8AywGuIQLBrhbxinYFxFOEvmV+0XfWujiwzfSHQ2jc1nShqdOGMe7fPaKodZsIZv9CvJpulmnm9Fvh0JUFtd4e+g5gLjoqsJ0Q3+CGDBa6fYG6IbPNjflfApePXSEN3h5wjz/3HBq2+FCANfEyIc/J4QYeFLQoSH3wrBdaE1op50U7ROMEF+67wmdCXQDQsvs0sheG6oSqDVk+DxkJVAzeGyARuwARuwARv4KwMvKdSx0s1a2l8AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEFSURBVGgF7ZZLCsMwDERDN93lOs3RuvS1coNepydwRxBB83FRXLClMAJhMHH05pGEDAOLBmiABmiABmiABq5nIOc8oZ8hky3wb6xSKVQIAIt5hZcAUsUQN0/pADqBZ0aPnrhMLAKP3prHVtm+6cYtLiJ8C8tHM2j+yEqLPZh/oMO+sIRv8ZTsZnR7bDB4RM8CsKMybvSGfwFASl660yHkzHIWy6qSMX/dZRh1Ryu8Tj4VAof6wGtkACQl/1pNIbrD/xPCDXxNCHfwZ0K4hbeEcA9vCBHn3wa2j75O2F5V0tAuV6D+CuEbXo0WQsSAL4SIBb8JERNeQ3ClARqgARqgARqoMPABtK9PX6LiCucAAAAASUVORK5CYII=\"","import { onRemoveTextFormat } from \"./commands\";\nimport { S_REMOVE_FORMAT } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/clear-format-b.png\";\nimport w from \"./images/clear-format-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function RemoveTextFormat({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_REMOVE_FORMAT === shortcut) {\n onRemoveTextFormat();\n }\n }, [shortcut]);\n return (\n \n );\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAHNSURBVGgF7ZdBTsMwEEUjpLJmB+q+vQGwYcUx6GHKXSjnyAqpiBPAGsqKA7AKzyhUzjCOk0hxJpJHGtUzGcfvTxPZKYpsuQO5A7kDuQO5A7kDxjpQVdUSL/GVRCP3giczuX40hszBv9WE7/w2RBCf4clERIFlAXAl7tukIiRfNIZ8jR98BYwnExEF1goCIj7IJ3+cNL5OOSsiOsGGirqK0OYz9xnX7EqrHy0HgfZO/HucfADmXGvk5PZ+XbJxXxHUPwYEbJJBy4X6iKD2SRHwSe5U3jdp3FUEddpmt00KG1psoIhv5l2E7pk8P0DEQ3LI2IItItb+XOrc49TI+dcnHbeIaOzYk0LGFm8RYbPrmiBE3ODS3GY3uogTDWhA7laZsyRXphChrN09BeACl8dvUkdL8k90JxaVYN4dUcMDuyJg3ge4v0TenggALwXkX+iO0ivcfcn5ZksEZDufzhv/njqJ7YoA7hx3ZxxpjVMnF22KAGwryev4XrznBXlbIgBa4K7T0oKnTgrtiABmI8nreCe778dmRAAy+IPdjAi/s33HARFuNx/97NSXNVgfEFEGJ1i8IES8ErsD4LysFlHOEn5erc60uQO5A6N04Ae+Q/pKv3SOpgAAAABJRU5ErkJggg==\"","import React, { useEffect } from \"react\";\nimport { onRTL } from \"./commands\";\nimport Icon from \"./Icon\";\nimport b from \"./images/rtl-b.png\";\nimport w from \"./images/rtl-w.png\";\nimport { S_RTL } from \"./shortcuts\";\nimport { CommandPropsWithShortcut } from \"./types\";\n\nexport default function RTL({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_RTL === shortcut) {\n onRTL();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAFkSURBVGgF7VbdbcMgEHb70GmyVRfJBnnpNJEyRhfICn2ukjtFJ6FPOBj4OGzpkBDGwPdzh8HLEiUiEBHojcBJAC5Sf6X+SX10VlnuU76E5kfqv9Re0el6F/Uq/kYWbiZcDGjkjZDdDjege75m26AgNIzjVf3Pqtmvyd/StKxroBqzRE8bjOK7PqrAuTg+vF97VKIgqoFDbwWNTIuBO4Z0Zr/FwHWmYAb3ro7RVkM1FxlyUD9iBN/ar/mVQMxdGFBRW3/mdmvAhJV+p22etdQMfBgqsVWBaUGO0ni6tvjccowWQT0nhAHPaOe4IgO5qHi+iwx4RjvH1ZuBcw70KO9UPF5Kqr1005bGFWN4OQuDCRlOxiZIxecywOaj4qH4QxnIiT+MgTXx9h2MbLu30EzxxQz33gPd0fECmJkFmsc1EzQCD6CcCQ9eKgeaoIJ7gaUmvDjpPGaCDuwJqCaiRAQiAhMj8ATtsVBxYFe9wQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { onLTR } from \"./commands\";\nimport { S_LTR } from \"./shortcuts\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/ltr-b.png\";\nimport w from \"./images/ltr-w.png\";\nimport { CommandPropsWithShortcut } from \"./types\";\nimport { useEffect } from \"react\";\n\nexport default function LTR({\n enabled,\n enableDarkTheme,\n shortcut,\n}: CommandPropsWithShortcut) {\n useEffect(() => {\n if (S_LTR === shortcut) {\n onLTR();\n }\n }, [shortcut]);\n\n return (\n \n );\n}\n","export default \"data:image/png;base64,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\"","import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/more-b.png\";\nimport w from \"./images/more-w.png\";\nimport { CommandPropsWithOnClick } from \"./types\";\n\nexport default function More({\n enabled,\n enableDarkTheme,\n onClick,\n}: CommandPropsWithOnClick) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAC1SURBVGgF7ZRtCoAgDIajw3T8TtCdgi5QvpBQY5r+2A/jGQzdB257UKcJgQAEIAABCEAAAhCAAAQgAAEIQKBGYEnBNelxq/bylSQ6v1TX9auZPelpVD5viOj8VLZPRNs2n23FrETn23qftq5NbtiuilmJzn/Vm1/WgEbLAFtlLi/m+fIRXszz1fJzrHmNfpS95zc3/kxUET3OIb/R5yDsIQABCEAAAhCAAAQgAAEIQAACfyFwAY7YbDUcW21lAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADASURBVGgF7ZRBDoQwCEXNHMbje4K5k4kXqJ+kbhBqXbCYzCMhWvgF+lJdFgwCEIAABCAAAQhAAAIQgAAEIACBlEBrbZVv8qO7va/ZBsvJy/RZ3zDeh9n19Gax2yEsJi/Th0OOghrGSGa2+b0Slup9v8e1BrJrk9nhC0hYqvf9Pj7wa+uZA3wHh4pyUewqEeWi2Eh/5eaeuhKlH+Xb+nNTO1VvUvZbfFvfjccSAhCAAAQgAAEIQAACEIAABCDwlwROQxL2uBkGPV8AAAAASUVORK5CYII=\"","import React from \"react\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/back-b.png\";\nimport w from \"./images/back-w.png\";\nimport { CommandPropsWithOnClick } from \"./types\";\n\nexport default function DecreaseIndent({\n enabled,\n enableDarkTheme,\n onClick,\n}: CommandPropsWithOnClick) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADaSURBVGgF7ZZLDsIwDEQLLDgSW47FMkdjwTU4BCeAicRIbZVFiRIiV8+SZafKZ/zchacJgwAEIAABCPQjkHR19pCWpPr99ZyHsiS1Fu94i1JBSfxL4i8RCkD8qC5BHvIVBPhtKqA1OQL5JhgrLtkdec84vWMF6+WREvneouf3L9WsVsfVerfLpMrmVP6ZN4NaKiLMmGwKFGESoyOdGN0Bv08nTGJ0pBOjO+D36YRJbI2nrRt/2HfX3oP8KredlTzlD3+IEJNEeujLeUhLUp0dgwAEIAABCHQh8AEUYefcUC17eQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADMSURBVGgF7ZhBCsMwDARDPtWv9Zgv9wWOEqxLiJUevAi1IzACK0ir2YvJshAQgAAEIAABEYHW2nYcUXtt2y7e0hm1ljDJB/lrvLXIJnU31XfiP3b/mjRC1wbxOrZxZ8jHfHRVyOvYxp0hH/PRVSGvYxt3HpC3a33Eyr6omsS7t41eeZ/wJHF9+uAn6pkuTAM4WKLGM9kpsISTyM44ke2Az8cJJ5GdcSLbAZ+PE04iOw+cqPFr0eFdltj8vlTuS9QUX4o0YiEAAQj8L4EdGXEXMFQ+Uf4AAAAASUVORK5CYII=\"","import React from \"react\";\nimport styled from \"styled-components\";\nimport { eventEmitter, i18n, navigate } from \"../../../services\";\nimport {\n hasSelection,\n getSelectionRange,\n setSelectionRange,\n EVT_MOUSEUP,\n EVT_MOUSEDOWN,\n EVT_KEYUP,\n EVT_KEYDOWN,\n EVT_DBLCLICK,\n} from \"../../../lib\";\nimport { isShortcut, S_ARABIC, S_NEW_PAGE } from \"./tools/shortcuts\";\nimport {\n createLink,\n HIDE_TOOLBAR,\n isAlignCenter,\n isAlignLeft,\n isAlignRight,\n isBold,\n isIndentDecrease,\n isIndentIncrease,\n isItalic,\n isListOrdered,\n isListUnOrdered,\n isUnderline,\n onArabicLang,\n} from \"./tools/commands\";\nimport { getPosition } from \"./helpers\";\nimport { ID_EDITOR_CONTENTS } from \"../Contents/styles\";\n\nimport tools from \"./tools\";\n\nconst OFFSET_TOP = 50;\n\nconst Container = styled.div<{\n show?: boolean;\n top: number;\n right: number;\n enableDarkTheme?: boolean;\n}>`\n visibility: ${(p) => (p.show ? \"visible\" : \"hidden\")};\n z-index: 10;\n user-select: none;\n position: absolute;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n height: 30px;\n right: ${(p) => p.right}px;\n top: ${(p) => p.top - OFFSET_TOP}px;\n border-radius: 2px;\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#000\")};\n`;\nconst Group = styled.div<{\n enableDarkTheme?: boolean;\n}>`\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n padding: 0 7px;\n height: 30px;\n\n &:empty {\n display: none;\n }\n\n &:after {\n content: \" \";\n position: absolute;\n left: 0;\n top: 0;\n width: 1px;\n height: 100%;\n background-color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n }\n\n &:last-child:after {\n display: none;\n }\n\n img {\n cursor: pointer;\n width: 24px;\n height: 24px;\n }\n`;\n\nexport const CTX_ALL = \"ctx/active\";\nexport const CTX_MORE = \"ctx/more\";\nexport const CTX_LINK = \"ctx/link\";\nexport const CTX_ERROR = \"ctx/error\";\nexport const CTX_TEXT_SIZE = \"ctx/textSize\";\n\ntype Props = {\n doc_id: number;\n page_id: number;\n parent_id: number;\n enableDarkTheme: boolean;\n};\n\ntype Tool = {\n [x: string]: any;\n name: string;\n show: boolean;\n context?: string | undefined;\n};\ntype State = {\n show: boolean;\n right: number;\n top: number;\n error: string | null;\n context: string | null;\n shortcut: string | null;\n view: Array>;\n};\n\nexport class Toolbar extends React.Component {\n private elmContents: HTMLDivElement | null = null;\n private savedSelectionRange: ReturnType = null;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n show: false,\n right: 0,\n top: 0,\n error: null,\n context: null,\n shortcut: null,\n\n view: [\n [\n { name: \"bold\", show: true },\n { name: \"italic\", show: true },\n { name: \"underline\", show: true },\n ],\n [\n { name: \"textSize\", show: true },\n {\n name: \"h1\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n {\n name: \"h2\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n {\n name: \"h3\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n {\n name: \"h4\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n {\n name: \"h5\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n {\n name: \"h6\",\n show: false,\n context: CTX_TEXT_SIZE,\n },\n ],\n [\n { name: \"alignRight\", show: true },\n { name: \"alignCenter\", show: true },\n { name: \"alignLeft\", show: true },\n ],\n [\n { name: \"quote\", show: true, context: CTX_MORE },\n { name: \"sourceCode\", show: true, context: CTX_MORE },\n ],\n [\n { name: \"ol\", show: true },\n { name: \"ul\", show: true },\n ],\n [\n { name: \"increaseIndent\", show: true },\n { name: \"decreaseIndent\", show: true },\n ],\n [\n { name: \"link\", show: true },\n {\n name: \"linkField\",\n show: true,\n width: 300,\n context: CTX_LINK,\n textAlign: \"left\",\n placeholder: i18n.get(\"toolbar.linkPlaceholder\"),\n },\n { name: \"image\", show: true },\n /*{ name: 'video', show: true, width: 20 },*/\n ],\n [\n { name: \"rtl\", show: true, context: CTX_MORE },\n { name: \"ltr\", show: true, context: CTX_MORE },\n ],\n [\n {\n name: \"removeFormat\",\n show: true,\n context: CTX_MORE,\n },\n ],\n [\n {\n name: \"errorMsg\",\n show: true,\n width: 330,\n context: CTX_ERROR,\n msg: \"\",\n },\n { name: \"more\", show: true },\n { name: \"back\", show: false, context: CTX_ALL },\n ],\n ],\n };\n }\n\n componentDidMount() {\n this.elmContents = document.getElementById(\n ID_EDITOR_CONTENTS\n ) as HTMLDivElement;\n\n if (!this.elmContents) {\n return;\n }\n\n this.elmContents.addEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n this.elmContents.addEventListener(EVT_MOUSEUP, this.onMouseUp);\n this.elmContents.addEventListener(EVT_KEYUP, this.onKeyUp);\n this.elmContents.addEventListener(EVT_KEYDOWN, this.onKeyDown);\n this.elmContents.addEventListener(EVT_DBLCLICK, this.onDblClick);\n eventEmitter.on(HIDE_TOOLBAR, this.onHide);\n }\n\n componentWillUnmount() {\n if (!this.elmContents) {\n return;\n }\n\n this.elmContents.removeEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n this.elmContents.removeEventListener(EVT_MOUSEUP, this.onMouseUp);\n this.elmContents.removeEventListener(EVT_KEYUP, this.onKeyUp);\n this.elmContents.removeEventListener(EVT_KEYDOWN, this.onKeyDown);\n this.elmContents.removeEventListener(EVT_DBLCLICK, this.onDblClick);\n eventEmitter.off(HIDE_TOOLBAR, this.onHide);\n\n this.elmContents = null;\n }\n\n onMouseDown = () => {\n this.setState({ show: false });\n this.clearContext();\n };\n\n onMouseUp = () => {\n if (hasSelection()) {\n const pos = getPosition();\n if (pos) {\n const { right, top } = pos;\n this.setState({\n top,\n right: window.innerWidth - right,\n show: true,\n });\n }\n } else {\n this.setState({\n show: false,\n });\n this.clearContext();\n }\n };\n\n onKeyUp = () => {\n this.clearContext();\n\n const pos = getPosition();\n if (pos) {\n const { right, top } = pos;\n this.setState({\n top,\n right: window.innerWidth - right,\n show: hasSelection(),\n });\n }\n };\n\n onKeyDown = (evt: KeyboardEvent) => {\n const { code, context } = isShortcut(evt);\n if (code) {\n this.editorActions(code);\n\n context && this.setContext(context);\n this.setState({ shortcut: code }, () =>\n this.setState({ shortcut: null })\n );\n\n evt.preventDefault();\n return false;\n }\n\n this.clearContext();\n\n const pos = getPosition();\n if (pos) {\n const { right, top } = pos;\n this.setState({\n top,\n right: window.innerWidth - right,\n show: hasSelection(),\n });\n }\n };\n\n onDblClick = (evt: MouseEvent) => {\n this.show(evt);\n };\n\n editorActions = (shortcut: string) => {\n const { doc_id, parent_id } = this.props;\n if (shortcut === S_NEW_PAGE) {\n navigate.to(\n `/app/pages/${doc_id}/create?redirect=pages/EDITOR&parent_id=${parent_id}`\n );\n } else if (shortcut === S_ARABIC) {\n onArabicLang();\n }\n };\n\n show = (evt: MouseEvent) => {\n this.clearContext();\n this.setState({\n show: true,\n right: window.innerWidth - evt.clientX,\n top: evt.clientY,\n });\n };\n\n hide = () => {\n this.setState({ show: false });\n this.clearContext();\n\n if (this.savedSelectionRange) {\n setSelectionRange(this.savedSelectionRange);\n this.savedSelectionRange = null;\n }\n };\n\n onHide = () => this.hide();\n\n onTextSize = () => this.setContext(CTX_TEXT_SIZE);\n onMore = () => this.setContext(CTX_MORE);\n\n onSetErrorMsg = (msgId: string) => {\n this.setState({ error: i18n.get(msgId) });\n this.setContext(CTX_ERROR);\n };\n\n onLink = () => {\n this.savedSelectionRange = getSelectionRange();\n this.setContext(CTX_LINK);\n };\n\n onSetLink = (link: string) => {\n if (!this.savedSelectionRange) {\n return;\n }\n\n setSelectionRange(this.savedSelectionRange);\n this.savedSelectionRange = null;\n createLink(link);\n };\n\n canShow(t: Tool, context: string) {\n if (!t.context) {\n return false;\n }\n\n return t.context === context || t.context === CTX_ALL;\n }\n\n setContext = (context: string) => {\n this.setState({ context });\n\n const { view } = this.state;\n this.setState({\n view: view.map((group) =>\n group.map((t) => ({\n ...t,\n show: this.canShow(t, context),\n }))\n ),\n });\n };\n\n clearContext = () => {\n const { view } = this.state;\n const cmdIndent = [\"increaseIndent\", \"decreaseIndent\"];\n const cmdAlign = [\"alignLeft\", \"alignRight\", \"alignCenter\"];\n\n this.setState({\n context: null,\n error: null,\n\n view: view.map((group) =>\n group.map((t) => {\n let show = !t.context;\n\n if (\n cmdIndent.includes(t.name) &&\n !isListOrdered() &&\n !isListUnOrdered()\n ) {\n show = false;\n } else if (cmdAlign.includes(t.name)) {\n if (t.name === \"alignRight\" && isAlignRight()) {\n show = false;\n } else if (\n t.name === \"alignCenter\" &&\n isAlignCenter()\n ) {\n show = false;\n } else if (t.name === \"alignLeft\" && isAlignLeft()) {\n show = false;\n }\n }\n\n return {\n ...t,\n show,\n };\n })\n ),\n });\n };\n\n private contextFn: Record void) | ((x: string) => void)> = {\n textSize: this.onTextSize,\n more: this.onMore,\n link: this.onLink,\n linkField: this.onSetLink,\n back: this.clearContext,\n };\n\n private enabledFn: Record boolean> = {\n bold: isBold,\n italic: isItalic,\n underline: isUnderline,\n alignRight: isAlignRight,\n alignCenter: isAlignCenter,\n alignLeft: isAlignLeft,\n ol: isListOrdered,\n ul: isListUnOrdered,\n decreaseIndent: isIndentDecrease,\n increaseIndent: isIndentIncrease,\n };\n\n render() {\n const { doc_id, page_id, enableDarkTheme } = this.props;\n const { view, error, shortcut, show, top, right } = this.state;\n\n return (\n \n {view.map((o, i) => {\n return (\n \n {o.map((p) => {\n const errorMsg =\n p.context === CTX_ERROR && error\n ? error\n : null;\n\n if (!p.show) {\n return null;\n }\n\n const enabled = this.enabledFn[p.name]\n ? this.enabledFn[p.name]()\n : false;\n\n const Component = tools[p.name];\n return (\n \n );\n })}\n \n );\n })}\n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport debounce from \"lodash/debounce\";\nimport { contentHash, fixArabicFont } from \"../../helpers\";\nimport { savePage } from \"../../reducers/pages/actions\";\nimport { getVisibilityProps, EVT_WIN_BEFOREUNLOAD } from \"../../lib\";\nimport { getIds, pageOrDocChanged, compareHashWithContents } from \"./helpers\";\n\nconst Container = styled.div<{ enableDarkTheme: boolean }>`\n position: fixed;\n top: 35px;\n width: 100%;\n font-size: 24px;\n font-weight: 700 !important;\n font-family: urdu, QuranFont, sans-serif;\n text-align: center;\n color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#000\")};\n outline: none;\n`;\n\nconst mapDispatch = { savePage };\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n readOnly: boolean;\n enableDarkTheme: boolean;\n\n doc_id: number;\n page_id: number;\n page: any;\n};\ntype Props = DispatchProps & OwnProps;\ntype State = {\n counter: number;\n focused: boolean;\n};\nclass Name extends React.Component {\n private name: string = \"\";\n private save: ReturnType;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n counter: 0,\n focused: false,\n };\n\n this.save = debounce(this._save, 5 * 1000);\n this.setupEvents();\n }\n\n setupEvents() {\n window.addEventListener(EVT_WIN_BEFOREUNLOAD, () => this.save.flush());\n\n const { visibilityChange } = getVisibilityProps();\n window.addEventListener(visibilityChange, () => {\n if (document.hidden) {\n this.save.flush();\n }\n });\n }\n\n componentDidMount() {\n this.setName(this.props);\n }\n\n componentWillUnmount() {\n this.save.flush();\n }\n\n componentWillReceiveProps(nextProps: Props, nextState: State) {\n if (pageOrDocChanged(this.props, nextProps)) {\n this.save.flush();\n this.setName(nextProps);\n }\n\n if (\n this.name === \"\" &&\n nextProps.page &&\n this.name !== nextProps.page.get(\"name\")\n ) {\n this.setName(nextProps);\n }\n }\n\n shouldComponentUpdate(nextProps: Props, nextState: State) {\n return (\n this.state.focused !== nextState.focused ||\n this.state.counter !== nextState.counter ||\n this.props.enableDarkTheme !== nextProps.enableDarkTheme\n );\n }\n\n private lastSaveHash: string = \"\";\n _save = () => {\n const contents = this.name;\n if (!compareHashWithContents(this.lastSaveHash, contents)) {\n this.lastSaveHash = contentHash(contents);\n\n const { doc_id, page_id } = getIds(this.props);\n this.props.savePage({ doc_id, page_id, data: { name: contents } });\n }\n };\n\n onFocus = () => this.setState({ focused: true });\n onBlur = () => this.setState({ focused: false });\n\n onChange = (contents: string) => {\n this.name = contents;\n this.save();\n };\n\n onKeyUp = (evt: React.KeyboardEvent) =>\n this.onChange((evt.target as HTMLDivElement).innerText);\n\n getName = () => {\n if (!this.state.focused) {\n return fixArabicFont(this.name);\n }\n\n return this.name;\n };\n\n setName = ({ page }: Props) => {\n this.name = page ? page.get(\"name\") : \"\";\n this.setState({ counter: this.state.counter + 1 });\n };\n\n markup() {\n return {\n __html: this.getName(),\n };\n }\n\n render() {\n const { readOnly } = this.props;\n return (\n \n );\n }\n}\n\nexport default connect(null, mapDispatch)(Name);\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nexport const Container = styled.div<{\n textAlign?: string;\n enableDarkTheme?: boolean;\n}>`\n position: absolute;\n right: 0;\n bottom: 45px;\n min-width: 200px;\n max-width: 70vw;\n max-height: 80vh;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 5px 0;\n text-align: ${(p) => p.textAlign || \"center\"};\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#000\")};\n border-radius: 4px;\n white-space: nowrap;\n`;\n\nconst Item = styled.div<{\n justifyContent: string;\n active?: boolean;\n enableDarkTheme?: boolean;\n primary?: boolean;\n padding: string;\n}>`\n display: flex;\n flex-wrap: nowrap;\n justify-content: ${(p) => p.justifyContent};\n cursor: ${(p) => {\n return p.active ? \"default\" : \"pointer\";\n }};\n user-select: none;\n padding: ${(p) => p.padding};\n border-bottom: 1px solid\n ${(p) => (p.enableDarkTheme ? \"#f5f5f5\" : \"#353839\")};\n color: ${(p) => {\n if (p.primary) {\n return \"#3e8ede\";\n }\n\n return p.enableDarkTheme ? \"#000\" : \"#f5f5f5\";\n }};\n\n background-color: ${(p) => {\n if (p.active) {\n return p.enableDarkTheme ? \"#ebebeb\" : \"#353839\";\n }\n\n return \"transparent\";\n }};\n\n &:last-child {\n border-bottom: 0;\n }\n\n &:hover {\n background-color: ${(p) => {\n if (p.active) {\n return p.enableDarkTheme ? \"#ebebeb\" : \"#353839\";\n }\n\n return p.enableDarkTheme ? \"#f5f5f5\" : \"#353839\";\n }};\n }\n`;\n\ntype Props = {\n justifyContent?: string;\n active?: boolean;\n enableDarkTheme?: boolean;\n primary?: boolean;\n padding?: string;\n onClick: () => void;\n children: JSX.Element | JSX.Element[];\n};\n\nexport function MenuItem(props: Props) {\n const {\n primary,\n active,\n justifyContent,\n enableDarkTheme,\n padding,\n onClick,\n } = props;\n\n return (\n \n {props.children}\n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport { FormattedMessage } from \"react-intl\";\nimport { navigate } from \"../../../services\";\nimport { PAGE_EDITOR } from \"../../../settings\";\nimport { fixArabicText, isPointInRect } from \"../../../helpers\";\nimport { EVT_MOUSEDOWN } from \"../../../lib\";\n\nimport { Container, MenuItem } from \"./List\";\nimport Icon from \"./Icon\";\nimport { AppState } from \"../../../store\";\n\nconst IndentMark = styled.div<{ indent: number }>`\n display: ${(p) => (p.indent > 0 ? \"block\" : \"none\")};\n position: relative;\n margin-left: 8px;\n width: 25px;\n border-bottom: 1px solid #fff;\n margin-bottom: 10px;\n`;\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n enableDarkTheme: boolean;\n canAdminister: boolean;\n iconElm: React.RefObject;\n\n hideMenu: () => void;\n};\nconst mapState = (state: AppState, { doc_id }: OwnProps) => ({\n //@ts-ignore\n pages: state.pages.filter((p: any) => p.get(\"doc_id\") === doc_id),\n});\ntype StateProps = ReturnType;\ntype Props = StateProps & OwnProps;\n\nclass PagesList extends React.Component {\n private elmContainer: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.elmContainer = React.createRef();\n }\n\n componentDidMount() {\n window.addEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n onMouseDown = (evt: MouseEvent) => {\n if (!this.elmContainer || !this.elmContainer.current) {\n return;\n }\n\n const point = { x: evt.clientX, y: evt.clientY };\n if (\n !isPointInRect(\n point,\n this.elmContainer.current.getBoundingClientRect()\n )\n ) {\n this.close();\n }\n };\n\n onClick = (id: number) => {\n const { doc_id } = this.props;\n navigate.to(`/app/e/${doc_id}/${id}`);\n\n this.close();\n };\n\n addNewPage = () => {\n const { doc_id } = this.props;\n navigate.to(`/app/pages/${doc_id}/create?redirect=${PAGE_EDITOR}`);\n };\n\n close = () => {\n this.props.hideMenu();\n };\n\n render() {\n const { page_id, pages, enableDarkTheme, canAdminister } = this.props;\n const list: Array<{\n id: number;\n name: string;\n indent: number;\n position: number;\n }> = [];\n\n pages.forEach((p: any) => {\n list.push({\n id: p.get(\"id\"),\n name: p.get(\"name\"),\n indent: p.get(\"_indent\"),\n position: p.get(\"position\"),\n });\n });\n\n // list.sort((a, b) => a.position - b.position)\n\n return (\n \n {list.map(({ id, name, indent }) => (\n this.onClick(id)}\n active={id === page_id}\n padding=\"5px 15px 5px 0\"\n >\n \n \n \n ))}\n\n {canAdminister && (\n \n \n \n )}\n \n );\n }\n}\n\nexport default connect(mapState)(PagesList);\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Img = styled.img<{\n width: number;\n height: number;\n}>`\n cursor: pointer;\n width: ${(p) => p.width}px;\n height: ${(p) => p.height}px;\n`;\n\ntype EditorMenuIconProps = {\n enableDarkTheme: boolean;\n width?: number;\n height?: number;\n onClick: () => void;\n w: string;\n b: string;\n};\n\nexport default class Icon extends React.Component {\n render() {\n const { enableDarkTheme, w, b } = this.props;\n\n return (\n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport PagesList from \"./PagesList\";\n\nimport Icon from \"./Icon\";\nimport b from \"./images/menu-black.png\";\nimport w from \"./images/menu-white.png\";\n\nconst Container = styled.div`\n width: 36px;\n height: 36px;\n`;\n\ntype Props = {\n doc_id: number;\n page_id: number;\n canAdminister: boolean;\n enableDarkTheme: boolean;\n};\ntype State = {\n show: boolean;\n};\nexport default class PagesIcon extends React.Component {\n private timeout: ReturnType | null = null;\n private elmIcon: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.elmIcon = React.createRef();\n this.state = { show: false };\n }\n\n componentWillUnmount() {\n this.timeout && clearTimeout(this.timeout);\n }\n\n hide = () => {\n this.timeout = setTimeout(() => {\n this.setState({ show: false });\n }, 200);\n };\n\n onClick = () => this.setState({ show: !this.state.show });\n\n view() {\n if (!this.state.show) {\n return null;\n }\n\n const { doc_id, page_id, enableDarkTheme, canAdminister } = this.props;\n\n return (\n \n );\n }\n\n render() {\n return (\n \n {this.view()}\n \n \n );\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAC8SURBVHgB7dgxCsAwCAXQpPe/c5tMLsIPdCp9TqIWysPFjCEIECBAgAABAgQIECBAgAABAgQIECBwKjBPBu8VJ3Nfm5kr0j9faeDvfUBhAwABCgKhbYMCkDYBAgQIECBAgACBViCe+/srzx2tneIWcIuFPQAEKAiEtg0KQNoECBAgQIAAAQIEWgHPHS1LFZ0aZdFmgFqWKgIqizYD1LJUEVBZyAgQIECAAAECBAgQIECAAAECBAgQIPBS4AEzoQwiuF5BfQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAC5SURBVHgB7dhBCoAwDATA6v//rBchl4UtCIIwnkKSgh1ySdfyESBAgAABAgQIECBAgAABAgQIECBAYFfg2Gy8Nvv+1lbvf/7tRl//L6AiDghQEShlE1SAlAkQIECAAAECBAhEgbruP6c8d0Q+yWUXK0MACFARKGUTVICUCRAgQIAAAQIECEQBzx2RZZJWjbGIEaDIMklAYxEjQJFlkoDGQkSAAAECBAgQIECAAAECBAgQIECAAIGXAjc7FAMic34vmQAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { FormattedMessage } from \"react-intl\";\nimport { toggleEditorTheme } from \"../../../reducers/settings/actions\";\nimport { navigate } from \"../../../services\";\nimport { isPointInRect } from \"../../../helpers\";\nimport { EVT_MOUSEDOWN } from \"../../../lib\";\n\nimport { Container, MenuItem } from \"./List\";\nimport Icon from \"./Icon\";\n\nconst mapDispatch = { toggleEditorTheme };\n\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n doc_id: number;\n enableDarkTheme: boolean;\n canAdminister: boolean;\n iconElm: React.RefObject;\n\n hideMenu: () => void;\n};\ntype Props = DispatchProps & OwnProps;\n\nclass SettingsList extends React.Component {\n private elmContainer: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.elmContainer = React.createRef();\n }\n\n componentDidMount() {\n window.addEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_MOUSEDOWN, this.onMouseDown);\n }\n\n onMouseDown = (evt: MouseEvent) => {\n if (!this.elmContainer || !this.elmContainer.current) {\n return;\n }\n\n const elm = this.elmContainer.current;\n if (\n !isPointInRect(\n { x: evt.clientX, y: evt.clientY },\n elm.getBoundingClientRect()\n )\n ) {\n this.close();\n }\n };\n\n onClick = (id: string) => {\n const { doc_id } = this.props;\n if (id === \"pages\") {\n navigate.to(`/app/pages/${doc_id}/`);\n } else if (id === \"users\") {\n navigate.to(`/app/users/${doc_id}/`);\n } else if (id === \"toggleTheme\") {\n this.props.toggleEditorTheme(null);\n } else if (id === \"export\") {\n navigate.to(`/app/export/${doc_id}/`);\n } else if (id === \"translate\") {\n navigate.to(`/app/translate/${doc_id}/`);\n }\n\n this.close();\n };\n\n close = () => this.props.hideMenu();\n\n render() {\n const { enableDarkTheme, canAdminister } = this.props;\n const list = [];\n\n if (canAdminister) {\n list.push({ id: \"pages\", messageId: \"editorMenu.pages\" });\n list.push({ id: \"users\", messageId: \"editorMenu.users\" });\n }\n\n // list.push({ id: 'translate', messageId: 'editorMenu.translate' })\n list.push({ id: \"toggleTheme\", messageId: \"editorMenu.toggleTheme\" });\n // list.push({ id: 'export', messageId: 'editorMenu.export' })\n\n return (\n \n {list.map(({ id, messageId }) => (\n this.onClick(id)}\n >\n \n \n ))}\n \n );\n }\n}\n\nexport default connect(null, mapDispatch)(SettingsList);\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport SettingsList from \"./SettingsList\";\n\nimport Icon from \"./Icon\";\nimport w from \"./images/settings-white.png\";\nimport b from \"./images/settings-black.png\";\n\nconst Container = styled.div`\n width: 30px;\n height: 30px;\n`;\n\ntype Props = {\n doc_id: number;\n enableDarkTheme: boolean;\n canAdminister: boolean;\n};\ntype State = {\n show: boolean;\n};\nexport default class SettingsIcon extends React.Component {\n private timeout: ReturnType | null = null;\n private elmIcon: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n show: false,\n };\n\n this.elmIcon = React.createRef();\n }\n\n componentWillUnmount() {\n this.timeout && clearTimeout(this.timeout);\n }\n\n hide = () => {\n this.timeout = setTimeout(() => {\n this.setState({ show: false });\n }, 200);\n };\n\n onClick = () => this.setState({ show: !this.state.show });\n\n view() {\n const { doc_id, enableDarkTheme, canAdminister } = this.props;\n\n return (\n \n );\n }\n\n render() {\n const { enableDarkTheme } = this.props;\n\n return (\n \n {this.state.show && this.view()}\n \n \n );\n }\n}\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAARcSURBVHgB7Vw9axVBFE3UYBQDfkRj+dBE0ULTiZWNlkoahWBj0po/YaeoXUwfYkpBQcTyFRbaxxj8gAR9aCMGfEUEQc95YSAsOztz78zu2/cyBw7r25l77rl3P95k3WRgICF1IHUgdSB1IHUgdcC/A+OY+gX8JyRjGFsp9lSabTvZbWxOKfIyhrGVohsNOhtQ4ZmAWFVoNxoUcplMqKrssaBf8Cu9/5j5jO1rjKI6U6x2S43KUPUlFnJ5mabE0DBazm3VDYpxD4mh4WyMmZAaZDoRcTsIradgC1wAL4IuDGHCLLgBau89Jm4dGtOgz8GdxDx6/AYugvReOmaQwZg127fYxwYczMl+A/s+g2ZurO0aNKdy8tEDvdBTNhe9l4oRqH8Hs4nN502MzYMXwCPgEmjGytouI8dRkDmZmx5sueidNZSGB1C2Jc/ubwvmZmOlnyW5WEMpOA3VP6DUfN3mswbWEh0voFi3YrV+WEtUXIOa1kxd41hTFOyDygpY10K1vlgTawvGHBS0Juoex9qCwK/Pn2DdC9X6Y22s0Yq91pHtgYfYXHHMiTG8CpGX4GvwDciF5X7wOFgmDkD8EPhKk+QEgv6C2qPjituC9mNwArSBY5zDuS497ThrHAXF4KnXBrWJi+LeQbcB+qKBiYwp0tSO/YbuYVCFy4hqgdrkeXHPoDescMMYxuZpavexNtYYhDFEN0GtiZ1xPAs0zUFYB4yNdSY1ocXaooDrBd4LdhYr/TfvIw0wFA0IhN6TWEuUNVC2mJvYwWtW2hzOp6lY0B4semcNpeIc1D+A0iYVfVtJDVNLmp+e6b0S3EIWicH3JbiipsQDPYvh89gyT/Rk3s6CfbyxxoZUU+q541fbIK4+Jfghmew5V6op9dyxoW2QZw29P03bIK6wJVCd3o4EUk2p5056bYOkp/clR7GaYamm1LPGUycmfc0XtC4tFC3N4bL8EShZd2TnbiG+AYaiAQFqZfUln1lLtB81xiDWDDRkzHPtMgxqwVhqGL2QbRM6rC0I6XFHQfv4EGk3PDBjjaoHZqMI3PWPXAcLziAOzYN3HXNiDK9ChPcWs1bhIpDrnPNg2XiCBHPaJLv+v318Gsfuhnxb1DlWfebsbBzXCyt92CTWFG0tdLUPG8SaouI51Op8uUi8sZboSC9QebT0Pub4Hqm2YK6vpm2eJBdrKA0jUHa9xMl1BV+o5BJhGbQVFWv/EnLwhVHmZO5N0KZd+kucyD0wk2OAi7xZMO814CnsX8uJsRXhu59vgFwHszCvAef9UHsnO7mMz1x9L4JfwQVwEnSBTy6nwXXQtwG2eRvQ4MEYAl2gN3psgTzT6L3WuAd3tsJ991OjMmifSWsN8rIIRQwNbw9VN+iTtzP7xBgadvUujxxDft9LyTaPGn2NnvqVzKovMR75kEskJFZ11qUGOdrWjQZ9dHgqGg6JLdKt1dg43PTMn6aoVeeSmdSB1IHUgdSB1AFRB/4DsURSrjwOc/gAAAAASUVORK5CYII=\"","import React from \"react\";\nimport Icon from \"./Icon\";\nimport b from \"./images/back-black.png\";\nimport w from \"./images/back-white.png\";\n\nexport default function BackIcon({\n enableDarkTheme,\n onClick,\n}: {\n enableDarkTheme: boolean;\n onClick: () => void;\n}) {\n return (\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAEaSURBVGgF7ZlBCsIwEEUbceHSQ3oP683cexbBG9Q/0oFQojNCwJn4AyHVie2896tQnCYOGqABGqABGqCB/zWwLMsscygDKxSW1xgDDiiS1HbkhgNNC0ogb5iHlLelAXUkVBQDTCpKElYfTMoyFKXOpKIkYfXBpCxDUepZkirfCBMo7D83PnPHeyfMR6PW/a1SytU6qRvsA5R1je51gJl97zxXjQTl6Vf2uMC8J4u0zwWG5Gc0fYnUuNXL3tqgdYHDLSkvf/7joT11XeX7htka8lSc8wFSDQGAcCoj1crkUsVVNcvkKhmpDplcqriqZplcJSPVoZFczj8lNIE3cLPWU68buDGgNJEVbiwoheNKAzRAAzRAAzTgM/AEUnVF5mZWOUAAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADYAAAA2CAYAAACMRWrdAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAAENSURBVGgF7ZlBCsIwEEWrdOHSQ3qPztHcexbBG+gM9LdZhAQh2pnkD4QMkzSd/76UFqeJQQIkQAIkQAIkMDQBUfU2ugpRNe91WN5FiKqAKMxWCx2i3UNMOj+0fomqrCTqSlGOCNApR2YUW6FTRTyOFumUIzOKrdCpIh5HiyGcOn0JzEQtmWueWrvpeGXWflG6tzxU9LD0RfbIvJkuT6IMaDXO1R0DbBDVeOTPL713Ffdc3bFvkDVd9tKW/fvhsd24ZSJ6WEoPuX0Vh/2ABCCKA4loM52L5hj6pXMgEW2mc9EcQ790DiSizSXnwv4pARNy4qzWRYiqwMuy5V2FqBobDBIgARIgARIggVEJfAABdRlkowBBBAAAAABJRU5ErkJggg==\"","import React from \"react\";\nimport styled from \"styled-components\";\nimport { navigate } from \"../../../services\";\n\n// import MergeIcon from './MergeIcon'\nimport PagesIcon from \"./PagesIcon\";\nimport SettingsIcon from \"./SettingsIcon\";\nimport BackIcon from \"./BackIcon\";\n\nconst WIDTH = 200;\nconst Container = styled.div`\n position: fixed;\n left: 50%;\n bottom: 30px;\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n width: ${WIDTH}px;\n margin-left: ${-WIDTH / 2}px;\n\n & > svg,\n & > div {\n cursor: pointer;\n margin-left: 12px;\n }\n\n & > div:first-of-type {\n margin-right: 0;\n }\n\n & > svg:last-of-type {\n margin-left: 0;\n }\n`;\n\ntype Props = {\n enableDarkTheme: boolean;\n doc_id: number;\n page_id: number;\n canAdminister: boolean;\n};\n\nexport class Menu extends React.Component {\n onBackClick = () => navigate.to(\"/app/docs\");\n\n render() {\n // const { readOnly } = this.props\n\n return (\n \n {/*{!readOnly && }*/}\n \n \n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Container = styled.svg<{ top: number }>`\n cursor: pointer;\n position: absolute;\n top: ${(p) => p.top};\n`;\n\ntype Props = {\n enableDarkTheme?: boolean;\n top: number;\n width: string;\n height: string;\n onClick?: () => void;\n};\nexport default function Icon({\n enableDarkTheme,\n top,\n width,\n height,\n onClick,\n}: Props) {\n const fill = enableDarkTheme ? \"#fff\" : \"#000\";\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport Icon from \"./Icon\";\n\nconst Container = styled.div`\n position: fixed;\n left: 0;\n width: 23%;\n height: 100%;\n`;\n\nexport class Comments extends React.Component {\n render() {\n return (\n \n \n \n );\n }\n}\n","import React from 'react'\nimport styled from 'styled-components'\n\nconst Container = styled.div`\n position: fixed;\n right: 0;\n width: 23%;\n height: 100%;\n padding-bottom: 40px;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n align-items: center;\n`\n\nconst Audio = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 90%;\n height: 50px;\n margin-bottom: 20px;\n border: 1px solid #000;\n`\n\nconst Video = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 90%;\n height: 25%;\n border: 1px solid #000;\n`\n\nexport class Communicator extends React.Component {\n render() {\n return (\n \n \n \n \n )\n }\n}\n","import styled from \"styled-components\";\n\nconst Input = styled.input.attrs({\n type: \"text\",\n})<{\n enableDarkTheme?: boolean;\n textAlign: string;\n}>`\n pointer-events: all;\n outline: none;\n direction: ltr;\n text-align: ${(p) => p.textAlign};\n margin: 0 0 3px 0;\n border: 0;\n width: ${(p) => p.width}px;\n height: 30px;\n line-height: 30px;\n font-family: \"Source Code Pro\", monospace;\n border-bottom: 1px solid ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: transparent;\n font-size: 14px;\n\n &::placeholder {\n direction: rtl;\n font-family: urdu;\n font-weight: 500;\n color: ${(p) => (p.enableDarkTheme ? \"#333\" : \"#e6e6e6\")};\n }\n`;\n\ntype Props = {\n width: number | string;\n value: number;\n textAlign?: string;\n enableDarkTheme?: boolean;\n placeholder: string;\n onChange: (evt: React.ChangeEvent) => void;\n onKeyUp: (evt: React.KeyboardEvent) => void;\n attachRef?: React.RefObject;\n};\n\nexport default function TextField({\n width,\n value,\n textAlign,\n enableDarkTheme,\n placeholder,\n onChange,\n onKeyUp,\n attachRef,\n}: Props) {\n return (\n \n );\n}\n","import styled from 'styled-components'\n\nexport const Icon = styled.svg.attrs({\n width: 20,\n height: 20,\n viewBox: '0 0 20 20',\n version: '1.1',\n xmlns: 'http://www.w3.org/2000/svg'\n})`\n pointer-events: all;\n cursor: pointer;\n margin: 0 10px;\n`\n","import React from \"react\";\nimport { Icon } from \"./styles\";\nimport { IconProps } from \"./types\";\n\nexport default function LockIcon({ fill, onClick }: IconProps) {\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport { Icon } from \"./styles\";\nimport { IconProps } from \"./types\";\n\nexport default function UnLockIcon({ fill, onClick }: IconProps) {\n return (\n \n \n \n );\n}\n","import React from \"react\";\nimport { Icon } from \"./styles\";\nimport { IconProps } from \"./types\";\n\nexport default function ResetIcon({ fill, onClick }: IconProps) {\n return (\n \n \n \n \n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { EVT_MOUSEOVER, KEY_UP_ARROW, KEY_DOWN_ARROW } from \"../../../../lib\";\nimport { i18n } from \"../../../../services\";\nimport TextField from \"./TextField\";\nimport LockIcon from \"./LockIcon\";\nimport UnLockIcon from \"./UnLockIcon\";\nimport ResetIcon from \"./ResetIcon\";\nimport { ID_EDITOR_CONTENTS } from \"../../Contents/styles\";\nimport { saveEditorContents } from \"../../Contents/helpers\";\n\nconst Container = styled.div<{\n enableDarkTheme?: boolean;\n top: number;\n right: number;\n}>`\n pointer-events: none;\n z-index: 10;\n user-select: none;\n position: absolute;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n top: ${(p) => p.top + 5}px;\n right: ${(p) => p.right + 5}px;\n height: 33px;\n padding: 0 10px 0 0;\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n background-color: ${(p) => (p.enableDarkTheme ? \"#fff\" : \"#000\")};\n`;\nconst Label = styled.div<{ enableDarkTheme?: boolean }>`\n margin-left: 10px;\n font-family: urdu;\n font-weight: 500;\n color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n`;\n\ntype Props = {\n enableDarkTheme: boolean;\n};\ntype State = {\n locked: boolean;\n show: boolean;\n width: number | null;\n height: number | null;\n};\nexport class ResizeImage extends React.Component {\n private top: number = 0;\n private right: number = 0;\n private fieldWidth: React.RefObject;\n private elmContents: HTMLDivElement | null = null;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n locked: true,\n show: false,\n width: null,\n height: null,\n };\n\n this.fieldWidth = React.createRef();\n }\n\n componentDidMount() {\n this.elmContents = document.getElementById(\n ID_EDITOR_CONTENTS\n ) as HTMLDivElement;\n this.elmContents.addEventListener(EVT_MOUSEOVER, this.onMouseOver);\n }\n\n componentWillUnmount() {\n if (!this.elmContents) {\n return;\n }\n\n this.elmContents.removeEventListener(EVT_MOUSEOVER, this.onMouseOver);\n this.elmContents = null;\n }\n\n private target: HTMLImageElement | null = null;\n private size: {\n width: number | null;\n height: number | null;\n } = {\n width: null,\n height: null,\n };\n\n onMouseOver = (evt: MouseEvent) => {\n const t = evt.target;\n if (!t) {\n return;\n }\n\n const img = t as HTMLImageElement;\n if (img.nodeName.toLowerCase() !== \"img\") {\n this.target = null;\n this.size = {\n width: null,\n height: null,\n };\n this.setState({ show: false });\n return;\n }\n\n this.target = img;\n const r = img.getBoundingClientRect();\n this.top = r.top;\n this.right = window.innerWidth - r.right;\n\n this.size.width = Math.round(r.width);\n this.size.height = Math.round(r.height);\n\n this.setState(\n {\n show: true,\n width: Math.abs(r.right - r.left),\n height: Math.abs(r.top - r.bottom),\n },\n () => {\n // this.fieldWidth && this.fieldWidth.focus()\n }\n );\n };\n\n onKeyUpWidth = (evt: React.KeyboardEvent) => {\n const { width, height, locked } = this.state;\n if (!width) {\n return;\n }\n\n if (evt.key === KEY_UP_ARROW) {\n const percentChange = (width + 1) / width;\n this.setState(\n {\n width: width + 1,\n height: locked ? height! * percentChange : height,\n },\n () => this.refreshTarget()\n );\n } else if (evt.key === KEY_DOWN_ARROW) {\n const percentChange = (width - 1) / width;\n this.setState(\n {\n width: width - 1,\n height: locked ? height! * percentChange : height,\n },\n () => this.refreshTarget()\n );\n }\n };\n\n onKeyUpHeight = (evt: React.KeyboardEvent) => {\n const { width, height, locked } = this.state;\n\n if (!height) {\n return;\n }\n\n if (evt.key === KEY_UP_ARROW) {\n const percentChange = (height + 1) / height;\n this.setState(\n {\n height: height + 1,\n width: locked ? width! * percentChange : width,\n },\n this.refreshTarget\n );\n } else if (evt.key === KEY_DOWN_ARROW) {\n const percentChange = (height - 1) / height;\n this.setState(\n {\n height: height - 1,\n width: locked ? width! * percentChange : width,\n },\n this.refreshTarget\n );\n }\n };\n\n onChangeWidth = (evt: React.ChangeEvent) => {\n if (!this.size.width || !this.size.height) {\n return;\n }\n\n const nextWidth = Number.parseInt(evt.target.value);\n\n if (!Number.isNaN(nextWidth) && nextWidth > 0) {\n const percentChange = nextWidth / this.size.width;\n const nextHeight = percentChange * this.size.height;\n this.setState(\n {\n width: nextWidth,\n height: nextHeight,\n },\n this.refreshTarget\n );\n }\n };\n\n onChangeHeight = (evt: React.ChangeEvent) => {\n if (!this.size.width || !this.size.height) {\n return;\n }\n\n const nextHeight = Number.parseInt(evt.target.value);\n\n if (!Number.isNaN(nextHeight) && nextHeight > 0) {\n const percentChange = nextHeight / this.size.height;\n const nextWidth = percentChange * this.size.width;\n this.setState(\n {\n width: nextWidth,\n height: nextHeight,\n },\n this.refreshTarget\n );\n }\n };\n\n refreshTarget = () => {\n if (this.target) {\n const { width, height } = this.state;\n if (!width || !height) {\n return;\n }\n\n if (width >= 20 && height >= 20) {\n this.target.width = width;\n this.target.height = height;\n saveEditorContents();\n }\n }\n };\n\n onToggleLock = () => this.setState({ locked: !this.state.locked });\n\n onReset = () => {\n if (!this.target) {\n return;\n }\n\n this.target.removeAttribute(\"width\");\n this.target.removeAttribute(\"height\");\n saveEditorContents();\n };\n\n render() {\n const { show, locked } = this.state;\n if (!show) {\n return null;\n }\n\n const { enableDarkTheme } = this.props;\n const fill = enableDarkTheme ? \"#000\" : \"#fff\";\n\n return (\n \n \n \n\n {locked ? (\n \n ) : (\n \n )}\n\n \n \n\n \n \n );\n }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport { Resize } from '../../models';\nimport { fixArabicText, getMetaValue, device, DocMeta } from '../../helpers';\n\nconst PHONE_WIDTH = 255;\n\nconst Container = styled.div`\n position: relative;\n margin: 0 14px 40px 14px;\n display: flex;\n flex-direction: column;\n cursor: pointer;\n\n &:hover {\n div {\n font-weight: 500;\n }\n }\n\n @media ${device.phone} {\n margin: 0 10px 30px 10px;\n }\n`;\n\nconst Preview = styled.div<{ width: number }>`\n overflow: hidden;\n display: flex;\n justify-content: center;\n align-items: center;\n margin-bottom: 12px;\n width: ${(p) => p.width}px;\n height: ${(p) => (334 * p.width) / 240}px;\n\n @media ${device.phone} {\n width: ${PHONE_WIDTH}px;\n height: ${(334 * PHONE_WIDTH) / 240}px;\n }\n`;\n\nconst Cover = styled.img`\n width: 100%;\n border-radius: 2px;\n`;\n\nconst Info = styled.div<{ width: number }>`\n display: flex;\n flex-direction: column;\n width: ${(p) => p.width}px;\n\n @media ${device.phone} {\n width: ${PHONE_WIDTH}px;\n }\n`;\n\nconst Name = styled.div<{ width: number }>`\n text-align: center;\n font-size: ${(p) => (p.width * 0.075).toFixed(2)}px;\n line-height: ${(p) => (p.width * 0.095).toFixed(2)}px;\n font-weight: 500;\n white-space: pre-wrap;\n\n [lang='ar'] {\n font-size: ${(p) => (p.width * 0.07).toFixed(2)}px;\n }\n\n @media ${device.phone} {\n font-size: ${(PHONE_WIDTH * 0.065).toFixed(2)}px;\n line-height: ${(PHONE_WIDTH * 0.08).toFixed(2)}px;\n\n [lang='ar'] {\n font-size: ${(PHONE_WIDTH * 0.07).toFixed(2)}px;\n }\n }\n`;\n\nconst Authors = styled.div<{ width: number }>`\n color: #5b5f65;\n text-align: center;\n font-weight: 500;\n margin-top: 3px;\n font-size: ${(p) => (p.width * 0.05).toFixed(2)}px;\n\n @media ${device.phone} {\n font-size: ${(PHONE_WIDTH * 0.05).toFixed(2)}px;\n }\n`;\n\ntype BookProps = {\n id: number;\n name: string;\n doc_meta: DocMeta[];\n width: number;\n children?: JSX.Element | JSX.Element[];\n onClick: () => void;\n};\n\nexport function Book({\n id,\n name,\n doc_meta,\n width,\n children,\n onClick,\n}: BookProps) {\n const cover = Resize.url('GET', `book/cover/${id}/220`);\n const authors = getMetaValue(doc_meta, 'authors');\n\n return (\n \n \n \n \n \n \n {authors}\n \n {children}\n \n );\n}\n\ntype EBookProps = {\n id: number;\n title: string;\n width: number;\n children?: JSX.Element | JSX.Element[];\n onClick: () => void;\n};\n\nexport function EBook({ id, title, width, children, onClick }: EBookProps) {\n const cover = Resize.url('GET', `ebook/cover/${id}/220`);\n\n return (\n \n \n \n \n \n \n \n {children}\n \n );\n}\n","import styled from \"styled-components\";\nimport { navigate } from \"../../services\";\nimport { logo } from \"../../images\";\n\nexport const Logo = styled.img.attrs({\n src: logo,\n onClick: () => () => navigate.to(\"/app/docs\"),\n})`\n user-select: none;\n cursor: pointer;\n position: fixed;\n left: 25px;\n bottom: 20px;\n width: 40px;\n`;\n","import { AxiosResponse } from \"axios\";\nimport React, { useEffect, useState } from \"react\";\nimport { Link, useLocation, useParams } from \"react-router-dom\";\nimport styled from \"styled-components\";\nimport { device, tagUrl } from \"../helpers\";\nimport { Tag } from \"../models\";\n\nconst Container = styled.div<{ marginTop: number }>`\n position: sticky;\n z-index: 1;\n padding: 10px;\n background-color: #fff;\n top: 100px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n margin-top: ${(p) => p.marginTop}px;\n padding-right: 5px;\n width: 100%;\n\n @media ${device.phone} {\n display: none;\n }\n`;\n\nconst List = styled.div`\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n`;\nconst Item = styled.div<{ active: boolean }>`\n user-select: none;\n margin-left: 24px;\n\n a {\n font-size: 16px;\n font-weight: 500;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n text-decoration: none;\n color: ${(p) => (p.active ? \"#000\" : \"#8e8e8e\")};\n\n span {\n font-weight: 500;\n }\n\n &:hover {\n color: #000;\n }\n }\n\n &:last-child {\n margin-left: 0;\n }\n`;\n\ntype Props = {\n marginTop?: number;\n};\n\ntype TagState = {\n id: number;\n name: string;\n};\n\nexport default function Tags({ marginTop }: Props) {\n const [tags, setTags] = useState([]);\n\n useEffect(() => {\n fetch();\n }, []);\n\n const fetch = async () => {\n try {\n const { data: tags }: AxiosResponse = await Tag.list();\n setTags(tags);\n } catch (e) {}\n };\n\n const { tag_id } = useParams<{ tag_id: string }>();\n const location = useLocation();\n const param_tag_id =\n location.pathname.startsWith(\"/t-\") && tag_id ? parseInt(tag_id) : -1;\n\n return (\n \n \n \n تازہ ترین\n \n {tags.map((t) => (\n \n {t.name}\n \n ))}\n \n \n );\n}\n","export default __webpack_public_path__ + \"static/media/not-found.5c8c2e34.png\";","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\nimport src from \"./not-found.png\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n position: fixed;\n top: 40%;\n width: 100%;\n text-align: center;\n font-size: 24px;\n font-weight: 500;\n font-family: urdu, QuranFont, Roboto, sans-serif;\n`;\nconst A = styled.a`\n display: block;\n margin-top: 40px;\n`;\nconst Img = styled.img`\n width: 266px;\n height: 92px;\n`;\n\nexport function NoResults({ message }: { message: string }) {\n return (\n \n \n\n \n \n \n \n );\n}\n","import styled from 'styled-components';\nimport { device } from '../../helpers';\nexport * from './NoResults';\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n`;\n\nconst List = styled.div<{ more: boolean }>`\n margin: ${(p) => (p.more ? '36px 0 0 0' : '36px 0')};\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n\n @media ${device.phone} {\n margin: ${(p) => (p.more ? '18px 0 0 0' : '18px 0')};\n }\n`;\n\nfunction showMore({\n enableMore,\n stats,\n}: {\n enableMore: boolean;\n stats: { offset: number; total: number };\n}) {\n if (!enableMore) {\n return false;\n }\n\n const { offset, total } = stats;\n if (offset < total) {\n return true;\n }\n\n return false;\n}\n\ntype Props = {\n children: JSX.Element | JSX.Element[];\n stats: { offset: number; total: number };\n onMore: () => void;\n enableMore?: boolean;\n};\nexport function Results({ children, stats, onMore, enableMore = true }: Props) {\n return (\n \n {children}\n \n );\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABQCAYAAABf9vbdAAAABGdBTUEAALGPC/xhBQAAA8pJREFUaAXtmztoFkEQx6MRRQVRFCGCEAtBC0UlIKgEFI02YpQ0QoypFB/plCSk9AGWPkJKI2inoJUKFhpBGwVBUwhJIVhIBEkwvvD5G3DhQ5KdvctwcwcODHvc7M38//vt7e7s7Vdfp0s/VZagL/Wq5atxAUi/0e/ovvLBiyPqwyzgg37lemf8kfJYu2qABwJSTqJbygNzaiSd3P6F1gKvvR7HtgEtpbSB6gdaC3iq6zHqrCkbgz0A+pYAPhB6S91GtBTSDIrPaACXWo7wTIM3gyYATOQAH0i+4tmlniQezgB8IPEMH4u8SEgXkK4QwOQth/Ax34tEI4HlpcwLPjx3Fx9zUReRYVGGxwAmb3kTH/UuDAi6EZWJKi/48NwgPmahLrKVqJ/QACZvedkF/d+gLZRZJrXpSJ73JLGf4CnLiunAh/vdniQ6CB5b2AWQWnnMk8QJgmsANbs0QrsniV4DEpLVtXqSCOml1toxu2R1uzxJDBA8BjDFJkO0DNUuMpuo19EUoLE6MlnKpOkic4h6G40BTLG9x8daFwYEnYc+QFOAxurIAnIV6iILifoEjQFMsY3iY4ULA4IuRl+gKUBjdYbxsQx1keVEfY3GAKbYXLO6lRB4Y0DiMT4WoC6ymqjv0JTWjtW5hw+3rG4dwT8YkLiFD7esbjPBPxqQuIYPt6xuO8G/GJC4gg832UtkWYHG+nuKzTWrOwiBnwYkevDhJkeInNLSWp3jbgwIfMqAhGR1hzxJnDEgIZsMstngJheJrHUVzS7bPS1eDGRcv2pAQrK6bUJCMqz/kqEFLlFX6yKaXbrQ7gwxzaqeNQAvL/EBM0QZHJ02AC/DaEeGmGZVjxqAl24lO4SFi9VSordw5AS0Wsyd8wC/g6CVXU5XOqFZT8tXNqW0Surv0wiFJ/WV3lax2th6TssXflyh0luLsrn7FNUWX5p9FB+Fb+5WentdPnDcMWh5lw8ckgDdMAA/jo9NaOEyQEStT2t2t498Fp9ZJZtyScj7DFrebUvkpAF4t02pw4CX4Fq/1uwu24KSPMvProHT7N34KFzkRZMXTgOn2V2yKTnHIEOdBk6zuxw5k/MLMslo4DT7ID4K/zwkxy5letfAaXaXY5eNAJdzCxo4ze7yibQB4CMG4Ifw4fKR+pEBeNdjAk0QmJgBiWGedT1+T/y6ZjTPHyAkm5IuWAqp9F9QQgu2cZGyfBijngy7pZROUMUWcDLRyYRXaukC3VRj/iT3S/9HuNCy/yYx7odWA7AsZUgj5dBGa5YHy1S3HzDtZQJUi+UPE9jR6ucE0aIAAAAASUVORK5CYII=\"","import React from \"react\";\nimport styled from \"styled-components\";\nimport { device } from \"../../helpers/style\";\nimport { navigate } from \"../../services\";\nimport { DocMeta, docUrl, fixArabicText, getMetaValue } from \"../../helpers\";\nimport { Resize, Featured } from \"../../models\";\nimport prevImg from \"./prev.png\";\nimport nextImg from \"./next.png\";\nimport { AxiosResponse } from \"axios\";\n\nconst List = styled.div`\n position: relative;\n box-sizing: border-box;\n\n margin: 50px auto 50px auto;\n width: 88%;\n\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: flex-start;\n text-align: center;\n\n @media ${device.phone} {\n display: none;\n }\n`;\n\nconst Slide = styled.div<{\n zIndex: number;\n scaleX: number;\n scaleY: number;\n}>`\n z-index: ${(p) => p.zIndex};\n transform-style: preserve-3d;\n transform: scale(${(p) => p.scaleX}, ${(p) => p.scaleY});\n`;\nexport const Image = styled.img`\n cursor: pointer;\n width: 100%;\n border-radius: 4px;\n`;\nconst Name = styled.div`\n font-size: 16px;\n font-weight: 500;\n`;\nconst Authors = styled.div`\n font-size: 12px;\n font-weight: 500;\n`;\n\nconst Nav = styled.img`\n cursor: pointer;\n position: absolute;\n z-index: 10;\n top: 40%;\n width: 24px;\n height: 40px;\n`;\nconst Prev = styled(Nav)`\n right: -40px;\n`;\nconst Next = styled(Nav)`\n left: -40px;\n`;\n\n// function rotateY(index: number) {\n// if (index === 1 || index === 2) {\n// return -2;\n// } else if (index === 4 || index === 5) {\n// return 2;\n// }\n\n// return 0;\n// }\n\nfunction zIndex(index: number) {\n if (index === 1 || index === 5) {\n return 1;\n } else if (index === 2 || index === 4) {\n return 2;\n }\n\n return 3;\n}\n\nfunction scaleX(index: number) {\n if (index === 3) {\n return 1.15;\n }\n\n return 0.9;\n}\n\nfunction scaleY(index: number) {\n if (index === 3) {\n return 1.1;\n }\n\n return 0.9;\n}\n\nexport type ItemProps = {\n id: number;\n name: string;\n updated_at: string;\n doc_meta: DocMeta[];\n};\nfunction Item({ item, index }: { item: ItemProps; index: number }) {\n const { name, doc_meta } = item;\n const src = Resize.url(\"GET\", `book/cover/${item.id}/440`);\n\n return (\n navigate.to(docUrl(item))}\n >\n \n \n {getMetaValue(doc_meta, \"authors\")}\n \n );\n}\n\nconst MAX_ITEMS = 5;\nconst ANIM_DELAY = 10 * 1000;\n\ntype Props = {\n show: boolean;\n onFetch: (ids: number[]) => void;\n};\ntype State = {\n offset: number;\n list: ItemProps[];\n stats: {\n offset: number;\n total: number;\n };\n};\n\nexport default class Slider extends React.Component {\n private intervalId: ReturnType | null = null;\n private loading = false;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n offset: 0,\n list: [],\n stats: {\n offset: 0,\n total: 0,\n },\n };\n }\n\n async componentDidMount() {\n this.startAnim();\n await this.fetch();\n }\n\n componentWillUnmount() {\n this.stopAnim();\n }\n\n async fetch() {\n if (this.loading) {\n return;\n }\n\n this.loading = true;\n\n try {\n const params = [\n \"includeMeta=true\",\n \"includesPages=false\",\n \"offset=0\",\n ];\n\n const {\n data: { list, stats },\n }: AxiosResponse<\n Pick\n > = await Featured.fetch(\"books\", {\n url: params.join(\"&\"),\n });\n this.setState({\n stats,\n list,\n });\n\n this.props.onFetch(list.map((i) => i.id));\n this.loading = false;\n } catch (e) {\n console.warn(e);\n }\n }\n\n started = false;\n startAnim = () => {\n if (this.started) {\n return;\n }\n\n this.started = true;\n this.intervalId = setInterval(this.next, ANIM_DELAY);\n };\n\n stopAnim() {\n this.started = false;\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n }\n\n next = () => {\n const total = this.state.list.length;\n let { offset } = this.state;\n offset += 1;\n\n if (offset >= total) {\n this.setState({ offset: 0 });\n } else {\n this.setState({ offset });\n }\n };\n\n list = () => {\n let { list, offset } = this.state;\n const total = list.length;\n\n if (offset + MAX_ITEMS < total) {\n return list.slice(offset, offset + MAX_ITEMS);\n }\n\n let l = list.slice(offset);\n l = l.concat(list.slice(0, MAX_ITEMS - l.length));\n return l.concat(list.slice(0, MAX_ITEMS - l.length));\n };\n\n onPrev = () => {\n this.stopAnim();\n const { offset } = this.state;\n\n if (offset - 1 >= 0) {\n this.setState({ offset: offset - 1 }, () => {\n setTimeout(this.startAnim, ANIM_DELAY);\n });\n }\n };\n\n onNext = () => {\n this.stopAnim();\n const total = this.state.list.length;\n const { offset } = this.state;\n\n if (offset + 1 < total) {\n this.setState({ offset: offset + 1 }, () => {\n setTimeout(this.startAnim, ANIM_DELAY);\n });\n }\n };\n\n render() {\n if (!this.props.show) {\n return null;\n }\n\n return (\n \n \n \n\n {this.list().map((item, index) => (\n \n ))}\n \n );\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABQCAYAAABf9vbdAAAABGdBTUEAALGPC/xhBQAAA/VJREFUaAXVW01sTkEULUX8hfpLkCZoE0oXlG4QOxU7lVjWojuthF1ZiJWysSoWbD4VYlM2FmpjUWlCQppIsPDTRGiimiBB/KWck/QmMmn1zbi5d95NTuabfjP3njPfe/PmzrxWV+Vn1aB0FfgKvMiP3r8ZzcDXFeA3QAG7gFJZD9iSvOATPjeXRUH3X8RFAMsxoDF3EV1TkBchI/i+PlcRh6YhLyKG0a42NxFtIDReUACFPANWAFlYK1j8BGSEi5ZD6FPjrWA3CHxLIC8iB9F3gZeInQj8+T/Ii4hODwFNCPpRgXwFPvjQM7UGRBsFZARTyz744HLD1NYi2hsglbT0uw0fcwBTW4VoLwEhkVoOwMc8U+YItgx4AqSSln4P4WMRYGoMyMBCIrXkACw3ZY5g/Kn5k6eSln6v4GM1YGq8yfoBIZFavoWPOlPmCMbpjdNcKmnp9x4+NgGmxgfLZUBIpJZMYrYB5nYOEVNJSz+3NPK0Avnv8LHXfNgR8JgC+V/wccCDfIcCeSY07R7kDyJoTDYl13lYHvEgvx9B+bOHZGLrJzzItyAob7hYsmH7sx7kmU19USB/0YP8VgTVyKauw89MawEbEZCP9/AyiK3fgo9Z1uTXIaBGNnUXfuZak+dSViObug8/C63JM4nQyKYew88Sa/LMph4Bsdd42P45fKy0Jj8fAe8pkH8NH2usyTObuqNA/h18rLcmz2zqhgL5D/Cx2Zo8s6leBfLc89xuTZ7xzgPhDRhb524zd53N7QwixpIN23Off585cwTkmoRkSm8XoCAc1di62yXE0edNfEVBhNtNTBGcRm8qiOA0ugVwMc0H2QYXBQha6qWEDNpifCjtYk5EcDn9FIidjcL2XE4vFafWJRMa7tGHpGLrD+DDPKGRwWJKyb36WNJhe5eUUkRoJvWzxal1WeptFRksrY2tS+LQo9yDoKXdWpQB09rcPSkOPUqt7fWjHuQlZic+hNNlbH0cPtrFoUd5XEGE2xGTDFi3gogf8OFyyCciNDYG3I5ZKYJZXS8Qew+E7d0OuilCa3NsDL7MXzWgABqzun4gHNnYOheQdYCLMasbAGJJh+25lOeS3sW0XnhiUsXkysW0XjljessBcTFeAhrHVDyz4KXpYszqNA4KOTlwknCxBkQdBcIbNbbeBx+crl2sCVE1Dssr8MMHp4vtQFSN1xUOu7CfCNqCkrvZsZePtB9EX7fX7yc0VLXiAw9GhFTRcgh9asSJd9kGAkxoipLP6l9QZPA6CgoYRrta6ZRb2TWNiBF8X58b6ZDPqSlEcGndGDbOtd4TiGBy05wr2cl48eFUAXhTu6aXk5Er+jcuE64BhRL8P9g10+BmWeZKAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport { Content } from \"../../pages/Template\";\nimport { Book, Results } from \"../../components\";\nimport { Books } from \"../../models\";\nimport { navigate } from \"../../services\";\nimport { docUrl, setWindowTitle } from \"../../helpers\";\nimport Tags from \"../../components/Tags\";\nimport Slider, { ItemProps } from \"./Slider\";\nimport { AxiosResponse } from \"axios\";\n\ntype Props = {};\ntype State = {\n list: ItemProps[];\n sliderIds: number[];\n stats: {\n offset: number;\n total: number;\n };\n};\n\nexport class FeaturedPage extends React.Component {\n static paths = [\"/app/\"];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n list: [],\n sliderIds: [],\n stats: {\n offset: 0,\n total: 0,\n },\n };\n }\n\n async componentDidMount() {\n setWindowTitle(\"اّردو کتب کا مرکز\");\n await this.fetch();\n }\n\n loading = false;\n async fetch(concat = false) {\n if (this.loading) {\n return;\n }\n\n this.loading = true;\n\n try {\n const params = [\n \"includeMeta=true\",\n \"includesPages=true\",\n `offset=${concat ? this.state.stats.offset : 0}`,\n ];\n\n const {\n data: { list, stats },\n }: AxiosResponse<{\n list: ItemProps[];\n stats: {\n offset: number;\n total: number;\n };\n }> = await Books.list({\n url: params.join(\"&\"),\n });\n this.setState({\n stats,\n list: concat ? this.state.list.concat(list) : list,\n });\n this.loading = false;\n } catch (e) {\n console.warn(e);\n }\n }\n\n onMore = async () => {\n await this.fetch(true);\n };\n\n onSliderFetch = (sliderIds: number[]) => this.setState({ sliderIds });\n\n render() {\n const { list, sliderIds, stats } = this.state;\n if (list.length === 0) {\n return null;\n }\n\n const showSlider = window.innerWidth > 600;\n // @ts-ignore\n const filtered = list.filter((i) => !sliderIds.includes(i.id));\n return (\n \n \n\n \n\n \n {filtered.map((item) => (\n navigate.to(docUrl(item))}\n />\n ))}\n \n \n );\n }\n}\n","import { AxiosResponse } from 'axios';\nimport { connect } from 'react-redux';\nimport { Book, EBook, Results } from '../../components';\nimport { NoResults } from '../../components/Results';\nimport { docUrl, ebookUrl } from '../../helpers';\nimport { Books } from '../../models';\nimport { Content } from '../../pages/Template';\nimport { setSearch } from '../../reducers/search/actions';\nimport { navigate } from '../../services';\nimport { AppState } from '../../store';\nimport { ItemProps } from '../FeaturedPage/Slider';\nimport React from 'react';\n\nconst mapStateToProps = ({ search }: AppState) => ({\n // @ts-ignore\n search: search.get('text') as string,\n});\nconst mapDispatch = {\n setSearch,\n};\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n match: {\n params: {\n search: string;\n };\n };\n};\ntype Props = OwnProps & StateProps & DispatchProps;\n\ntype Ebook = {\n id: number;\n title: string;\n total_pages: number;\n};\n\ntype State = {\n list: ItemProps[];\n ebooks: Ebook[];\n stats: {\n offset: number;\n total: number;\n };\n};\n\nclass SearchPage extends React.Component {\n static paths = ['/app/s/:search'];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n list: [],\n ebooks: [],\n stats: {\n offset: 0,\n total: 0,\n },\n };\n }\n\n async componentDidMount() {\n await this.fetch(this.props.search);\n this.props.setSearch(this.props.match.params.search);\n }\n\n async componentDidUpdate(\n prevProps: Readonly,\n prevState: Readonly,\n snapshot?: any\n ) {\n await this.fetch(this.props.search);\n }\n\n private loading = false;\n fetch = async (search: string) => {\n if (this.loading) {\n return;\n }\n this.loading = true;\n\n if (!search) {\n search = '';\n this.loading = false;\n return;\n }\n\n try {\n const params = [\n 'includeMeta=true',\n 'includesPages=true',\n `search=${search}`,\n `offset=0`,\n ];\n\n const {\n data: { search: searchQuery, list, ebooks, stats },\n }: AxiosResponse<{\n search: string;\n list: ItemProps[];\n ebooks: Ebook[];\n stats: {\n offset: number;\n total: number;\n };\n }> = await Books.list({\n url: params.join('&'),\n });\n console.log(\n 'this.props.search',\n this.props.search,\n 'searchQuery',\n searchQuery\n );\n this.setState({\n stats,\n ebooks,\n list,\n });\n this.loading = false;\n } catch (e) {\n console.warn(e);\n }\n };\n\n onMore = async () => {\n await this.fetch(this.props.search);\n };\n\n render() {\n const { list, ebooks, stats } = this.state;\n if (list.length === 0 && ebooks.length === 0) {\n return ;\n }\n\n return (\n \n \n <>\n {list.map((item) => (\n navigate.to(docUrl(item))}\n />\n ))}\n {ebooks.map((item) => (\n \n (window.location.href = ebookUrl(item))\n }\n />\n ))}\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(SearchPage);\n","import React from \"react\";\nimport { Content } from \"../pages/Template\";\nimport styled from \"styled-components\";\nimport { device } from \"../helpers/style\";\n\nconst Container = styled.div`\n margin: 30px auto 0 auto;\n padding: 0 20px;\n width: 500px;\n color: #000;\n text-align: center;\n\n @media ${device.phone} {\n width: 100%;\n }\n`;\n\nconst Heading = styled.div`\n margin-bottom: 30px;\n font-size: 24px;\n`;\nconst Text = styled.div`\n margin-bottom: 30px;\n line-height: 24px;\n font-size: 18px;\n\n span {\n margin: 0 10px;\n }\n`;\n\nexport class CopyrightsPage extends React.Component {\n static paths = [\"/app/copyrights\"];\n\n render() {\n return (\n \n \n کاپی رائٹ\n \n اشاعت کے تمام حقوق\n urdupub.com\n کے ذریعہ محفوظ ہیں. مناسب رضامندی کے بغیر دوبارہ اشاعت\n کرنے کی اجازت نہیں ہے.\n \n \n All rights of the publication are reserved by\n UrduPub.com. Reproduction without proper consent is not\n allowed.\n \n \n \n );\n }\n}\n","import React from \"react\";\nimport { Content } from \"../pages/Template\";\nimport styled from \"styled-components\";\nimport { device } from \"../helpers/style\";\n\nconst Container = styled.div`\n margin: 40px auto 0 auto;\n padding: 0 20px;\n width: 500px;\n color: #000;\n\n @media ${device.phone} {\n width: 100%;\n }\n`;\n\nconst Heading = styled.div`\n margin-bottom: 30px;\n font-size: 24px;\n`;\nconst List = styled.ol`\n font-size: 16px;\n padding-right: 15px;\n`;\nconst Item = styled.li`\n font-size: 18px;\n margin-bottom: 20px;\n\n [lang=\"ar\"] {\n margin: 0 5px;\n font-size: 16px;\n }\n`;\n\nexport class TermsPage extends React.Component {\n static paths = [\"/app/terms\"];\n\n render() {\n return (\n \n \n اصول\n \n \n قرآن پاک کے بارے میں کسی قسم کا مزاق قابل قبول\n نہیں۔\n \n \n محمد رسول اللہ\n \n کی ختم نبوت پر سوال یا اُن کے متعلق کچھ بھی گستاخانہ\n ہرگز قابل قبول نہیں۔\n \n \n تمام انبیا و رسول جن کی تعظیم کا حکم ہمیں رسول\n \n نے سکھایا ہے اُن کے متعلق کسی قسم کی تضحیک قابل قبول\n نہیں۔\n \n \n اسلام اور پاکستان کے خلاف کسی قسم کی بات قابل برداشت\n نہیں۔\n \n \n صرف اُردو رسم الخط میں تحریر کی اشاعت کی جائے گی۔\n \n \n کسی دوسرے سے تحریر چوری کر کے اپنے نام سے شائع مت\n کرنا۔\n \n \n فحش مواد یا جس سے کسی قسم کا فساد پھیلے وہ قابل قبول\n نہیں۔\n \n \n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Content, Container } from \"../../pages/Template\";\nimport { getURLParam, Tabs } from \"../../lib\";\nimport { setWindowTitle, device, isMobile } from \"../../helpers\";\nimport {\n LoginForm,\n RegisterForm,\n ResetPasswordForm,\n} from \"../../components/Forms\";\n\nconst LOGIN_TAB = \"loginForm\";\nconst REGISTER_TAB = \"registerForm\";\nconst RESET_PASSWORD_TAB = \"resetPasswordForm\";\n\nconst TabContainer = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n margin: 40px auto 0 auto;\n width: 60%;\n\n @media ${device.phone} {\n margin: 20px auto 0 auto;\n width: 90%;\n } ;\n`;\n\ntype Tab = \"loginForm\" | \"registerForm\" | \"resetPasswordForm\";\nfunction getActiveTab() {\n const tab = getURLParam(\"tab\");\n\n if (tab === \"register\") {\n return \"registerForm\";\n } else if (tab === \"login\") {\n return \"loginForm\";\n }\n\n return \"loginForm\";\n}\n\ntype Props = {\n location: {\n state: any;\n };\n};\ntype State = {\n activeTab: Tab;\n};\n\nexport class LoginPage extends React.Component {\n static paths = [\"/app/login\"];\n private titles = [LOGIN_TAB, REGISTER_TAB, RESET_PASSWORD_TAB];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n activeTab: getActiveTab(),\n };\n }\n\n onTabSelect = (activeTab: string) =>\n this.setState({ activeTab: activeTab as Tab });\n\n componentDidMount() {\n setWindowTitle(\"لاگن\");\n }\n\n render() {\n const { activeTab } = this.state;\n\n return (\n \n \n \n {\n \n {activeTab === LOGIN_TAB && }\n\n {activeTab === REGISTER_TAB && (\n \n )}\n\n {activeTab === RESET_PASSWORD_TAB && (\n \n )}\n \n }\n \n \n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { Progress } from \"../lib\";\nimport { Content } from \"../pages/Template\";\nimport { logoutUser } from \"../reducers/user/actions\";\n\nconst Wrapper = styled.div`\n text-align: center;\n margin: 70px auto 0 auto;\n`;\n\ntype Props = DispatchProps;\nclass LogoutPage extends React.Component {\n static paths = [\"/app/logout\"];\n static requiresAuth = true;\n\n componentDidMount() {\n this.props.logoutUser(null);\n }\n\n render() {\n return (\n \n \n \n \n \n );\n }\n}\n\nconst mapDispatch = { logoutUser };\ntype DispatchProps = typeof mapDispatch;\nexport default connect(null, mapDispatch)(LogoutPage);\n","import React from \"react\";\nimport EditProfileForm from \"../components/Forms/EditProfileForm\";\nimport { Content, Container } from \"../pages/Template\";\nimport { setWindowTitle } from \"../helpers\";\nimport LogoutLink from \"./Template/LogoutLink\";\n\nexport class EditProfilePage extends React.Component {\n static paths = [\"/app/profile\"];\n static requiresAuth = true;\n\n componentDidMount() {\n setWindowTitle(\"اکاؤنٹ\");\n }\n\n render() {\n return (\n \n \n \n \n \n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { i18n } from \"../../services\";\nimport { Doc } from \"../../models\";\nimport { Menu, Toolbar, ResizeImage } from \"../../components/Editor\";\nimport Name from \"../../components/Editor/Name\";\nimport Contents from \"../../components/Editor/Contents\";\n\nimport { fetchDoc } from \"../../reducers/docs/actions\";\nimport { fetchPage, fetchPages } from \"../../reducers/pages/actions\";\nimport { fetchDocUser } from \"../../reducers/doc_users/actions\";\n\nimport { AutoComplete } from \"../../lib\";\nimport { setWindowTitle } from \"../../helpers\";\nimport { UD_EDITOR, UD_AUTHOR, UD_READER } from \"../../settings\";\nimport { AppState } from \"../../store\";\n\nconst Container = styled.div<{ enableDarkTheme: boolean }>`\n position: relative;\n left: 0;\n top: 0;\n width: 100vw;\n height: 100vh;\n overflow: hidden;\n background-color: ${(p) => (p.enableDarkTheme ? \"#000\" : \"#fff\")};\n`;\n\nconst mapStateToProps = function (\n { user, docs, doc_users, pages, settings }: AppState,\n {\n match: {\n params: { doc_id, page_id },\n },\n }: {\n match: { params: { doc_id: string; page_id: string } };\n }\n) {\n // @ts-ignore\n const user_id = user.get(\"id\");\n const param_doc_id = parseInt(doc_id);\n const param_page_id = parseInt(page_id);\n\n return {\n doc_id: param_doc_id,\n page_id: param_page_id,\n user_id,\n settings,\n pages,\n // @ts-ignore\n doc: docs.get(param_doc_id) as Map,\n // @ts-ignore\n page: pages.get(param_page_id) as Map,\n // @ts-ignore\n doc_user: doc_users.get(`${param_doc_id}-${user_id}`) as Map<\n string,\n any\n >,\n };\n};\nconst mapDispatch = {\n fetchDoc,\n fetchPage,\n fetchPages,\n fetchDocUser,\n};\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps & DispatchProps;\ntype State = {};\n\nclass EditorPage extends React.Component {\n static paths = [\"/app/e/:doc_id/:page_id\"];\n static requiresAuth = true;\n\n componentDidMount() {\n this.fetch();\n setWindowTitle(\"اُردو اِیڈیٹر\");\n }\n\n componentWillReceiveProps(newProps: Props, _newState: State) {\n newProps.doc && setWindowTitle(newProps.doc.get(\"name\"));\n }\n\n componentWillUnmount() {\n setWindowTitle(i18n.get(\"site.title\"));\n }\n\n fetch() {\n const { user_id } = this.props;\n const { doc_id, page_id } = this.props;\n if (!this.props.doc) {\n this.props.fetchDoc(doc_id);\n }\n\n this.props.fetchDocUser({ doc_id, user_id });\n this.props.fetchPage({ doc_id, page_id });\n\n setTimeout(() => {\n this.props.fetchPages({ doc_id });\n Doc.save(null, `${doc_id}/accessed`);\n }, 2000);\n }\n\n render() {\n const { doc_id, page_id, page, doc_user, settings } = this.props;\n // @ts-ignore\n const enableDarkTheme = settings.get(\"enableDarkTheme\") as boolean;\n const status = doc_user && (doc_user.get(\"status\") as string);\n const props = {\n doc_id,\n page_id,\n enableDarkTheme,\n readOnly: status === UD_READER,\n parent_id: (page && page.get(\"parent_id\")) || 0,\n canAdminister: [UD_EDITOR, UD_AUTHOR].includes(status),\n };\n\n return (\n \n \n \n {/**/}\n {/**/}\n \n \n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(EditorPage);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { i18n, navigate, notification } from \"../../services\";\nimport { AppState } from \"../../store\";\nimport {\n Notification,\n Select,\n Switch,\n ButtonActionGroup,\n Button,\n BTN_SMALL,\n TYPE_SECONDARY,\n TYPE_SUCCESS,\n} from \"../../lib\";\nimport { ComparePage } from \"../../pages/CreateMergePage\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n`;\n\nconst Heading = styled.h2`\n font-size: 30px;\n margin: 20px auto 20px auto;\n`;\n\nconst Description = styled.div`\n font-size: 16px;\n`;\n\nconst NoChanges = styled.div`\n width: 50%;\n margin-top: 40px;\n text-align: center;\n font-size: 18px;\n padding: 15px 15px;\n border: 1px solid #ebcccc;\n color: #a94442;\n background-color: #f2dede;\n`;\n\nconst AlreadyUpToDate = styled.div`\n margin: 10px 0 0 0;\n height: 60px;\n line-height: 50px;\n padding: 5px;\n text-align: center;\n color: #000;\n background-color: #bcdff1;\n`;\n\nconst Fields = styled.div`\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: 100%;\n justify-content: space-between;\n`;\nconst FieldContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 49%;\n`;\n\nconst FieldTitle = styled.div`\n font-size: 18px;\n font-family: urdu;\n font-weight: 500;\n`;\n\nconst SwitchContainer = styled.div`\n cursor: pointer;\n position: absolute;\n right: -80px;\n bottom: 0px;\n`;\n\nconst mapState = (state: AppState) => ({ user: state.user });\nconst mapDispatch = {};\n\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n page_contents_id: number;\n onCompare: (a: number, b: number) => void;\n onCompareClear: () => void;\n onConfirm: (src_page_id: number, src: number, dst: number) => void;\n pages: ComparePage[];\n};\n\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n srcAll: boolean;\n src: number;\n dst: number;\n};\n\nclass Header extends React.Component {\n constructor(props: Props) {\n super(props);\n\n this.state = {\n srcAll: false,\n src: props.page_contents_id || -1,\n dst: -1,\n };\n }\n\n onChangeSrc = (_name: string, value: string) => {\n notification.clear();\n\n this.setState({ src: parseInt(value), dst: -1 });\n this.props.onCompareClear();\n };\n\n onChangeDst = (_name: string, value: string) => {\n notification.clear();\n\n this.setState({ dst: parseInt(value) }, () => {\n this.props.onCompare(this.state.src, this.state.dst);\n });\n };\n\n src() {\n const { srcAll } = this.state;\n const { user, pages } = this.props;\n const values = [-1];\n const labels = [i18n.get(\"form.selectEmptyLabel\")];\n\n let status;\n for (const p of pages) {\n // @ts-ignore\n if (srcAll || p.user_id === user.get(\"id\")) {\n values.push(p.page_contents_id);\n\n status = i18n.get(`userDocForm.status${p.user_status}`);\n labels.push(`${status} / ${p.user_name} / ${p.page_name}`);\n }\n }\n\n return (\n \n {i18n.get(\"merge.src\")}\n v.toString())}\n labels={labels}\n fullWidth={true}\n value={this.state.src.toString()}\n onChange={this.onChangeSrc}\n />\n \n );\n }\n\n dst() {\n const { src } = this.state;\n if (src <= 0) {\n return null;\n }\n\n const { pages } = this.props;\n const page_id = pages.filter((p) => p.page_contents_id === src)[0][\n \"page_id\"\n ];\n\n const values = [-1];\n const labels = [i18n.get(\"form.selectEmptyLabel\")];\n\n let status;\n let changes = false;\n for (const p of pages) {\n if (p.page_id === page_id && p.page_contents_id !== src) {\n values.push(p.page_contents_id);\n\n status = i18n.get(`userDocForm.status${p.user_status}`);\n labels.push(`${status} / ${p.user_name} / ${p.page_name}`);\n changes = true;\n }\n }\n\n return (\n \n {i18n.get(\"merge.dst\")}\n {!changes && (\n \n {i18n.get(\"merge.alreadyUpToDate\")}\n \n )}\n {changes && (\n v.toString())}\n labels={labels}\n fullWidth={true}\n value={this.state.dst.toString()}\n onChange={this.onChangeDst}\n />\n )}\n \n );\n }\n\n toggleAll = (_name: string, enabled: boolean) =>\n this.setState({ srcAll: enabled });\n\n allSwitch = () => (\n \n \n \n );\n\n fields() {\n if (this.props.pages.length === 0) {\n return null;\n }\n\n return (\n \n {this.allSwitch()}\n {this.src()}\n {this.dst()}\n \n );\n }\n\n onConfirm = () => {\n const { src, dst } = this.state;\n\n let src_page_id = -1;\n let dst_page_id = -1;\n for (let p of this.props.pages) {\n if (src === p.page_contents_id) {\n src_page_id = p.page_id;\n }\n\n if (dst === p.page_contents_id) {\n dst_page_id = p.page_id;\n }\n }\n\n if (\n src_page_id === dst_page_id &&\n src_page_id > 0 &&\n src > 0 &&\n dst > 0\n ) {\n this.props.onConfirm(src_page_id, src, dst);\n }\n };\n\n onReturnClick = () => navigate.back();\n\n buttons() {\n const { src, dst } = this.state;\n const bothValid = src > 0 && dst > 0;\n\n return (\n \n {bothValid && (\n \n )}\n\n \n \n );\n }\n\n noChanges() {\n if (this.props.pages.length === 0) {\n return {i18n.get(\"merge.noChanges\")};\n }\n\n return null;\n }\n\n render() {\n return (\n \n {i18n.get(\"merge.title\")}\n {i18n.get(\"merge.description\")}\n\n {this.buttons()}\n \n\n {this.fields()}\n {this.noChanges()}\n \n );\n }\n}\n\nexport default connect(mapState)(Header);\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { SplitButton } from \"../../lib\";\nimport { SplitButtonProps } from \"../../lib/form/SplitButton\";\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n margin: 50px 0;\n`;\n\nexport default function Mode({ selected, values, onChange }: SplitButtonProps) {\n return (\n \n \n \n );\n}\n","import { DiffDOM } from \"diff-dom\";\n\nexport const HIGHLIGHT_ADDED = \"diffDOM/highlightAdded\";\nexport const HIGHLIGHT_REMOVED = \"diffDOM/highlightRemoved\";\n\nexport function highlightChanges(\n src: string,\n dst: string,\n highlight = HIGHLIGHT_ADDED\n) {\n const srcDiv = document.createElement(\"div\");\n const dstDiv = document.createElement(\"div\");\n\n srcDiv.innerHTML = src;\n dstDiv.innerHTML = dst;\n\n const dd = new DiffDOM();\n const diff = dd.diff(srcDiv, dstDiv);\n dd.apply(dstDiv, diff);\n\n if (diff.length > 0) {\n for (const d of diff) {\n let target = dstDiv;\n for (const index of d.route) {\n // @ts-ignore\n target = target.childNodes[index];\n }\n\n const changed = document.createElement(\"span\");\n changed.appendChild(target.cloneNode());\n\n if (highlight === HIGHLIGHT_ADDED) {\n changed.className = \"__change-added\";\n } else if (highlight === HIGHLIGHT_REMOVED) {\n changed.className = \"__change-removed\";\n }\n\n // @ts-ignore\n target.parentNode.replaceChild(changed, target);\n }\n }\n\n return dstDiv.innerHTML;\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Container as ContentsContainer } from \"../Editor/Contents/styles\";\nimport {\n highlightChanges,\n HIGHLIGHT_ADDED,\n HIGHLIGHT_REMOVED,\n} from \"./helpers\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: 100%;\n margin-bottom: 100px;\n justify-content: space-between;\n border-top: 1px solid #ccc;\n`;\n\nconst Contents = styled(ContentsContainer)`\n position: unset;\n display: flex;\n flex-direction: column;\n width: 47%;\n padding: 50px 1.5% 50px 0;\n\n & > div:first-child {\n font-size: 16px;\n }\n`;\n\nconst Divider = styled.div`\n position: relative;\n border-left: 1px solid #ccc;\n`;\n\ntype Props = {\n src: string;\n dst: string;\n};\ntype State = {};\n\nexport default class SplitView extends React.Component {\n srcMarkup() {\n const { src, dst } = this.props;\n const code = highlightChanges(dst, src, HIGHLIGHT_ADDED);\n\n return {\n __html: code,\n };\n }\n\n dstMarkup() {\n const { src, dst } = this.props;\n const code = highlightChanges(src, dst, HIGHLIGHT_REMOVED);\n\n return {\n __html: code,\n };\n }\n\n render() {\n return (\n \n \n
\n \n\n \n\n \n
\n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Container as ContentsContainer } from \"../Editor/Contents/styles\";\nimport { highlightChanges, HIGHLIGHT_ADDED } from \"./helpers\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: 100%;\n margin-bottom: 100px;\n justify-content: center;\n border-top: 1px solid #ccc;\n`;\n\nconst Contents = styled(ContentsContainer)`\n position: unset;\n width: 80%;\n padding: 50px 0;\n\n & > div:first-child {\n font-size: 16px;\n }\n`;\n\ntype Props = {\n src: string;\n dst: string;\n};\ntype State = {};\nexport default class MergedView extends React.Component {\n mergedMarkup() {\n const { src, dst } = this.props;\n const code = highlightChanges(src, dst, HIGHLIGHT_ADDED);\n\n return {\n __html: code,\n };\n }\n\n render() {\n return (\n \n \n
\n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { i18n } from \"../../services\";\nimport { Progress } from \"../../lib\";\nimport { PageContents } from \"../../models\";\n\nimport Mode from \"./Mode\";\nimport SplitView from \"./SplitView\";\nimport MergedView from \"./MergedView\";\nimport { AxiosResponse } from \"axios\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nconst Description = styled.div<{ info?: boolean }>`\n margin-top: 70px;\n text-align: center;\n font-size: 18px;\n padding: 15px 15px;\n color: ${(p) => (p.info ? \"#31708f\" : \"#000\")};\n border: 1px solid ${(p) => (p.info ? \"#bcdff1\" : \"#ccc\")};\n background-color: ${(p) => (p.info ? \"#d9edf7\" : \"#efefef\")};\n`;\n\nconst COMPARE_SPLIT = \"split\";\nconst COMPARE_UNIFIED = \"unified\";\n\ntype Props = {\n doc_id: number;\n compare: {\n src: number;\n dst: number;\n };\n};\ntype State = {\n mode: string;\n loaded: boolean;\n compare: {\n src: string;\n dst: string;\n };\n};\n\nexport class Compare extends React.Component {\n timeout: ReturnType | null = null;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n mode: COMPARE_SPLIT,\n loaded: false,\n compare: {\n src: \"\",\n dst: \"\",\n },\n };\n }\n\n modeValues = [\n { value: COMPARE_SPLIT, label: \"merge.split\" },\n { value: COMPARE_UNIFIED, label: \"merge.unified\" },\n ];\n\n componentDidMount() {\n const { src, dst } = this.props.compare;\n this.fetch(src, dst);\n }\n\n componentWillReceiveProps(newProps: Props) {\n const { src, dst } = newProps.compare;\n this.fetch(src, dst);\n }\n\n componentWillUnmount() {\n if (this.timeout !== null) {\n clearTimeout(this.timeout!);\n }\n }\n\n async fetch(src: number, dst: number) {\n if (src === -1 || dst === -1) {\n return;\n }\n\n this.setState({\n loaded: false,\n compare: {\n src: \"\",\n dst: \"\",\n },\n });\n\n try {\n const { doc_id } = this.props;\n const params = { doc_id };\n const {\n data: srcHTML,\n }: AxiosResponse = await PageContents.fetch(\n `contents/${src}`,\n params\n );\n const {\n data: dstHTML,\n }: AxiosResponse = await PageContents.fetch(\n `contents/${dst}`,\n params\n );\n\n this.setState({\n loaded: true,\n compare: {\n src: srcHTML,\n dst: dstHTML,\n },\n });\n } catch (e) {\n console.warn(e);\n }\n }\n\n isFilledSrcDst() {\n const {\n compare: { src, dst },\n } = this.props;\n return src !== -1 && dst !== -1;\n }\n\n description() {\n if (this.isFilledSrcDst()) {\n return (\n \n {i18n.get(\"merge.compareDescription\")}\n \n );\n }\n return null;\n }\n\n setMode = (mode: string) => this.setState({ mode });\n mode = () => {\n if (!this.isFilledSrcDst()) {\n return null;\n }\n\n return (\n \n );\n };\n\n view() {\n if (!this.isFilledSrcDst()) {\n return null;\n }\n\n const {\n mode,\n compare: { src, dst },\n } = this.state;\n\n return mode === COMPARE_SPLIT ? (\n \n ) : (\n \n );\n }\n\n render() {\n if (this.isFilledSrcDst() && !this.state.loaded) {\n return ;\n }\n\n const {\n compare: { src, dst },\n } = this.props;\n const {\n compare: { src: srcContent, dst: dstContent },\n } = this.state;\n if (src !== -1 && dst !== -1 && srcContent === dstContent) {\n return (\n \n {i18n.get(\"merge.bothAreEqual\")}\n \n );\n }\n\n return (\n \n {this.description()}\n {this.mode()}\n {this.view()}\n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Merge } from \"../../models\";\nimport { notification } from \"../../services\";\nimport { Compare } from \"../../components/Merge\";\nimport Header from \"../../components/Merge/Header\";\nimport { Progress, getURLParam } from \"../../lib\";\nimport { setWindowTitle } from \"../../helpers\";\nimport { Content, Container } from \"../../pages/Template\";\nimport { AppState } from \"../../store\";\nimport { RouteMatch } from \"../../lib\";\nimport { AxiosResponse } from \"axios\";\n\nconst mapState = (state: AppState, ownProps: OwnProps) => ({\n user: state.user,\n doc_id: parseInt(ownProps.match.params.doc_id),\n});\nexport type ComparePage = {\n user_id: number;\n user_name: string;\n user_status: string;\n\n page_id: number;\n page_name: string;\n page_contents_id: number;\n};\ntype StateProps = ReturnType;\ntype OwnProps = {\n match: RouteMatch;\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n pages: ComparePage[] | null;\n loaded: boolean;\n compare: {\n src: number;\n dst: number;\n };\n};\n\nclass CreateMergePage extends React.Component {\n static paths = [\"/app/merge/:doc_id/\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n pages: null,\n loaded: false,\n compare: {\n src: -1,\n dst: -1,\n },\n };\n\n this.onConfirm = this.onConfirm.bind(this);\n }\n\n componentDidMount() {\n this.fetch();\n setWindowTitle(\"کام ملاؤ\");\n }\n\n async fetch() {\n this.setState({ loaded: false });\n\n const { doc_id } = this.props;\n const { data }: AxiosResponse = await Merge.fetch(\n \"pages\",\n {\n doc_id,\n }\n );\n this.setState({ pages: data, loaded: true });\n }\n\n onCompare = (src: number, dst: number) =>\n this.setState({ compare: { src, dst } });\n onCompareClear = () => this.setState({ compare: { src: -1, dst: -1 } });\n\n onConfirm = async (page_id: number, src: number, dst: number) => {\n this.setState({\n loaded: false,\n compare: {\n src: -1,\n dst: -1,\n },\n });\n\n try {\n const { doc_id } = this.props.match.params;\n await Merge.create(\n {\n page_id,\n src_page_contents_id: src,\n dst_page_contents_id: dst,\n },\n { doc_id }\n );\n this.setState({ loaded: true });\n notification.set(\"merge.requestCreated\", \"s\");\n } catch (e) {\n console.warn(\"Merge request error\", e);\n }\n };\n\n render() {\n if (!this.state.loaded || !this.state.pages) {\n return ;\n }\n\n const { user } = this.props;\n const { doc_id } = this.props.match.params;\n const { pages, compare } = this.state;\n\n let param_page_id = getURLParam(\"page_id\");\n let page_contents_id = -1;\n if (!!param_page_id) {\n const page_id = parseInt(param_page_id);\n for (const p of pages) {\n if (\n p &&\n p.page_id === page_id &&\n //@ts-ignore\n p.user_id === user.get(\"id\")\n ) {\n page_contents_id = p.page_contents_id;\n break;\n }\n }\n }\n\n return (\n \n \n \n\n {pages.length > 0 && (\n \n )}\n \n \n );\n }\n}\n\nexport default connect(mapState)(CreateMergePage);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { i18n, navigate } from \"../../services\";\nimport { AppState } from \"../../store\";\nimport {\n Button,\n ButtonActionGroup,\n BTN_SMALL,\n TYPE_SECONDARY,\n} from \"../../lib\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n`;\n\nconst Heading = styled.h2`\n font-size: 30px;\n margin: 20px auto 20px auto;\n`;\n\nconst Description = styled.div`\n font-size: 16px;\n text-align: center;\n`;\n\nconst mapStateToProps = ({ user }: AppState) => ({ user });\ntype StateProps = ReturnType;\ntype Props = StateProps;\n\nclass Header extends React.Component {\n onReturnClick = () => navigate.back();\n\n render() {\n return (\n \n {i18n.get(\"merge.titleRequest\")}\n \n {i18n.get(\"merge.requestDescription\")}\n \n\n \n \n \n \n );\n }\n}\nexport default connect(mapStateToProps)(Header);\n","import React from \"react\";\nimport { Table } from \"../../lib\";\nimport { mysqlDateToArabic, toArabicNumerals } from \"../../helpers\";\nimport { i18n, navigate } from \"../../services\";\nimport { MergeRequest } from \"./index\";\nimport { RowProps } from \"../../lib/ui/Table\";\n\ntype Props = {\n requests: Array;\n};\n\nexport default class Requests extends React.Component {\n onRowClick = (r: Record) => {\n const { id, doc_id, src_page_contents_id, dst_page_contents_id } = r;\n navigate.to(\n `/app/merge/resolve/${doc_id}/${id}/${src_page_contents_id}/${dst_page_contents_id}/`\n );\n };\n\n render() {\n const { requests } = this.props;\n\n const fields = [\n \"num\",\n \"status\",\n \"name\",\n \"src_user_name\",\n \"dst_user_name\",\n \"created_at\",\n ];\n const titles = [\n \"merge.number\",\n \"merge.status\",\n \"merge.page_name\",\n \"merge.src_name\",\n \"merge.dst_name\",\n \"form.date\",\n ];\n\n const transform: Record string> = {\n num: toArabicNumerals,\n created_at: mysqlDateToArabic,\n status: (status: string) => i18n.get(`merge.${status}`),\n };\n\n const width = [\"5%\", \"10%\", \"30%\", \"20%\", \"20%\", \"15%\"];\n\n return (\n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Merge } from \"../../models\";\nimport { Content, Container } from \"../../pages/Template\";\n\nimport Header from \"./Header\";\nimport Requests from \"./Requests\";\nimport { setWindowTitle } from \"../../helpers\";\nimport { AppState } from \"../../store\";\nimport { AxiosResponse } from \"axios\";\n\ntype OwnProps = {\n match: {\n params: {\n doc_id: string;\n };\n };\n};\n\nconst mapState = (\n _: AppState,\n {\n match: {\n params: { doc_id },\n },\n }: OwnProps\n) => ({\n doc_id: parseInt(doc_id),\n});\ntype StateProps = ReturnType;\n\nexport interface MergeRequest {\n id: number;\n num: number;\n name: string;\n doc_id: number;\n status: string;\n created_at: string;\n\n src_user_id: number;\n dst_user_id: number;\n\n src_page_contents_id: number;\n dst_page_contents_id: number;\n\n src_user_name: string;\n dst_user_name: string;\n}\n\ntype Props = StateProps;\ntype State = {\n requests: Array;\n};\n\nclass MergeRequestsPage extends React.Component {\n static paths = [\"/app/merge/request/:doc_id/\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n requests: [],\n };\n }\n\n componentDidMount() {\n this.fetch();\n setWindowTitle(\"کام ملانے کے پیغامات\");\n }\n\n async fetch() {\n try {\n const { doc_id } = this.props;\n const { data }: AxiosResponse = await Merge.fetch(\n \"\",\n {\n doc_id,\n }\n );\n this.setState({ requests: [data] });\n } catch (e) {}\n }\n\n render() {\n return (\n \n \n
\n \n \n \n );\n }\n}\n\nexport default connect(mapState)(MergeRequestsPage);\n","import React from 'react'\nimport { FormattedMessage } from 'react-intl'\nimport styled from 'styled-components'\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n`\n\nconst Heading = styled.h2`\n font-size: 30px;\n margin: 20px auto 20px auto;\n`\n\nconst Description = styled.div`\n font-size: 16px;\n`\n\nexport default class Header extends React.Component {\n render() {\n return (\n \n \n \n \n \n \n \n \n )\n }\n}\n","import React from \"react\";\nimport { navigate } from \"../../services\";\nimport {\n ButtonActionGroup,\n Button,\n BTN_SMALL,\n TYPE_SECONDARY,\n TYPE_SUCCESS,\n TYPE_FAILURE,\n} from \"../../lib\";\n\ntype Props = {\n decided: boolean;\n onAccept: () => void;\n onReject: () => void;\n};\n\nexport default class Actions extends React.Component {\n onAccept = () => this.props.onAccept();\n onReject = () => this.props.onReject();\n\n onReturnClick = () => navigate.back();\n\n render() {\n const { decided } = this.props;\n return (\n \n {!decided && (\n \n )}\n\n {!decided && (\n \n )}\n\n \n \n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { FormattedMessage } from \"react-intl\";\nimport { mysqlDateToArabic } from \"../../helpers\";\nimport { MergeRequest } from \"../MergeRequestsPage/index\";\n\nconst Container = styled.div`\n user-select: none;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-between;\n margin-top: 60px;\n`;\n\nconst Heading = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 47%;\n padding: 15px 1.5% 10px 0;\n font-size: 20px;\n\n &:first-of-type {\n justify-content: flex-end;\n }\n`;\n\nconst Divider = styled.div`\n position: relative;\n border-left: 1px solid #ccc;\n\n &:before {\n position: absolute;\n content: \" \";\n top: -1px;\n left: -6px;\n width: 11px;\n height: 1px;\n background-color: #ccc;\n }\n`;\n\nconst Name = styled.div`\n padding-top: 30px;\n border-top: 1px solid #ccc;\n flex: 0 0 100%;\n font-size: 24px;\n text-align: center;\n`;\n\nconst CreatedAt = styled.div`\n flex: 0 0 100%;\n font-size: 18px;\n text-align: center;\n`;\n\nconst TimeRef = styled.div`\n position: relative;\n font-size: 16px;\n\n &:before,\n &:after {\n position: absolute;\n content: \" \";\n }\n`;\nconst Present = styled(TimeRef)`\n margin-left: 40px;\n\n &:after {\n left: -23px;\n top: 5px;\n width: 0;\n height: 0;\n border-top: 7px solid transparent;\n border-bottom: 7px solid transparent;\n border-left: 7px solid #ccc;\n }\n`;\nconst Future = styled(TimeRef)`\n margin-right: 40px;\n\n &:before {\n right: -23px;\n top: 5px;\n width: 0;\n height: 0;\n border-top: 7px solid transparent;\n border-bottom: 7px solid transparent;\n border-right: 7px solid #ccc;\n }\n`;\n\ntype Props = {\n request: MergeRequest;\n};\n\nexport default class People extends React.Component {\n render() {\n const { request } = this.props;\n return (\n \n \n \n \n {\" \"}\n {request.src_user_name}\n \n \n \n {request.dst_user_name}{\" \"}\n \n \n \n \n {request.name}\n \n {mysqlDateToArabic(new Date(request.created_at))}\n \n \n );\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { notification } from \"../../services\";\nimport { Notification } from \"../../lib\";\nimport { Merge } from \"../../models\";\nimport { Content, Container } from \"../../pages/Template\";\nimport { Compare } from \"../../components/Merge\";\nimport Header from \"./Header\";\nimport Actions from \"./Actions\";\nimport RequestHeader from \"./RequestHeader\";\nimport { setWindowTitle } from \"../../helpers\";\nimport { AxiosResponse } from \"axios\";\nimport { MergeRequest } from \"../MergeRequestsPage\";\nimport { AppState } from \"../../store\";\n\ntype OwnProps = {\n doc_id: number;\n match: {\n params: {\n doc_id: string;\n request_id: string;\n src: string;\n dst: string;\n };\n };\n};\nconst mapStateToProps = (\n { user }: AppState,\n {\n match: {\n params: { doc_id },\n },\n }: OwnProps\n) => ({\n user,\n doc_id: parseInt(doc_id),\n});\ntype StateProps = ReturnType;\n\ntype Props = StateProps & OwnProps;\ntype State = {\n request: MergeRequest | null;\n loaded: boolean;\n decided: boolean;\n compare: {\n src: number;\n dst: number;\n };\n};\n\nclass MergeResolvePage extends React.Component {\n static paths = [\"/app/merge/resolve/:doc_id/:request_id/:src/:dst/\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n request: null,\n loaded: false,\n decided: false,\n compare: {\n src: -1,\n dst: -1,\n },\n };\n\n this.onAccept = this.onAccept.bind(this);\n this.onReject = this.onReject.bind(this);\n }\n\n componentDidMount() {\n this.fetch();\n setWindowTitle(\"کام ملاؤ\");\n }\n\n async fetch() {\n this.setState({ loaded: false });\n\n try {\n const { doc_id } = this.props;\n const { request_id } = this.props.match.params;\n const { data }: AxiosResponse = await Merge.fetch(\n `request/${request_id}`,\n {\n doc_id,\n }\n );\n\n if ([\"OPEN\", \"PENDING\"].includes(data.status)) {\n this.setState({ request: data });\n } else if (data.status === \"REJECTED\") {\n this.setState({ decided: true });\n notification.set(\"merge.alreadyRejected\", \"f\");\n } else if (data.status === \"RESOLVED\") {\n this.setState({ decided: true });\n notification.set(\"merge.alreadyResolved\", \"i\");\n }\n } catch (e) {}\n }\n\n async onAccept() {\n try {\n const { doc_id, request_id } = this.props.match.params;\n await Merge.save(\"\", `request/${request_id}`, { doc_id });\n this.setState({ decided: true });\n notification.set(\"merge.accepted\", \"s\");\n } catch (e) {}\n }\n\n async onReject() {\n try {\n const { doc_id, request_id } = this.props.match.params;\n await Merge.destroy(`request/${request_id}`, { doc_id });\n this.setState({ decided: true });\n notification.set(\"merge.rejected\", \"f\");\n } catch (e) {}\n }\n\n render() {\n const { decided, request } = this.state;\n const { doc_id } = this.props;\n const { src, dst } = this.props.match.params;\n const compare = {\n src: parseInt(src),\n dst: parseInt(dst),\n };\n const operational = !decided && request;\n\n return (\n \n \n
\n \n {operational && }\n \n {operational && (\n \n )}\n \n \n );\n }\n}\n\nexport default connect(mapStateToProps)(MergeResolvePage);\n","import { AxiosResponse } from \"axios\";\nimport {\n findTokens,\n LANG_ENG,\n LANG_URD,\n TokenType,\n} from \"../../../helpers/translate\";\nimport { Translate } from \"../../../models\";\nimport { cache } from \"./index\";\n\nexport function enSentences(text: string) {\n const tokens: Array<{\n type: TokenType;\n value: string;\n }> = [];\n findTokens(text, tokens);\n\n const list = [];\n let char;\n let sentence = \"\";\n\n const CHAR_FULLSTOP = \".\";\n const CHAR_SPACE = \" \";\n const CHAR_NEWLINE = \"\\n\";\n const STOP_CHARS = [CHAR_SPACE, CHAR_NEWLINE];\n\n for (let i = 0, len = text.length; i < len; i += 1) {\n char = text[i];\n if (char === CHAR_NEWLINE) {\n list.push(sentence);\n list.push(char);\n sentence = \"\";\n continue;\n } else if (char === CHAR_FULLSTOP) {\n if (i === len || (i < len && STOP_CHARS.includes(text[i + 1]))) {\n sentence += char;\n list.push(sentence);\n sentence = \"\";\n continue;\n }\n }\n\n sentence += char;\n }\n\n if (sentence.length > 0) {\n list.push(sentence);\n }\n\n return list;\n}\n\nexport async function en2ur(list: string[]) {\n try {\n const reChars = RegExp(/[a-zA-Z]+/);\n const src = [];\n const dst = [];\n\n let src_text;\n for (let i = 0, len = list.length; i < len; i += 1) {\n src_text = list[i];\n if (!src_text.match(reChars)) {\n src.push(src_text);\n dst.push(src_text);\n continue;\n }\n\n if (cache[LANG_ENG][LANG_URD][src_text]) {\n src.push(src_text);\n dst.push(cache[LANG_ENG][LANG_URD][src_text]);\n continue;\n }\n\n const {\n data: { translation },\n }: AxiosResponse<{\n translation: string;\n }> = await Translate.create(\n { src_text },\n {\n src_lang: LANG_ENG,\n dst_lang: LANG_URD,\n }\n );\n\n cache[LANG_ENG][LANG_URD][src_text] = translation;\n\n src.push(src_text);\n dst.push(translation);\n }\n\n return {\n src,\n dst,\n };\n } catch (e) {\n console.warn(\"engToUrd translation failed\");\n console.warn(e);\n return {\n src: [],\n dst: [],\n };\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { i18n } from \"../../services\";\n\nexport const Container = styled.div`\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n width: 100%;\n margin: 20px 0 100px 0;\n justify-content: space-between;\n`;\nexport const Header = styled.div`\n display: flex;\n flex-direction: row-reverse;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n border-bottom: 1px solid #ccc;\n padding: 0 10px 5px 10px;\n`;\nexport const Label = styled.div<{\n fontSize?: string;\n textAlign?: string;\n}>`\n user-select: none;\n width: 100%;\n font-size: ${(p) => p.fontSize || \"22px\"};\n text-align: ${(p) => p.textAlign || \"center\"};\n`;\n\nconst CONTENT_WIDTH = \"50%\";\nexport const Contents = styled.div`\n display: block;\n width: ${CONTENT_WIDTH};\n padding: 30px 3% 0 3%;\n min-height: 250px;\n\n & > div {\n outline: none;\n }\n\n & .focus {\n background-color: #eaeaea;\n }\n`;\n\nexport const LTRContainer = styled.div`\n width: ${CONTENT_WIDTH};\n`;\nexport const RTL = styled(Contents)`\n user-select: none;\n direction: rtl;\n text-align: right;\n line-height: 130%;\n color: #000;\n\n & > div {\n display: inline;\n line-height: 170%;\n font-size: 18px;\n white-space: pre-wrap;\n\n &:hover {\n background-color: #eaeaea;\n }\n }\n`;\n\nexport const LTR = styled(Contents)<{ display: string }>`\n width: 100%;\n direction: ltr;\n text-align: left;\n white-space: pre-wrap;\n color: #000;\n background-color: #fffae3;\n display: ${(p) => p.display};\n line-height: 180%;\n font-size: 15px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial,\n sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n\n & div {\n line-height: 180%;\n font-size: 15px;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica,\n Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\",\n \"Segoe UI Symbol\";\n }\n`;\nexport const LTRFragmented = styled(LTR)`\n background-color: #fff;\n & div {\n display: inline;\n white-space: pre-wrap;\n\n &:hover {\n background-color: #eaeaea;\n }\n }\n`;\n\nexport const Divider = styled.div`\n position: absolute;\n left: 50%;\n top: 44px;\n width: 1px;\n height: calc(100% - 44px);\n background-color: #ccc;\n`;\n\nexport function Titles({\n src_lang,\n dst_lang,\n}: {\n src_lang: string;\n dst_lang: string;\n}) {\n return (\n
\n \n \n
\n );\n}\n","import React from \"react\";\nimport { KEY_ESC } from \"../../lib/keyboard\";\nimport { setPositionInContentEditable } from \"../../lib/selection\";\nimport { eventEmitter } from \"../../services\";\nimport { LTRContainer, LTR, LTRFragmented } from \"./styles\";\nimport {\n EVT_LTR_MOUSEOVER,\n EVT_LTR_MOUSEOUT,\n EVT_RTL_MOUSEOVER,\n EVT_RTL_MOUSEOUT,\n EVT_LTR_TRANSLATED,\n setFocusClass,\n} from \"./helpers\";\n\nexport const DEFAULT_EN = \"Enter some text in english to translate.\";\n// export const DEFAULT_EN = 'Who has been given wisdom?'\n\ntype Props = {\n src: string[];\n onInput: (text: string) => void;\n};\ntype State = {\n fragment: boolean;\n};\n\nexport default class LTRView extends React.Component {\n private elm: React.RefObject;\n private elmFragmented: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n fragment: false,\n };\n\n this.elmFragmented = React.createRef();\n this.elm = React.createRef();\n this.setupPasteEvt();\n }\n\n componentDidMount() {\n if (this.elm && this.elm.current) {\n this.props.onInput(this.elm.current.innerText);\n }\n this.setState({ fragment: true });\n\n eventEmitter.on(EVT_RTL_MOUSEOVER, (index: number) => {\n if (this.elmFragmented && this.elmFragmented.current) {\n setFocusClass(this.elmFragmented.current, index, true);\n }\n });\n\n eventEmitter.on(EVT_RTL_MOUSEOUT, (index: number) => {\n if (this.elmFragmented && this.elmFragmented.current) {\n setFocusClass(this.elmFragmented.current, index, false);\n }\n });\n\n eventEmitter.on(EVT_LTR_TRANSLATED, () => {\n this.setState({ fragment: true });\n });\n }\n\n html() {\n return {\n __html: DEFAULT_EN,\n };\n }\n\n onBlur = () => {\n if (!this.elm || !this.elm.current) {\n return;\n }\n\n const e = this.elm.current;\n if (e.innerText.length > 10) {\n this.props.onInput(e.innerText);\n e.innerHTML = e.innerText;\n }\n };\n\n onKeyUp = (evt: React.KeyboardEvent) => {\n if (evt.key === KEY_ESC) {\n this.elm && this.elm.current && this.elm.current.blur();\n }\n };\n\n onMouseOut = (index: number) => eventEmitter.emit(EVT_LTR_MOUSEOUT, index);\n onMouseOver = (index: number) =>\n eventEmitter.emit(EVT_LTR_MOUSEOVER, index);\n\n onClick = (\n evt: React.MouseEvent,\n text: string,\n index: number\n ) => {\n const { clientX } = evt;\n const {\n left,\n width,\n height,\n } = (evt.target as HTMLElement).getBoundingClientRect();\n\n this.setState({ fragment: false }, () => {\n if (!this.elm || !this.elm.current) {\n return;\n }\n\n this.elm.current.focus();\n\n let { src } = this.props;\n let position = 0;\n for (let i = 0; i < index; i += 1) {\n position += src[i].length;\n }\n\n const LINE_HEIGHT = 24;\n const diffX = clientX - left;\n if (height <= LINE_HEIGHT) {\n const xPercentage = diffX / width;\n position += text.length * xPercentage;\n } else {\n // multi-line not supported, position cursor at the start of sentence\n }\n\n setPositionInContentEditable(this.elm.current, position);\n });\n };\n\n viewFragmented() {\n const { src } = this.props;\n return src.map((text, i) => (\n this.onMouseOut(i)}\n onMouseOver={() => this.onMouseOver(i)}\n onClick={(evt: React.MouseEvent) =>\n this.onClick(evt, text, i)\n }\n >\n {text}\n
\n ));\n }\n\n onPaste = (evt: ClipboardEvent) => {\n evt.preventDefault();\n if (evt.clipboardData) {\n const text = evt.clipboardData.getData(\"text/plain\");\n document.execCommand(\"insertText\", false, text);\n }\n };\n\n setupPasteEvt = () => {\n if (!this.elm || !this.elm.current) {\n return;\n }\n\n this.elm.current.removeEventListener(\"paste\", this.onPaste);\n this.elm.current.addEventListener(\"paste\", this.onPaste);\n };\n\n render() {\n const { fragment } = this.state;\n return (\n \n \n {this.viewFragmented()}\n \n \n \n \n \n );\n }\n}\n","import { en2ur, enSentences } from \"./en\";\nimport { DEFAULT_EN } from \"../LTRView\";\nimport { LANG_ENG, LANG_URD } from \"../../../helpers/translate\";\n\nexport const EVT_LTR_MOUSEOVER = \"ltr.mouseOver\";\nexport const EVT_LTR_MOUSEOUT = \"ltr.mouseOut\";\nexport const EVT_RTL_MOUSEOVER = \"rtl.mouseOver\";\nexport const EVT_RTL_MOUSEOUT = \"rtl.mouseOut\";\nexport const EVT_LTR_TRANSLATED = \"ltr.translated\";\nexport const EVT_COPY_TRANSLATION = \"copy.translation\";\n\nexport const cache: Record>> = {\n [LANG_ENG]: {\n [LANG_URD]: {\n [DEFAULT_EN]: \"انگریزی سے ترجمعے کے لیے کچھ متن لکھیں.\",\n },\n },\n};\n\nexport async function translate(\n text: string,\n from: string = LANG_ENG,\n to: string = LANG_URD\n) {\n if (from === LANG_ENG) {\n return en(text, to);\n }\n}\n\nexport async function en(text: string, to: string) {\n try {\n if (to === LANG_URD) {\n return await en2ur(enSentences(text));\n }\n\n throw new Error(`translation not available, from: en, to: ${to}`);\n } catch (e) {\n console.warn(\"translate:en\");\n console.warn(e);\n }\n}\n\nexport function updateCache(\n src_lang: string,\n src_text: string,\n dst_lang: string,\n dst_text: string\n) {\n cache[src_lang][dst_lang][src_text] = dst_text;\n}\n\nexport function setFocusClass(\n elm: HTMLElement,\n childIndex: number,\n status: boolean\n) {\n if (!elm) {\n return;\n }\n\n if (status) {\n const t = elm.childNodes[childIndex] as HTMLElement;\n if (t && t.className) {\n t.className = \"focus\";\n }\n } else {\n for (let i = 0, len = elm.childNodes.length; i < len; i += 1) {\n const n = elm.childNodes[i] as HTMLElement;\n if (n) {\n n.className = \"\";\n }\n }\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { i18n, navigate, eventEmitter } from \"../../services\";\nimport {\n Button,\n ButtonActionGroup,\n BTN_SMALL,\n TYPE_PRIMARY,\n TYPE_SECONDARY,\n} from \"../../lib\";\nimport { EVT_COPY_TRANSLATION } from \"./helpers\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: center;\n user-select: none;\n`;\n\nconst Heading = styled.h2`\n font-size: 30px;\n margin: 20px auto 20px auto;\n`;\n\nconst Description = styled.div`\n font-size: 16px;\n text-align: center;\n`;\n\nexport default class Header extends React.Component {\n onReturn = () => navigate.back();\n onCopyTranslation = () => eventEmitter.emit(EVT_COPY_TRANSLATION);\n\n render() {\n return (\n \n {i18n.get(\"translate.title\")}\n {i18n.get(\"translate.description\")}\n\n \n \n\n \n \n \n );\n }\n}\n","import React from \"react\";\nimport { KEY_ESC } from \"../../lib\";\nimport { Progress } from \"../../lib/ui\";\nimport { Translate } from \"../../models\";\nimport { eventEmitter } from \"../../services\";\nimport {\n cache,\n EVT_LTR_MOUSEOVER,\n EVT_LTR_MOUSEOUT,\n EVT_RTL_MOUSEOVER,\n EVT_RTL_MOUSEOUT,\n setFocusClass,\n} from \"./helpers\";\nimport { RTL } from \"./styles\";\n\ntype Props = {\n loading: boolean;\n dst: string[];\n src: string[];\n src_lang: string;\n dst_lang: string;\n\n update: (editIndex: number, dst_text: string) => void;\n};\ntype State = {\n editIndex: number;\n};\n\nexport default class RTLView extends React.Component {\n private elm: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n editIndex: -1,\n };\n\n this.elm = React.createRef();\n }\n\n componentDidMount() {\n eventEmitter.on(EVT_LTR_MOUSEOVER, (index: number) => {\n if (this.elm && this.elm.current) {\n setFocusClass(this.elm.current, index, true);\n }\n });\n\n eventEmitter.on(EVT_LTR_MOUSEOUT, (index: number) => {\n if (this.elm && this.elm.current) {\n setFocusClass(this.elm.current, index, false);\n }\n });\n }\n\n onBlur = async (evt: React.FocusEvent) => {\n const { editIndex } = this.state;\n const { src, src_lang, dst_lang } = this.props;\n const src_text = src[editIndex];\n const dst_text = evt.target.innerText;\n\n cache[src_lang][dst_lang][src_text] = dst_text;\n await Translate.save({ dst_text, src_text }, \"\", {\n src_lang,\n dst_lang,\n });\n\n this.setState({ editIndex: -1 });\n this.props.update(editIndex, dst_text);\n };\n\n onKeyUp = (evt: React.KeyboardEvent) => {\n if (evt.key === KEY_ESC) {\n (evt.target as HTMLElement).blur();\n }\n };\n\n onClick = (editIndex: number) => this.setState({ editIndex });\n\n onMouseOut = (index: number) => eventEmitter.emit(EVT_RTL_MOUSEOUT, index);\n onMouseOver = (index: number) =>\n eventEmitter.emit(EVT_RTL_MOUSEOVER, index);\n\n html() {\n return {\n __html: this.props.dst[this.state.editIndex],\n };\n }\n\n view() {\n if (this.props.loading) {\n return ;\n }\n\n const { editIndex } = this.state;\n const { dst } = this.props;\n return dst.map((text, i) => {\n if (editIndex === i) {\n return (\n c && c.focus()}\n onBlur={this.onBlur}\n onKeyUp={this.onKeyUp}\n dangerouslySetInnerHTML={this.html()}\n />\n );\n }\n\n return (\n this.onClick(i)}\n onMouseOut={() => this.onMouseOut(i)}\n onMouseOver={() => this.onMouseOver(i)}\n >\n {text}\n
\n );\n });\n }\n render() {\n return {this.view()};\n }\n}\n","import React, { CSSProperties } from \"react\";\nimport { copyFromElm } from \"../../lib/text\";\nimport { LANG_ENG, LANG_URD } from \"../../helpers/translate\";\nimport { eventEmitter } from \"../../services\";\nimport { translate, EVT_COPY_TRANSLATION, EVT_LTR_TRANSLATED } from \"./helpers\";\n\nimport RTLView from \"./RTLView\";\nimport LTRView from \"./LTRView\";\nimport { Container, Titles, Divider } from \"./styles\";\n\nconst copyStyle: CSSProperties = {\n position: \"absolute\",\n left: \"-9999px\",\n};\n\ntype Props = {};\ntype State = {\n loading: boolean;\n src_lang: string;\n dst_lang: string;\n src: string[];\n dst: string[];\n};\n\nexport default class SplitView extends React.Component {\n private copyElm: React.RefObject;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n loading: false,\n src_lang: LANG_ENG,\n dst_lang: LANG_URD,\n src: [],\n dst: [],\n };\n this.copyElm = React.createRef();\n }\n\n componentDidMount() {\n eventEmitter.on(EVT_COPY_TRANSLATION, () => {\n if (this.copyElm.current) {\n copyFromElm(this.state.dst.join(\"\"), this.copyElm.current);\n }\n });\n }\n\n onInput = async (text: string) => {\n await this.fetchTranslations(text);\n };\n\n async fetchTranslations(text: string) {\n this.setState({ loading: true });\n const { src_lang, dst_lang } = this.state;\n try {\n const res = await translate(text, src_lang, dst_lang);\n if (typeof res === \"undefined\") {\n this.setState({ loading: false });\n return;\n }\n\n const { src, dst } = res!;\n this.setState({ src, dst, loading: false });\n eventEmitter.emit(EVT_LTR_TRANSLATED);\n } catch (e) {\n console.warn(\"fetchTranslations failed\");\n console.warn(e);\n }\n }\n\n updateDst = (index: number, text: string) => {\n const { dst } = this.state;\n dst[index] = text;\n this.setState({ dst: [...dst] });\n };\n\n render() {\n return (\n \n \n \n \n \n
\n \n );\n }\n}\n","export function copyFromElm(text: string, elm: HTMLElement) {\n if (!elm) {\n return;\n }\n\n try {\n elm.innerText = text;\n\n const range = document.createRange();\n range.selectNodeContents(elm);\n\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n\n document.execCommand(\"copy\");\n }\n } catch (e) {\n console.warn(\"copyFromElm\");\n console.warn(e);\n }\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Content, Container } from \"../../pages/Template\";\nimport { AppState } from \"../../store\";\n\nimport Header from \"./Header\";\nimport SplitView from \"./SplitView\";\n\ntype OwnProps = {\n match: {\n params: {\n doc_id: string;\n };\n };\n};\nconst mapStateToProps = (\n _: AppState,\n {\n match: {\n params: { doc_id },\n },\n }: OwnProps\n) => ({\n doc_id: parseInt(doc_id),\n});\ntype StateProps = ReturnType;\n\ntype Props = StateProps & OwnProps;\n\nclass TranslatePage extends React.Component {\n static paths = [\"/app/translate/:doc_id/\"];\n static requiresAuth = true;\n\n render() {\n return (\n \n \n
\n \n \n \n );\n }\n}\n\nexport default connect(mapStateToProps)(TranslatePage);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { THEME_HIGH, THEME_MEDIUM, THEME_LOW } from \"../../reducers/reader\";\nimport { AppState } from \"../../store\";\n\nexport const COLORS: Record> = {\n [THEME_HIGH]: {\n color: \"#000\",\n bgColor: \"#fff9c6\",\n },\n [THEME_LOW]: {\n color: \"#fff\",\n bgColor: \"#191919\",\n },\n [THEME_MEDIUM]: {\n color: \"#000\",\n bgColor: \"#fff\",\n },\n};\n\nconst Container = styled.div<{ theme: string }>`\n position: fixed;\n z-index: 1;\n right: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: ${(p) => COLORS[p.theme][\"bgColor\"]};\n`;\n\ntype Props = ReturnType;\n\nclass BgColor extends React.Component {\n render() {\n return ;\n }\n}\n\nconst mapState = ({ reader }: AppState) => ({\n //@ts-ignore\n theme: reader.get(\"theme\") as string,\n});\nexport default connect(mapState)(BgColor);\n","import React from \"react\";\nimport { navigate } from \"../../../services\";\nimport { docUrl } from \"../../../helpers\";\nimport { backBlack, backWhite } from \"../../../images\";\nimport { ReaderDoc } from \"../PageContents\";\n\ntype Props = {\n isDark: boolean;\n doc: ReaderDoc;\n};\n\nexport default class Back extends React.Component {\n onClick = () => navigate.to(docUrl(this.props.doc));\n\n render() {\n const { isDark } = this.props;\n return (\n \n );\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAABGdBTUEAALGPC/xhBQAAAJJJREFUOBFjYCAC/P//XwGID4BoIpQTVgI0SAqIHwAxCIBoyg0GGsIKxOuAGAaGhsHrYc4F0lR1Mc0M3kArF9PXYEagNy4QTq04VbACZbSQZB8C2Q4gQ/8jCVKDeZAmLiXbZUAPgnIa9SJryBhIvRwF9TLVDaRe8Qd1IfUMBKU3oKHUL/mhBisADT8AxAogPiEAAE8+dY59n4rQAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAABGdBTUEAALGPC/xhBQAAAIBJREFUOBFjYCAOKACVHQBiEE0VIAU05QEQ/4fSCkCaYsAKNGEdEIMMHToGr6eVi2lm8AZauZi+BjMCvXEBiMkFoOSmhaT5IZDtADIUlPaoCQ7SxKWUuBDkdapG1tAwkKo5CuRlqhtI1eIP5EKqGghKcjQp+UEGKwDxASgNpPADALmFQbRoWaoRAAAAAElFTkSuQmCC\"","import { DocPDF } from \"../models\";\nimport { eventEmitter } from \"../services\";\n\nexport async function isAvailable(docId: number) {\n const {\n data: { status },\n } = await DocPDF.fetch(`${docId}/available`);\n return status;\n}\n\nexport async function generatePDF(docId: number) {\n return await DocPDF.fetch(`${docId}/generate`);\n}\n\nexport async function downloadPDF(docId: number) {\n try {\n const available = await isAvailable(docId);\n if (!available) {\n await generatePDF(docId);\n\n eventEmitter.emit(\"pdf.processing\", true);\n setTimeout(async () => {\n await downloadPDF(docId);\n }, 15 * 1000);\n return;\n }\n\n eventEmitter.emit(\"pdf.processing\", false);\n\n const url = DocPDF.url(\"GET\", `${docId}/download`);\n window.location.assign(url);\n // window.open(url, `_pdf_download_${docId}`)\n } catch (e) {}\n}\n","import React from \"react\";\nimport { downloadPDF } from \"../../../helpers/pdf\";\n\nimport { downloadBlack, downloadWhite } from \"../../../images\";\nimport { ReaderDoc } from \"../PageContents/index\";\n\ntype Props = {\n doc: ReaderDoc;\n isDark: boolean;\n};\n\nexport default class Download extends React.Component {\n onClick = () => downloadPDF(this.props.doc.id);\n\n render() {\n const { isDark } = this.props;\n return (\n \n );\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAABGdBTUEAALGPC/xhBQAAANhJREFUOBHtkzsOwjAMhqNKcAhYcn0GxOsCXWDuws5NyucoBprmWSYkLP114tpf7Kg1psLGcRyQ2FCRbrqapNacP7T1xsr5P3anfH9btC4Pls6gfoU2ktGxsPgr2i8FC5D6Hbo5Ho8eqV1YzDomlvyjeCcdHpBab1hZ9NAI/owmYPZRKPEQKBxLx6YIjkGzQEeNg08Uuo5DqAce8WrvDhWongyLJEFNwDLia3y/rwMWwHd/ivg2YAbsmROXHllBoac8vIpPYjtQD0iAlwMT4O+BAbiXzjWW80/bOuU6UkeNswAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAABGdBTUEAALGPC/xhBQAAANZJREFUOBHt0ksOAiEMBmAwGQMcYdy4Z8m9fV6AI7hxPzfRVqkS0vLQlYmTkBqm8/nToFTHo7W+wLph7WhXq56m0Z4/Ojqxdv+PzdRau/Her9sHkztCCJNzbn50GGO2cKkXWGcJxksPS7z8CML7HawFPQU/YvoAP2Jh2BfRBO4zI6osKaK4TmViCWXAZ1KcQQvm0CpIo2fgIyUu0QQeYJ9O905IIFUOTsBrpkNgDYZE15QKa19CAqkyiemYeZWPTFBZG/A4SH8gwJ+DAvw9WMARk9Nerd4BZ1xo2nZwTdwAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { EVT_KEYDOWN, KEY_S } from \"../../../lib\";\nimport { fontSizeBlack, fontSizeWhite } from \"../../../images\";\nimport {\n THEME_FONT_SIZE_SMALL,\n THEME_FONT_SIZE_MEDIUM,\n THEME_FONT_SIZE_LARGE,\n} from \"../../../reducers/reader\";\nimport { setReaderFontSize } from \"../../../reducers/reader/actions\";\nimport { AppState } from \"../../../store\";\n\n//@ts-ignore\nconst mapState = ({ reader }: AppState) => ({ fontSize: reader.get(\"size\") });\nconst mapDispatch = {\n setReaderFontSize,\n};\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps &\n DispatchProps & {\n isDark: boolean;\n };\n\nclass FontSize extends React.Component {\n componentDidMount() {\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key.toUpperCase() === KEY_S) {\n this.onClick();\n }\n };\n\n onClick = () => {\n const { fontSize, setReaderFontSize } = this.props;\n\n if (fontSize === THEME_FONT_SIZE_SMALL) {\n setReaderFontSize(THEME_FONT_SIZE_MEDIUM);\n } else if (fontSize === THEME_FONT_SIZE_MEDIUM) {\n setReaderFontSize(THEME_FONT_SIZE_LARGE);\n } else if (fontSize === THEME_FONT_SIZE_LARGE) {\n setReaderFontSize(THEME_FONT_SIZE_SMALL);\n }\n };\n\n render() {\n const { isDark } = this.props;\n return (\n \n );\n }\n}\n\nexport default connect(mapState, mapDispatch)(FontSize);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAABGdBTUEAALGPC/xhBQAAAIxJREFUOBFjZMAD/v//fwYobYxHCT6ps0z4ZCmVo6nhLARctw4ofxaLmiCgmAhU/A2QBqlDBw/RBYjig+ICiGEAFC9YAU2DhQlmPRE0ThdidTZQkLYux2UrNcRBqWUWkkGaQLYtEn89kP0ayicv9mGGAcM9DS3sseZOoJpBkFpgrqYFPXRTy6jLsaYHAEOtagC2L06qAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAASCAYAAACw50UTAAAABGdBTUEAALGPC/xhBQAAAIJJREFUOBFjYMAPzgCl/5OJzzDhN5syWZoazkLAbeuA8mexqAkCiolAxd8AaZA6dPAQXYBYPnJcgNhYAU2DBWQ4sakBpwuxOhsoSHOX47KYYnFQapmFZIomkG2LxF8PZL+G8smOfZh5aUAGchwYwyTQ6MGRWtAcRT3u0E0toy7HmgoA+UktCDRFUzcAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { EVT_KEYDOWN, KEY_L } from \"../../../lib\";\nimport { connect } from \"react-redux\";\nimport { THEME_HIGH, THEME_LOW, THEME_MEDIUM } from \"../../../reducers/reader\";\nimport { setReaderTheme } from \"../../../reducers/reader/actions\";\n\nimport {\n brightnessHighBlack,\n brightnessHighWhite,\n brightnessMediumBlack,\n brightnessMediumWhite,\n brightnessLowBlack,\n brightnessLowWhite,\n} from \"../../../images\";\nimport { AppState } from \"../../../store\";\n\nconst THEMES = [THEME_HIGH, THEME_MEDIUM, THEME_LOW];\n\nconst mapState = ({ reader }: AppState) => ({\n // @ts-ignore\n theme: reader.get(\"theme\") as string,\n});\nconst mapDispatch = {\n setReaderTheme,\n};\ntype StateProps = ReturnType;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps &\n DispatchProps & {\n isDark: boolean;\n };\n\nclass Theme extends React.Component {\n componentDidMount() {\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key.toUpperCase() === KEY_L) {\n this.switchTheme();\n }\n };\n\n switchTheme = () => {\n let i = THEMES.indexOf(this.props.theme) + 1;\n if (i >= THEMES.length) {\n i = 0;\n }\n\n this.props.setReaderTheme(THEMES[i]);\n };\n\n render() {\n const { theme, isDark } = this.props;\n\n let src;\n if (theme === THEME_HIGH) {\n src = isDark ? brightnessHighWhite : brightnessHighBlack;\n } else if (theme === THEME_MEDIUM) {\n src = isDark ? brightnessMediumWhite : brightnessMediumBlack;\n } else if (theme === THEME_LOW) {\n src = isDark ? brightnessLowWhite : brightnessLowBlack;\n }\n\n return \"تھیم;\n }\n}\n\nexport default connect(mapState, mapDispatch)(Theme);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAehJREFUSA2tlL8vQ1EUx/ukEZUmEpsIE4sOFiERQmIzkBhMRjMDCyIhke79A5gsTCaTCZUw+BkWo8Vk0JBI8HzO671xetpXL9Jv8u2959f33nfvuU2lEiIMwxF4CLMJS5KlOeESo+AENmYBhGTHXphphEQLBHrvlK1gD2kf8wlYa6cP+B9Nbj4IggvjK5uIH5Q39u/faS2c1kbM/B3/HjyDr7AbTsFRmBw1dn6Kr6eWAv45+AI1Eu+8iOgYZ/hF9QDzGdgJb+A2/l38d8zljJthPEjUXfGGHe2YcQl+Qo0njJyoMa6pQHUXEdTCkrvjCgeYW2GJCy5hADNQNuPxuwAeKyxJ80487ytixl6XVzTxaIEmgqvQ9rF0hUDOuB58vGSSRrAnRXwWnpqgtJtALi8OIYFbF+wySYtc+H7k45OyUD7F41gCGG3wyTvNWHA5Pca/EInqHxJkgXuVOOeKc/jk8jy+mRRgC5QLPYIeG1qzYk6Gfv7yQPrdAiLSC8dhu/KtY2tUPKJ64lL0AaWPMzoRW45C7xgzQoV4WhfVmMvL24KrlF4zShfJZffBP/GXuBdoZTLsjaSj/T8fpLDDFC9jS99abOK4Ms5zWvDZ+OJNjsO2qRxudbvFS9SPmAUaJ+yXdQvIa06MHx9LwEhky3mNAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAdRJREFUSA2tk70vRFEQxR/ZCCKR6ESiolJohEQIiU5BolBtqVagQSQ0en8AlUanolH5SiiICI1yG9UWhETi63de3mzm3bx9eSsmOXvvzJx7ZvbeeVFU3MagHoGO4keKMSX8Cn7AGfi3Al5Y4oULNEH2tooz4gPsp0BWp4/EnwLuNv51EKu5h+ysu7+sszUlNiXv1Nm/Ez8Al+AF9IIZMA4asrDzc0731VEoE68C/w8Ld37BwQnwBYbAHOgBd2AX7IN7oDtuAbnmp+INpnW8zP4T+A4r+ANAtg4slzmmXljEPZ3C1HEobEI35DRtbUDNWDxVIBQWaQHINFp2KGvtj1lRpCv0+bhAM8E1EM6xpkKmO84zy+vr9aaGpxWQsCr5yitKYEvAx/3+m1yXSNgD8LnFOJr8hAVOk3gnawX4g7bfSTh6eItpTQknnPgf+A7KSUJTocczAXUs4VagBz0BlttkX9f8R1SFNZgwJaLHmwR2FYptABPWmvqI8FPmxUX+AJpjjZs3XYXv2Ao0JG6HNMcat2Pgr87ytqbES5CLWDuk0SJEz9G9eRvG6fYB9hpLzW1oWwRug+AV/nMQy3XDMdUVZI5brkpO0hf4V2GrqQLz5hRZfwEVy7RSdQUIjQAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAYRJREFUSA2tlC1Sw1AQxxsGw0wvgO8BUGAKMwwOAQ7HFVAYPkQxKPAcgAOgquo6CDCoYrgADlEwmPDbNC/dt3lpN0x3ZvP287+bzeZ1Ok7K87wPD+GuM8UXVgJPOYXG8GoKACQdB2DEglwFMt07aRfoO9qGfACnOn3H/mFib7MsezW2mQr406yxfz+PNfC6VhzyPTGf8BG8uyx+bVmA8Y957Tt4D/sp/GX8kdoWvEqmwCPKPvxbGZsEppzaCjv8aKaCRcCVCqpvkRNYMFLgG9h/xFnSvAAGT8chsQZedv8cAnQBmfklnNpjyfPS1AT20Q9lZl1YXsVDTZ1PTPJZVQyHt0ANnNxeI3CoUBawHZi8+IPizOCRChoEPDmrPWdvv9HtXaFjI1mAMVzDcvcEeguCnG1//yIX4B7CA6yBC59+VJ1r4wJ5APAEv7zhQmDBaNv5liR5yd7n2yRumuRzdNlbSzcYohmjv/Dt5Nb0EWNIrel8j30wzVGmwOqAQ8mywEnQPecftZg9aW8kpE4AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAWRJREFUSA2tlD8uRVEQxi/RSGxAbwEqGiTyOgWdzhZUGn8KGhW9BViASqUTBY2KxgZ0CjQafp84N3Mnc96dK2+SL2dmzpxv5s2bO02TlxVCr8Fc/kkuUsTv4BvcgoklsMQiTyeYItjKPsaydaCPQFTpM/4XF3uK/eB8rXmFVqr7z7nVMqHMWCOhnxPzCjbBal/8dF+Au9efeQbWwA54A1UZSm6JLjHWwZd11vRoKnzfOz39IzrkLHHhmGaIRRCRz+L/rCXIEtfI4W3uDLnifn+Ben4AojnGnRZ9vVZU8IYcIlam0rdxZ9QWcTy597tyFskmiMgXILEFdYhtAl+BfSTdk2t93BjyY/RW7Jx/4PW7og0MFBEfgZG5ezT64M+/vFUrLoAlLnfVs29xqbJxreu0bejiWqyWFVz4fb5EzLyL28PW3Ho5wdHpMfY90NZMSzSm4bilGV2gTTBR4pJHCbaLkTl/AC9ZkxNIGVK8AAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAaZJREFUSA2tlC9PA0EQxe+gISmpQWJQVZg6SEhROAQ4VCUahaENCRDCx8DjUBhQ/EuoAQOGL4BC0ECCOn7T3vbmhl1uIUzyujuzb95MtrOXJJGWZVkbnIFGZEocLRcesIpdgf8pgJB07ITZDi2qQKp7J20Hf1HH2K8AX6dPxJ8N9yhN076JjVzET0eN/fl3XQvXtBPYfxA/AbfgDcyBNbAM4s3T+TWxpk+BeAe8Am2lzkt5sPS1iPBkiWAczlvgEzjzi3Oqp+Id39ux0U/g9Zwy6/cpIqiFhXtsRUI+3DqQZpwVBYhYYSFthsR8cfg3kqRsWGACchfYOZap+I0NDLmNvyp31gBSSdu2If/okviok9lvjRNwbIHL8WHFhtxmUNjl5gV0Bx13FlrJScGFEt8LceWK9JzLA2mFyJyJ8C7QVppz+UNDNsNBn0yZ47om4csbOAcHOm73NRsw/hT+Iegi+MDqvi3zhud1q8Rd0jSbJefErvZ7vkDirEmWsZS5tbZP4N4E7/iev5hY2OU67JgSUnMcTo07MQWKBxKXXs3KC2xUMwvGF8VmMUNY9atnAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABGdBTUEAALGPC/xhBQAAAYVJREFUSA2tlDEvRFEQhR+2IfsHNCq9jkRspVPQqbZUqzSIxDZ+hl6nolHtIqFR0fgDKgUhUfEdyWzmTd697pOd5OTOzJ05M/v2vFdV5bZG6QXolreUVYr4HXyDEZjYAE8s8uIBUxR72ydY8Qn8ddC06RP551B7QnwfcuPwHM+2+8+5NWbC6fgg4X+SPwO34A0sgE3QA60sbn5N92KCoU/+FfhfWNs89nlyEc/EghAvEX8BG5Ak96r4oCG1ceCvDh15o0w9sbY4jQyZeJY7LWPb1wZEYhXtZMiarm4cufp/B0zjHICoY6mijent9aaFN5QQsSbZz9K5B9rYI8W+f9c3xwFDf/mHrz8+SWy9GuA36NtF5tTn4woY+XGmtvI61wsiHadMxEfAiHUmdS4ST65ivSDSseTmTY/Cb2wDWpFbk3QsuV0C/+js3s4aeYfiEpujaLWk0NfE7/kyl/O+AF+ylG6jDUg8hOQd8UvIZcMoUz2Cmo6z3QWXfsBEiW22BmxbUHL+AG1RjZPZrBdvAAAAAElFTkSuQmCC\"","import React from \"react\";\nimport { EVT_KEYDOWN, KEY_Y } from \"../../../lib\";\nimport { pageShareUrl, shareOnFacebook } from \"../../../helpers\";\nimport { shareBlack, shareWhite } from \"../../../images\";\nimport { ReaderDoc } from \"../PageContents/index\";\n\ntype Props = {\n doc: ReaderDoc;\n page_id: number;\n isDark: boolean;\n};\n\nexport default class Share extends React.Component {\n componentDidMount() {\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n share = () => {\n const { doc, page_id } = this.props;\n const page = doc.pages.filter((p) => p.id === page_id)[0];\n shareOnFacebook(pageShareUrl(doc, page));\n\n const { gtag } = window;\n gtag(\"event\", \"share\", {\n event_category: \"page\",\n event_label: `whatsapp-${doc.id}-${page_id}`,\n });\n };\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key.toUpperCase() === KEY_Y) {\n this.share();\n }\n };\n\n onClick = () => this.share();\n\n render() {\n return (\n \n );\n }\n}\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAABGdBTUEAALGPC/xhBQAAAUtJREFUOBGVk71KQ0EQhe/NRYiYQrDyEURBxBeI6RQfQlDiG9iKNlpZpdLWxxC0s7LRYGk6fyAIEcFC8fod3L1sNoPeHfjYs5OZk83OJssSoyzLJpzAk0O6mWiTZTT1II5enuqEw5Ceuahv2IgSf24xWaSgZRSNjNxkCoN5OIUv+IY4tia7ggzVM7AP76C4gBVYgzOQeadqYTMN+rADmkoDduARFH3YqBosQcECDMDHAHHnNhpxFwqrdyxH0ZVrChfdxQFYFzvWX20ofgsdnP6oCmoKjf/GqJ3C8BCSTqQ7enAn0SJ96/bPrLvw/x3pNBRqam3Q5PzUttF+avfoTePk9VI0x+/oktwqLMMxHEnXc/s9sV62HqB/2Vp9fCLWa5upkIYlePUOwXqd9KfN87yP34vx7bNJRs7g3DCyckZZkOLnFLAHeiJCuvgBex6778y4PYwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAABGdBTUEAALGPC/xhBQAAATVJREFUOBGdksFKQlEQhm/aQrGF23ZtJSGkF1AXQeFDCEa9QdtolStXrXLbYwi6a9GuomXusiiCIggq0u+HO0KH0TwOfMzc/8wM556ZJIm3HCUdGKUolhZtZ1SMA6RF2wsVYaPnTGSbTfLXnJo3R3OlddRz+IFfCG/URJtrBU6P4QNU3IMK1KALal6HqeWJdChRE9Av78MDqMEt7MFcK3E6BBUIxTdprBEfQBb+tQEZ1sS83uIEvIdF9u0d2RqY//RTZ6u68g5sBCkrfK/CFXwFZzM/9Ub3YLdRfJ1+P+IPYaE3Ii/R1KqgydnUWsQ2tTviBixt4R716bQNW9CG0zTGLWbabC2gbba8PcU38S5EWZnsV7Am5i+1wTGmDX9yCoqxjdTjwmnkaU7aX0mrcARaEaE4OwELoFcAosemXAAAAABJRU5ErkJggg==\"","import React, { Fragment } from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { Tip } from \"../../../lib\";\nimport { CircularLoader } from \"../../../lib/ui/Progress\";\nimport { eventEmitter, i18n } from \"../../../services\";\n\nimport { THEME_LOW } from \"../../../reducers/reader\";\nimport Back from \"./Back\";\nimport Download from \"./Download\";\nimport FontSize from \"./FontSize\";\nimport Theme from \"./Theme\";\nimport Share from \"./Share\";\nimport { ReaderDoc } from \"../PageContents/index\";\nimport { AppState } from \"../../../store\";\nimport { KEY_L, KEY_S, KEY_Y } from \"../../../lib/keyboard/keys\";\n\nconst Container = styled.div`\n position: fixed;\n z-index: 30;\n bottom: 2vh;\n right: 1.75vw;\n\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: flex-start;\n\n > div {\n cursor: pointer;\n margin-bottom: 13px;\n }\n\n > div:last-of-type {\n margin-bottom: 0;\n }\n\n img {\n max-width: unset;\n }\n\n @media (max-width: 1024px) {\n right: 1.25vw;\n }\n\n @media (max-width: 800px) {\n display: none;\n }\n`;\n\nconst mapState = ({ reader }: AppState) => ({\n //@ts-ignore\n theme: reader.get(\"theme\") as string,\n});\ntype StateProps = ReturnType;\ntype OwnProps = {\n theme: string;\n doc: ReaderDoc;\n page_id: number;\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n processingPDF: boolean;\n};\n\nclass Tools extends React.Component {\n constructor(props: Props) {\n super(props);\n this.state = {\n processingPDF: false,\n };\n }\n\n componentDidMount() {\n eventEmitter.on(\"pdf.processing\", this.onPDFProcessing);\n }\n\n componentWillUnmount() {\n eventEmitter.off(\"pdf.processing\", this.onPDFProcessing);\n }\n\n onPDFProcessing = (processingPDF: boolean) =>\n this.setState({ processingPDF });\n\n downloadBtn() {\n const { doc, theme } = this.props;\n const { processingPDF } = this.state;\n if (typeof doc === \"undefined\" || doc.skip_pdf) {\n return null;\n }\n\n const darkTheme = theme === THEME_LOW;\n return (\n \n {!processingPDF && (\n \n \n \n )}\n\n {processingPDF && (\n \n )}\n \n );\n }\n\n render() {\n const { doc, theme } = this.props;\n const darkTheme = theme === THEME_LOW;\n\n return (\n \n \n \n \n\n \n \n \n\n \n \n \n\n \n \n \n {this.downloadBtn()}\n \n );\n }\n}\n\nexport default connect(mapState)(Tools);\n","import React from \"react\";\nimport { navigate } from \"../../../services\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { THEME_LOW } from \"../../../reducers/reader\";\nimport { EVT_KEYDOWN, KEY_LEFT_ARROW, KEY_RIGHT_ARROW } from \"../../../lib\";\nimport { pageUrl, device } from \"../../../helpers\";\nimport { prevWhite, prevBlack, nextWhite, nextBlack } from \"../../../images\";\n\nimport { COLORS } from \"../BgColor\";\nimport { Link } from \"react-router-dom\";\nimport { ReaderDoc } from \"../PageContents/index\";\nimport { AppState } from \"../../../store\";\n\nconst Container = styled.div<{\n theme: string;\n}>`\n position: fixed;\n z-index: 30;\n display: flex;\n justify-content: space-between;\n align-items: center;\n right: 0;\n top: 0;\n width: 100%;\n height: 12vh;\n padding-bottom: 2vh;\n color: ${(p) => COLORS[p.theme][\"color\"]};\n background-color: ${(p) => COLORS[p.theme][\"bgColor\"]};\n\n @media ${device.phone} {\n height: 13vh;\n padding-bottom: 2vh;\n }\n`;\n\nconst Title = styled.div`\n user-select: none;\n font-size: 24px;\n font-weight: 700;\n white-space: nowrap;\n text-align: center;\n font-family: urdu, QuranFont, sans-serif;\n\n [lang=\"ar\"] {\n font-size: 14px;\n }\n\n @media ${device.phone} {\n margin-top: 0;\n width: 100%;\n font-size: 18px;\n }\n`;\n\nconst EmptyNav = styled.div<{\n prev?: boolean;\n}>`\n width: 20%;\n height: 18px;\n margin: ${(p) => (p.prev ? \"0 40px 0 0\" : \"0 0 0 40px\")};\n background-color: transparent;\n\n @media ${device.phone} {\n min-width: 12px;\n min-height: 18px;\n margin: ${(p) => (p.prev ? \"0 15px 0 0\" : \"0 0 0 15px\")};\n }\n`;\n\nconst Icon = styled.img`\n width: 12px;\n height: 20px;\n`;\n\nconst Nav = styled(Link)`\n user-select: none;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n align-items: center;\n width: 20%;\n text-decoration: none;\n font-family: Cairo, QuranFont, urdu;\n\n [lang=\"ar\"] {\n font-size: 15px;\n }\n`;\nconst Prev = styled(Nav)<{ theme: string }>`\n justify-content: flex-start;\n color: ${(p) => COLORS[p.theme][\"color\"]};\n margin-right: 40px;\n\n img {\n margin-left: 10px;\n }\n\n @media ${device.phone} {\n margin-right: 15px;\n\n img {\n margin-left: 0;\n }\n }\n`;\nconst Next = styled(Nav)<{ theme: string }>`\n justify-content: flex-end;\n color: ${(p) => COLORS[p.theme][\"color\"]};\n margin-left: 40px;\n\n img {\n margin-right: 10px;\n }\n\n @media ${device.phone} {\n margin-left: 15px;\n\n img {\n margin-right: 0;\n }\n }\n`;\n\nconst NavLabel = styled.div`\n display: block;\n font-size: 20px;\n font-weight: 700;\n font-family: urdu, QuranFont, sans-serif;\n\n @media ${device.phone} {\n display: none;\n }\n`;\n\nconst mapState = ({ reader }: AppState) => ({\n // @ts-ignore\n theme: reader.get(\"theme\") as string,\n});\ntype StateProps = ReturnType;\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n theme: string;\n doc: ReaderDoc;\n};\ntype Props = StateProps & OwnProps;\nclass Toolbar extends React.Component {\n componentDidMount() {\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key === KEY_RIGHT_ARROW) {\n const r = this.prev();\n if (r) {\n navigate.to(r.url);\n }\n } else if (evt.key === KEY_LEFT_ARROW) {\n const r = this.next();\n if (r) {\n navigate.to(r.url);\n }\n }\n };\n\n prev() {\n const { doc, page_id } = this.props;\n const { pages } = doc;\n const current = pages.filter((p) => p.id === page_id)[0];\n const i = pages.indexOf(current) - 1;\n\n if (!page_id || i < 0) {\n return null;\n }\n\n const page = pages[i];\n return {\n page,\n url: pageUrl(doc, page),\n };\n }\n\n next() {\n const { doc, page_id } = this.props;\n const { pages } = doc;\n const current = pages.filter((p) => p.id === page_id)[0];\n let i =\n typeof current === \"undefined\" && pages.length > 0\n ? 1\n : pages.indexOf(current) + 1;\n\n if (i >= pages.length) {\n return null;\n }\n\n const page = pages[i];\n return {\n page,\n url: pageUrl(doc, page),\n };\n }\n\n prevNav() {\n const r = this.prev();\n if (!r) {\n return ;\n }\n\n const { page, url } = r;\n\n return (\n \n \n {page.name}\n \n );\n }\n\n nextNav() {\n const r = this.next();\n if (!r) {\n return ;\n }\n\n const { page, url } = r;\n\n return (\n \n {page.name}\n \n \n );\n }\n\n pageId() {\n const {\n doc: { pages },\n page_id,\n } = this.props;\n return page_id || pages[0][\"id\"];\n }\n\n pageTitle() {\n const id = this.pageId();\n return this.props.doc.pages.filter((o) => o.id === id)[0].name;\n }\n\n render() {\n const { theme } = this.props;\n\n return (\n \n {this.prevNav()}\n {this.pageTitle()}\n {this.nextNav()}\n \n );\n }\n}\n\nexport default connect(mapState)(Toolbar);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAoCAYAAADkDTpVAAAABGdBTUEAALGPC/xhBQAAAaVJREFUSA21l78uREEUh3cREhIr8acgCqLRamnp9wHWA/ACeADREzWhlShtdCQqRCUURCMKjUYhEdd3kr3JKWbn3jtnzyS/7NmZPd9vd+7szJlaTbUsy+bRJRpX3b0Jgc6gVyTtFo32hgwF2CR6RLpd8WbYbAKkge41WcUXxIMmEwBtBQyFZ3T2J5uQvIp+QmTVd0Rct5g0AfwqYCjcTzaQRIgt9Bciq75dq8mmgnULt6wm293Iqn/DarKnYKFQprJlNTkMkVWfLIpmsgnJdXSigKFQlveaxWQAwHmIrPq+iZctJkMAZIeNtS8GlywmIwBuYg6MfaJFi8kYgIcCk3fG5ywmUwCeCkxeGJ+2mMwCeCswkbNlwmKyAOCjwOSO8UZfsotXIt/Kb4qAy0N+RrEmhUP1h0yS3zIF7vdHA+63VQAvu9mtVF5UwGW7PkWxlr5dQ/U7cID7HZnAd2Jz0hlLO/RJ9itbgK8jn8ILcJnS8aDyUpQE4GWK32M+l1b8kthGsWYu330vIJ1pCl2hrvlZ9itU/uCA+V0ClUl+jU0/sHNY5/UfBDCQw/KdliAAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAoCAYAAADkDTpVAAAABGdBTUEAALGPC/xhBQAAAZ1JREFUSA21l78uRFEQxq8/ISGxkkVBFESj1dLa3gPwALwAHkD0RE1oJUobHYkK2UooiEYUGo1CIvhNmGQ3GTk3c+5M8mX2zmS+795zZs+foui0aR7PQL0zXM3TBDSP4BtcgSFQmY3CdAuEXHHO7wGQbTUYboASt/tT4n25Cs1/yFXomHxPjsgixR8JkX3yXcBtS1R+An1ry++42f8Kl/FfCZGtXJG1hIB82XquyEYJkdVcke2EiAylDGmW7VFtTbbGpCmkOdwmbXkIlNDy0t4NtwKFveAEWOQaeyc/D9zWT6WssEpo+Tfyc24FCgfBJbDINfZKfha4bZjKFlBCyz+Tn3IrUDgG7oBFrrEH8uPAbZNUPgEltLzsLSPAbTNUvgCLXGPX5GvdbonAwtAhkkm+BzoMlpeDg2uSQ9s09I8WulSUXewWPE0ly/VRYkKzluvQDSd0y9xMDIv0vnvTDz22rPBmYQevMkfHXV7AZWUOvwcwS9u6rEmVtWhpLPv4Hn4Bkc+2rlAXxCu5QomAWOgl8FeiKPQam7VhK5n4Hz2YL+zea3pfAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAoCAYAAADkDTpVAAAABGdBTUEAALGPC/xhBQAAAbFJREFUSA21lz0vBFEUhndtssUWtqEhClGJTqhEVEh0SHQbhYo/4B+s3scPoKdX09Khkm3QUCAhIRjPiZ3krHDPzpm5JzmZmT15n3fu3Tv3o1QqKJIk2SZXC8J1YgA3SYkPcqmzmvMJ4KaQVbxxP58T+yMHtK7A+vaFh+lcJgAa5Jem/rp/4nnIZYJwkZT+DsWOFz4LVfo5FPsUy5kNEE2R0r+hOKRY8cDHET6GyNSOyaoHPorw3oCfUq954MMIbwz4OfW6Bz6A8NqAX1Hv98D7EF4Y8Bb1QQ+8F+GZAb+jPuKB1xCeGPAH6mMeeBWhDLVQPFOc8MArCOUjCcUrxRkPvIxQPu9QvFNcyAwXAcLdEJnaJ7nihW8ZcJmS11xwRD3SAK+4ax1vuGe0wt9F8hbA5U8+MEz8f3LbRIbpkWHiG6ZpXwLv9kObTDWZr5jEmyrSt8GkTsaZ7JSJTNeXZChaFLNP18ok3oKjTGTJvA01g5pvyVQm8RZ9ZRJv26JM4m28lMkcfR5n66hM4m1+lUm87bsy2fhn+OY/gCiTeEcoZdJst0QOJcvp74VeAf95jP0GfkKOyMW0rlEAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAoCAYAAADkDTpVAAAABGdBTUEAALGPC/xhBQAAAb9JREFUSA21lz0vRFEQhi+bKBQ0KIhCVKITKtmokOiQ6DYKFX/AP1j94gfQ06tpSRSoZJuloUCyEuLrfSOTnUxzNnPPnGTunXPnzvOenHu+bqXIVxpAjcCu8yE7pDrcX9gXbK3zOI+3CwzhYh/wl/Ogi2JbgUWA9zasWlakBsAPTIO1/4rYuFdkFYnsbw20/r4XvohE9rMF6voR4j0egXkksX81zPoniFc88BkkvSTgZ4j3eeBTSHpKwC8Q7/fAJ5DUSsCvEB/0wEeRdJ+A3yE+7IEPIekmAW8iPuaBDyDpMgF/RHzSA+eHOk/AnxGf9sA5xDjU7NjW9TfEZz1wTg5OEg2z/jviCx44pzWntwXq+ifiKx44cw5gGmb9b8Q3+KKn7CHJAnWdS/KWB8ycXhhh4eUQCrrV1i/VRWw9P/JxQqTUR6YIh+lpQsQ9TCnA0u1Em/t/3XcNXSqkSVzbwxY7EeFyfQuzI0rXm4i7lmsRCd1wRIRb5gNMt9z67i1TREI3fREJPbaISOjBS0SW4IQdHUUk9PArIjU4Ycd3EdmBY4cs621YVV4qew/9hZLG1eGw5fwpWZeHue8NADct9A+p7TF58TKynAAAAABJRU5ErkJggg==\"","import styled from \"styled-components\";\nimport {\n THEME_FONT_SIZE_SMALL,\n THEME_FONT_SIZE_MEDIUM,\n THEME_FONT_SIZE_LARGE,\n THEME_HIGH,\n THEME_MEDIUM,\n THEME_LOW,\n} from \"../../../reducers\";\n\nexport const SIZE: Record> = {\n [THEME_FONT_SIZE_SMALL]: {\n fontSize: \"18px\",\n fontSizeQuran: \"26px\",\n },\n [THEME_FONT_SIZE_MEDIUM]: {\n fontSize: \"21px\",\n fontSizeQuran: \"30px\",\n },\n [THEME_FONT_SIZE_LARGE]: {\n fontSize: \"24px\",\n fontSizeQuran: \"36px\",\n },\n};\n\nexport const THEME: Record>> = {\n [THEME_HIGH]: {\n text: {\n color: \"#000\",\n },\n code: {\n color: \"#000\",\n bgColor: \"#ffeb6a\",\n borderColor: \"#ffb106\",\n },\n blockQuote: {\n color: \"#ffb106\",\n bgColor: \"#371b0e\",\n },\n a: {\n color: \"#ffb106\",\n hoverColor: \"#ff7b11\",\n focusColor: \"#371b0e\",\n focusBgColor: \"#ffb106\",\n },\n },\n [THEME_MEDIUM]: {\n text: {\n color: \"#000\",\n },\n code: {\n color: \"#000\",\n bgColor: \"#bebebe\",\n borderColor: \"#989898\",\n },\n blockQuote: {\n color: \"#555555\",\n bgColor: \"#dcdcdc\",\n },\n a: {\n color: \"#4d8cf5\",\n hoverColor: \"#0068f5\",\n focusColor: \"#fff\",\n focusBgColor: \"#4d8cf5\",\n },\n },\n [THEME_LOW]: {\n text: {\n color: \"#fff\",\n },\n code: {\n color: \"#fff\",\n bgColor: \"#353839\",\n borderColor: \"#3f3f3f\",\n },\n blockQuote: {\n color: \"#fff\",\n bgColor: \"#3c3f40\",\n },\n a: {\n color: \"#4d8cf5\",\n hoverColor: \"#0068f5\",\n focusColor: \"#fff\",\n focusBgColor: \"#4d8cf5\",\n },\n },\n};\n\nexport const Container = styled.div`\n z-index: 1;\n position: relative;\n`;\n\nexport const Generic = styled.div<{\n size: string;\n theme: string;\n}>`\n z-index: 1;\n font-family: urdu, sans-serif;\n font-weight: 500;\n line-height: 200%;\n font-size: ${(p) => SIZE[p.size][\"fontSize\"]};\n color: ${(p) => THEME[p.theme][\"text\"][\"color\"]};\n\n padding: 15vh 5vw 8vh 5vw;\n overflow: hidden;\n overflow-y: auto;\n\n p:first-child {\n margin-top: 0;\n }\n\n @media (max-width: 1400px) {\n }\n @media (max-width: 1024px) {\n }\n\n @media (max-width: 600px) {\n column-count: 1;\n position: relative;\n left: auto;\n top: auto;\n right: auto;\n bottom: auto;\n width: 95%;\n margin: 100px auto 0 auto;\n\n overflow: auto;\n }\n\n span[text=\"ﷺ\"],\n span[text=\"ؓ\"],\n span[text=\"ؑ\"] {\n font-size: 13px;\n }\n\n [lang=\"ar\"],\n .quran-ayat {\n font-size: ${(p) => SIZE[p.size][\"fontSizeQuran\"]};\n }\n\n div,\n span {\n font-weight: 500;\n font-family: urdu, sans-serif;\n }\n\n ul > li {\n list-style-type: circle;\n }\n\n ol {\n list-style: arabic-indic;\n }\n\n img {\n cursor: pointer;\n max-width: 100%;\n }\n\n blockquote {\n margin: 40px 0;\n padding: 10px 20px;\n color: ${(p) => THEME[p.theme][\"blockQuote\"][\"color\"]};\n background-color: ${(p) => THEME[p.theme][\"blockQuote\"][\"bgColor\"]};\n\n * {\n font-weight: 500;\n }\n }\n\n code {\n display: block;\n direction: ltr;\n margin: 20px 0;\n padding: 15px 0 15px 15px;\n border-left: 4px solid ${(p) => THEME[p.theme][\"code\"][\"borderColor\"]};\n width: 100%;\n font-size: 15px;\n text-align: left;\n line-height: 150%;\n font-family: \"Source Code Pro\", monospace;\n color: ${(p) => THEME[p.theme][\"code\"][\"color\"]};\n background-color: ${(p) => THEME[p.theme][\"code\"][\"bgColor\"]};\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin: 0 0 15px 0;\n font-weight: 700 !important;\n font-family: urdu, sans-serif;\n }\n h1 span,\n h2 span,\n h3 span,\n h4 span,\n h5 span,\n h6 span {\n font-family: urdu, sans-serif !important;\n }\n\n strong,\n b {\n font-weight: 700;\n }\n\n h1 {\n font-size: 30px;\n }\n\n h2 {\n font-size: 27px;\n }\n\n h3 {\n font-size: 24px;\n }\n\n h4 {\n font-size: 21px;\n }\n\n h5 {\n font-size: 18px;\n }\n\n h6 {\n font-size: 15px;\n }\n\n a {\n display: inline-block;\n color: ${(p) => THEME[p.theme][\"a\"][\"color\"]};\n text-decoration: none;\n\n &:hover,\n &:focus {\n outline: none;\n color: ${(p) => THEME[p.theme][\"a\"][\"hoverColor\"]};\n }\n\n img {\n background-color: #f00;\n }\n }\n\n .ltr-text {\n direction: ltr;\n font-family: Roboto, sans-serif;\n font-size: 17px;\n }\n\n .rtl-text {\n direction: rtl;\n }\n`;\n\nexport const Poetry = styled(Generic)`\n overflow-x: hidden;\n overflow-y: auto;\n\n text-align: center;\n column-count: unset;\n column-fill: unset;\n column-width: unset;\n\n @media (max-width: 600px) {\n margin-top: 110px;\n }\n`;\n","import React from \"react\";\nimport styled from \"styled-components\";\n// import { Books } from 'models'\nimport { publishedDate, fixArabicText, getMetaValue } from \"../../../helpers\";\nimport { ReaderDoc } from \"../PageContents\";\nimport { THEME } from \"../PageContents/styles\";\n\nconst Container = styled.div<{ theme: string }>`\n user-select: none;\n display: flex;\n flex-direction: row;\n justify-content: flex-start;\n align-content: center;\n background-color: ${(p) => THEME[p.theme][\"code\"][\"borderColor\"]};\n`;\n/*const Preview = styled.div`\n padding: 10px 10px 12px 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 140px;\n`\n\nconst Cover = styled.img`\n width: 100%;\n`*/\n\nconst Info = styled.div<{ theme: string }>`\n display: flex;\n flex-direction: column;\n margin-top: 10px;\n margin-right: 10px;\n color: ${(p) => THEME[p.theme][\"text\"][\"color\"]};\n`;\n\nconst Mark = styled.div``;\n\nconst Indent = styled.div`\n position: relative;\n margin-right: 30px;\n\n &:before {\n display: block;\n position: absolute;\n content: \"\\u2022\";\n right: -18px;\n top: 1px;\n }\n`;\n\nconst Name = styled.div`\n font-size: 30px;\n font-family: urdu, sans-serif;\n font-weight: 700;\n white-space: pre-wrap;\n\n [lang=\"ar\"] {\n font-size: 10px;\n }\n`;\n\nconst Authors = styled(Indent)`\n margin-top: 8px;\n font-size: 16px;\n font-family: urdu;\n font-weight: 500;\n white-space: pre-wrap;\n`;\n\nconst PublishedOn = styled(Indent)`\n margin-top: 4px;\n font-size: 14px;\n font-family: urdu;\n font-weight: 500;\n`;\n\nconst Intro = styled.div`\n font-size: 16px;\n white-space: pre-wrap;\n margin: 13px 0;\n font-weight: 500;\n`;\n\ntype Props = {\n theme: string;\n doc: ReaderDoc;\n};\n\nexport default class Header extends React.Component {\n render() {\n const { theme, doc } = this.props;\n const { doc_meta } = doc;\n // const coverImg = Books.url('GET', `${doc.id}/cover`)\n const authors = getMetaValue(doc_meta, \"authors\");\n const intro = getMetaValue(doc_meta, \"intro\")!;\n\n return (\n \n {/*\n \n */}\n\n \n \n \n {authors}\n \n {publishedDate(new Date(doc.updated_at))}\n \n \n \n \n \n );\n }\n}\n","import styled from \"styled-components\";\nimport { THEME } from \"../PageContents/styles\";\n\nexport const Container = styled.div``;\n\nexport const List = styled.div<{\n open: boolean;\n}>`\n visibility: ${(p) => (p.open ? \"visible\" : \"hidden\")};\n z-index: 15;\n position: fixed;\n top: 15vh;\n width: 40vw;\n margin-right: -20vw;\n max-height: 75vh;\n overflow-x: hidden;\n overflow-y: auto;\n text-align: right;\n color: ${(p) => THEME[p.theme][\"code\"][\"color\"]};\n background-color: ${(p) => THEME[p.theme][\"code\"][\"bgColor\"]};\n border: 3px solid ${(p) => THEME[p.theme][\"code\"][\"borderColor\"]};\n border-radius: 0;\n white-space: nowrap;\n\n @media (max-width: 600px) {\n width: 90vw;\n right: 5vw;\n margin-right: 0;\n }\n`;\n\nexport const Item = styled.div<{\n darkTheme: boolean;\n active: boolean;\n primary: boolean;\n}>`\n display: flex;\n flex-direction: row;\n cursor: ${(p) => {\n return p.active ? \"default\" : \"pointer\";\n }};\n user-select: none;\n padding: 5px 30px 5px 5px;\n border-bottom: 1px solid ${(p) => THEME[p.theme][\"code\"][\"borderColor\"]};\n color: ${(p) => {\n if (p.primary) {\n return THEME[p.theme][\"a\"][\"color\"];\n }\n\n if (p.active) {\n return THEME[p.theme][\"blockQuote\"][\"color\"];\n }\n\n return THEME[p.theme][\"text\"][\"color\"];\n }};\n\n background-color: ${(p) => {\n if (p.active) {\n return THEME[p.theme][\"blockQuote\"][\"bgColor\"];\n }\n\n return \"transparent\";\n }};\n\n &:first-child {\n padding-top: 5px;\n }\n\n &:last-child {\n border-bottom: 0;\n padding-bottom: 5px;\n }\n\n &:hover {\n color: ${(p) => {\n if (p.primary) {\n return THEME[p.theme][\"a\"][\"color\"];\n }\n\n return THEME[p.theme][\"blockQuote\"][\"color\"];\n }};\n background-color: ${(p) => THEME[p.theme][\"blockQuote\"][\"bgColor\"]};\n }\n\n [lang=\"ar\"] {\n font-size: 15px;\n }\n`;\n\nexport const Text = styled.div<{\n indent: number;\n}>`\n position: relative;\n margin-right: ${(p) => p.indent * 40}px;\n font-weight: 500;\n font-size: 16px;\n\n &:before {\n display: ${(p) => (p.indent === 0 ? \"none\" : \"block\")};\n position: absolute;\n content: \"\\u2022\";\n right: -18px;\n top: 1px;\n }\n`;\n","const MAX_CHAPTERS = 100;\n\nexport function truncateTOC(\n pages: Array<{\n id: number;\n parent_id: number;\n _indent: number;\n }>\n) {\n if (pages.length <= MAX_CHAPTERS) {\n const index: Record = {};\n for (let i = 0; i < pages.length; i++) {\n const p = pages[i];\n if (p.parent_id === 0) {\n index[p.id] = 0;\n } else {\n index[p.id] = index[p.parent_id] + 1;\n }\n\n pages[i]._indent = index[p.id];\n }\n\n return pages;\n }\n\n return pages.filter((i) => i.parent_id === 0);\n}\n\nexport function isTOCIndented(\n pages: Array<{\n parent_id: number;\n }>\n) {\n for (let i = 0; i < pages.length; i += 1) {\n if (pages[i].parent_id > 0) {\n return true;\n }\n }\n\n return false;\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport styled from \"styled-components\";\nimport { fixArabicText, pageUrl } from \"../../../helpers\";\nimport { i18n, navigate } from \"../../../services\";\nimport {\n Tip,\n EVT_KEYDOWN,\n KEY_DOWN_ARROW,\n KEY_ENTER,\n KEY_ESC,\n KEY_T,\n KEY_UP_ARROW,\n} from \"../../../lib\";\nimport { THEME_LOW } from \"../../../reducers/reader\";\nimport { menuBlack, menuWhite } from \"../../../images\";\n\nimport Header from \"./Header\";\nimport { Container, Item, List, Text } from \"./styles\";\nimport { truncateTOC } from \"../../../helpers/toc\";\nimport { ReaderDoc } from \"../PageContents/index\";\nimport { AppState } from \"../../../store\";\nimport { Page } from \"../../../pages/BookPage/TableOfContents\";\n\nconst MenuIconContainer = styled.div`\n position: fixed;\n left: 50%;\n top: 9vh;\n margin-left: -11px;\n z-index: 30;\n cursor: pointer;\n`;\n\nconst Icon = styled.img`\n width: 21px;\n height: 14px;\n`;\n\nconst mapState = ({ reader }: AppState) => ({\n // @ts-ignore\n theme: reader.get(\"theme\") as string,\n});\ntype StateProps = ReturnType;\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n doc: ReaderDoc;\n theme: string;\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n show: boolean;\n index: number;\n open: boolean;\n width: number;\n};\n\nclass TableOfContents extends React.Component {\n private elmList: React.RefObject | null;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n open: false,\n width: 0,\n show: false,\n index: this.getIndex(props),\n };\n\n this.elmList = React.createRef();\n }\n\n componentDidMount() {\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillUnmount() {\n this.elmList = null;\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n }\n\n componentWillReceiveProps(nextProps: Props) {\n this.setState({\n index: this.getIndex(nextProps),\n });\n }\n\n close = () => this.setState({ open: false });\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key.toUpperCase() === KEY_T) {\n this.onToggle();\n } else if (this.state.open) {\n switch (evt.key) {\n case KEY_ESC:\n this.close();\n break;\n\n case KEY_UP_ARROW:\n this.onUpArrow();\n break;\n\n case KEY_DOWN_ARROW:\n this.onDownArrow();\n break;\n\n case KEY_ENTER:\n this.close();\n\n const page = this.props.doc.pages[this.state.index];\n navigate.to(pageUrl(this.props.doc, page));\n break;\n }\n\n if ([KEY_UP_ARROW, KEY_DOWN_ARROW, KEY_ENTER].includes(evt.key)) {\n evt.preventDefault();\n return false;\n }\n }\n };\n\n getIndex({ page_id, doc: { pages } }: Props) {\n if (isNaN(page_id)) {\n return 0;\n }\n\n let index = -1;\n pages.forEach((p, i) => {\n if (p.id === page_id) {\n index = i;\n }\n });\n\n return index;\n }\n\n onToggle = () =>\n this.setState(\n {\n open: !this.state.open,\n index: this.getIndex(this.props),\n },\n () => {\n setTimeout(() => this.scrollToActiveTOC(), 250);\n }\n );\n\n scrollToActiveTOC = () => {\n if (!this.elmList) {\n return;\n }\n\n const elm = document.getElementById(`toc-item-${this.activePageId()}`);\n if (elm) {\n elm.scrollIntoView();\n }\n };\n\n onDownArrow = () => {\n const {\n doc: { pages },\n } = this.props;\n const { index } = this.state;\n this.setState({\n index: index + 1 < pages.length ? index + 1 : 0,\n });\n };\n\n onUpArrow = () => {\n const {\n doc: { pages },\n } = this.props;\n const { index } = this.state;\n this.setState({\n index: index - 1 >= 0 ? index - 1 : pages.length - 1,\n });\n };\n\n goToPage = (p: Pick) => {\n this.setState({ open: false });\n navigate.to(pageUrl(this.props.doc, p));\n };\n\n activePageId() {\n const { index } = this.state;\n\n if (index <= 0) {\n return -1;\n }\n\n return this.props.doc.pages[index].id;\n }\n\n findIndentAmount(\n list: Array<{\n _indent: number;\n id: number;\n parent_id: number;\n }>,\n parentId: number,\n indent: number\n ) {\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item.id === parentId) {\n return item._indent + 1;\n }\n }\n\n return indent;\n }\n\n list() {\n const { theme, doc, page_id } = this.props;\n const activeId = this.activePageId();\n const darkTheme = theme === THEME_LOW;\n const list = truncateTOC(doc.pages) as Array<{\n _indent: number;\n id: number;\n parent_id: number;\n name: string;\n position: number;\n }>;\n\n list.map((i) => (i._indent = i.parent_id === 0 ? 0 : 1));\n\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item.parent_id > 0) {\n item._indent = this.findIndentAmount(list, item.parent_id, 1);\n }\n }\n\n return list.map((i) => (\n this.goToPage(i)}\n primary={isNaN(page_id) ? i.position === 1 : i.id === page_id}\n >\n \n \n ));\n }\n\n render() {\n const { theme } = this.props;\n const darkTheme = theme === THEME_LOW;\n\n return (\n \n \n \n \n \n \n \n
\n {this.list()}\n \n \n );\n }\n}\n\nexport default connect(mapState)(TableOfContents);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAYAAAAX4C3rAAAABGdBTUEAALGPC/xhBQAAAGlJREFUWAntlbENwCAMBDHKXmFT2JTYKZjgC146V66s833xsXOawXQDxh8RUHVSNkaf/Hyov+ceBjBwsYHIBp0X8x20AqXrjw7BYtNMNqBVoUuQDCcwgAEXA9VMrwMsFapOyaaZAFVH/wE3dhPQx7TvaAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAcCAYAAAAX4C3rAAAABGdBTUEAALGPC/xhBQAAAGlJREFUWAntlsEJACEMBKPYl6Vqp3cRxAr2kYURBF9hMqvEFhFf7vKrlye8gICqk7Ix2rLzqe6eehjAQGED59WvwnwP7YAy658OwcFmMtmAjkxlC5KhBAYw4GLA5uPMCFVfKZvJBKg6+h8G5gTbY9qjZwAAAABJRU5ErkJggg==\"","export default __webpack_public_path__ + \"static/media/share-with-friends.94179e74.png\";","import React from \"react\";\nimport styled from \"styled-components\";\nimport src from \"./images/share-with-friends.png\";\nimport { device } from \"../../../helpers/style\";\n// import { Books } from '../../../models'\n// import { fixArabicText } from '../../../helpers/text'\n// import { Doc } from \"../../../models/index\";\n\nexport const Container = styled.div`\n /*margin: 90px auto 0 auto;*/\n margin: 0 auto;\n display: none;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n @media ${device.phone} {\n display: flex;\n } ;\n`;\n/*const Cover = styled.img`\n cursor: pointer;\n width: 60%;\n border-radius: 4px;\n`\nconst Title = styled.div`\n margin: 10px 0 30px 0;\n padding: 0;\n text-align: center;\n font-size: 20px;\n font-weight: 700 !important;\n font-family: urdu, QuranFont, sans-serif;\n\n [lang='ar'] {\n font-size: 18px;\n }\n`*/\n\nconst s = 0.8;\nconst w = 313 * s;\nconst h = 124 * s;\nconst ShareOnFB = styled.img`\n width: ${w}px;\n height: ${h}px;\n`;\n\ntype Props = {\n counter: number;\n doc: { id: number };\n onClick: (evt: React.MouseEvent) => void;\n};\n\nexport default function ShareWithFriends({ counter, doc, onClick }: Props) {\n // if (counter % 3 !== 0) {\n // return null\n // }\n\n // const coverImg = Books.url('GET', `${doc.id}/cover`)\n return (\n \n {/**/}\n {/**/}\n <ShareOnFB src={src} alt=\"دوستوں کے ساتھ شئیر کریں\" />\n </Container>\n );\n}\n","export function scrollPercentage() {\n const h = document.documentElement,\n b = document.body,\n st = \"scrollTop\",\n sh = \"scrollHeight\";\n\n const r = ((h[st] || b[st]) / ((h[sh] || b[sh]) - h.clientHeight)) * 100;\n if (isNaN(r)) {\n return 0;\n }\n\n return r;\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { scrollPercentage } from \"../../../lib/dom/scroll\";\nimport { device } from \"../../../helpers/style\";\n\nconst Container = styled.div`\n z-index: 10000;\n position: fixed;\n display: none;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 5px;\n background-color: #dcdcdc;\n\n @media ${device.phone} {\n display: block;\n }\n`;\nconst Amount = styled.div<{ percentage: number }>`\n width: ${(p) => p.percentage}%;\n height: 1px;\n border-top: 5px solid #34a962;\n transition: all 0.1s linear;\n`;\n\nexport default class PercentageRead extends React.Component {\n state = {\n percentage: scrollPercentage(),\n };\n\n componentDidMount() {\n window.addEventListener(\"scroll\", this.onScroll);\n }\n\n componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.onScroll);\n }\n\n onScroll = () => {\n this.setState({ percentage: scrollPercentage() });\n };\n\n render() {\n return (\n <Container>\n <Amount percentage={this.state.percentage} />\n </Container>\n );\n }\n}\n","import { fixArabicFont } from \"../../../helpers\";\n\nexport function transformContents(contents: string) {\n contents = fixArabicFont(contents);\n return contents;\n}\n","export default __webpack_public_path__ + \"static/media/become-an-author.70635ba7.png\";","import styled from 'styled-components';\nimport { device } from '../../../helpers/style';\nimport src from './images/become-an-author.png';\n\nexport const Container = styled.div`\n margin: 40px auto 60px auto;\n display: none;\n flex-direction: row;\n justify-content: center;\n\n @media ${device.phone} {\n display: flex;\n }\n`;\n\nconst s = 0.8;\nconst w = 315 * s;\nconst h = 126 * s;\nconst Img = styled.img`\n width: ${w}px;\n height: ${h}px;\n`;\n\nfunction onClick() {\n window.location.assign('/app/login?tab=register');\n}\n\nexport default function Invite({ counter }: { counter: number }) {\n // if (counter === 0 || counter % 5 !== 0) {\n // return null\n // }\n\n return (\n <Container>\n <Img src={src} alt=\"مصنف بنئے\" onClick={onClick} />\n </Container>\n );\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Container, Generic, Poetry } from \"./styles\";\nimport ShareWithFriends from \"./social\";\n\nimport { Books } from \"../../../models\";\nimport { EVT_CLICK, EVT_SCROLL } from \"../../../lib\";\nimport { DocMeta, setWindowTitle, shareOnFacebook } from \"../../../helpers\";\nimport AmountRead from \"./AmountRead\";\nimport { transformContents } from \"./helpers\";\nimport { eventEmitter } from \"../../../services\";\nimport { scrollToTop } from \"../../../lib/dom\";\nimport { isLoggedIn, isMobile, pageShareUrl } from \"../../../helpers\";\nimport { scrollPercentage } from \"../../../lib/dom/scroll\";\nimport Invite from \"./Invite\";\nimport { AppState } from \"../../../store\";\nimport { Page } from \"../../../pages/BookPage/TableOfContents\";\nimport { AxiosResponse } from \"axios\";\n\nconst TYPE_POETRY = \"POETRY\";\n\nconst mapState = ({ user, reader }: AppState) => ({\n user,\n //@ts-ignore\n size: reader.get(\"size\") as string,\n //@ts-ignore\n theme: reader.get(\"theme\") as string,\n});\n\ntype StateProps = ReturnType<typeof mapState>;\n\nexport type ReaderDoc = {\n id: number;\n name: string;\n skip_pdf: boolean;\n type: string;\n visibility: string;\n updated_at: string;\n\n pages: Page[];\n doc_meta: DocMeta[];\n};\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n doc: ReaderDoc;\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n counter: number;\n contents: string;\n};\n\nclass PageContents extends React.Component<Props, State> {\n private elText: React.RefObject<HTMLDivElement>;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n counter: -1,\n contents: \"\",\n };\n\n this.elText = React.createRef<HTMLDivElement>();\n }\n\n pageId() {\n const {\n doc: { pages },\n page_id,\n } = this.props;\n return page_id || pages[0][\"id\"];\n }\n\n async componentDidMount() {\n await this.fetch();\n window.addEventListener(EVT_CLICK, this.onImgClick);\n window.addEventListener(EVT_SCROLL, this.onScroll);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_CLICK, this.onImgClick);\n window.removeEventListener(EVT_SCROLL, this.onScroll);\n }\n\n async componentDidUpdate(prevProps: Props) {\n if (this.props.page_id !== prevProps.page_id) {\n await this.fetch();\n }\n }\n\n sendingScroll = false;\n pendingScrollEvt = false;\n onScroll = () => {\n if (this.sendingScroll) {\n this.pendingScrollEvt = true;\n return;\n }\n\n this.sendingScroll = true;\n this.sendScrollEvt();\n\n setTimeout(() => {\n this.sendingScroll = false;\n if (this.pendingScrollEvt) {\n this.sendScrollEvt();\n this.pendingScrollEvt = false;\n }\n }, 2 * 1000);\n };\n\n sendScrollEvt() {\n const value = scrollPercentage().toFixed(0);\n const event_label = `${this.currentPage().id}-${value}`;\n\n const { gtag } = window;\n gtag(\"event\", \"scroll\", {\n event_label,\n event_category: \"v-pos\",\n });\n }\n\n onImgClick = (evt: MouseEvent) => {\n if (isMobile()) {\n return;\n }\n\n const elm = evt.target as HTMLElement;\n if (!elm) {\n return;\n }\n\n if (elm.parentNode && elm.parentNode.nodeName === \"A\") {\n return;\n }\n\n if (\n elm.nodeName.toLowerCase() === \"img\" &&\n (elm as HTMLImageElement).naturalWidth >= 250\n ) {\n eventEmitter.emit(\n \"pageContents.showImg\",\n (elm as HTMLImageElement).src\n );\n }\n };\n\n scrollToStart = () => {\n scrollToTop(window);\n };\n\n fetching = false;\n async fetch() {\n try {\n if (this.fetching) {\n return;\n }\n\n this.fetching = true;\n\n const {\n doc_id,\n doc: { pages },\n } = this.props;\n const page_id = this.pageId();\n\n const { data }: AxiosResponse<string> = await Books.fetch(\n `${doc_id}/contents/${page_id}`\n );\n\n const name = pages.filter((p) => p.id === page_id)[0][\"name\"];\n const contents = transformContents(data);\n\n const { counter } = this.state;\n this.setState({ contents, counter: counter + 1 }, () => {\n this.scrollToStart();\n });\n\n this.fetching = false;\n setWindowTitle(`${name} - ${this.props.doc.name}`);\n } catch (e) {\n this.setState({ contents: \"\" }, this.scrollToStart);\n this.fetching = false;\n\n console.warn(\"fetch contents\", e);\n }\n }\n\n html() {\n return {\n __html: this.state.contents,\n };\n }\n\n currentPage() {\n const { doc, page_id } = this.props;\n return doc.pages.filter((p) => p.id === page_id)[0];\n }\n\n getShareUrl() {\n const { doc } = this.props;\n return pageShareUrl(doc, this.currentPage());\n }\n\n logShareEvent(type: string) {\n const { doc, page_id } = this.props;\n const { gtag } = window;\n gtag(\"event\", \"share\", {\n event_category: \"page\",\n event_label: `${type}-${doc.id}-${page_id}`,\n });\n }\n\n onWhatsAppShare = (evt: React.MouseEvent<HTMLDivElement>) => {\n evt.preventDefault();\n evt.stopPropagation();\n\n this.logShareEvent(\"facebook\");\n shareOnFacebook(this.getShareUrl());\n return false;\n };\n\n share() {\n if (!this.elText || !this.elText.current) {\n return null;\n }\n\n return (\n <ShareWithFriends\n doc={this.props.doc}\n counter={this.state.counter}\n onClick={this.onWhatsAppShare}\n />\n );\n }\n\n invite() {\n if (isLoggedIn(this.props.user)) {\n return null;\n }\n\n return <Invite counter={this.state.counter} />;\n }\n\n render() {\n const {\n size,\n theme,\n doc: { type, visibility },\n } = this.props;\n\n const isPublic = visibility === \"PUBLIC\";\n\n if (type === TYPE_POETRY) {\n return (\n <Container>\n <Poetry\n ref={this.elText}\n size={size}\n theme={theme}\n dangerouslySetInnerHTML={this.html()}\n />\n {isPublic && this.share()}\n {isPublic && this.invite()}\n <AmountRead />\n </Container>\n );\n }\n\n return (\n <Container>\n <Generic\n ref={this.elText}\n size={size}\n theme={theme}\n dangerouslySetInnerHTML={this.html()}\n />\n {isPublic && this.share()}\n {isPublic && this.invite()}\n <AmountRead />\n </Container>\n );\n }\n}\n\nexport default connect(mapState)(PageContents);\n","// this.elText\nexport function scrollToTop(el: Window) {\n if (!el) {\n return;\n }\n\n el.scrollTo({\n top: 0,\n });\n}\n\nexport function scrollToRight(el: Window) {\n if (!el) {\n return;\n }\n\n el.scrollTo({\n left: 1000 * 1000,\n });\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { eventEmitter } from \"../../../services\";\nimport { EVT_KEYDOWN } from \"../../../lib/events\";\nimport { KEY_ESC } from \"../../../lib/keyboard\";\n\nconst Container = styled.div`\n z-index: 100;\n position: fixed;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n`;\nconst Overlay = styled.div`\n z-index: 10;\n position: fixed;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background-color: #000;\n opacity: 0.5;\n`;\n\nconst Image = styled.img`\n z-index: 1000;\n padding: 20px;\n max-width: 95%;\n max-height: 90%;\n background-color: #fff;\n`;\n\ntype Props = {};\ntype State = {\n src: string;\n show: boolean;\n};\n\nexport default class Preview extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n src: \"\",\n show: false,\n };\n }\n\n componentDidMount() {\n eventEmitter.on(\"pageContents.showImg\", this.onShow);\n window.addEventListener(EVT_KEYDOWN, this.onKeyDown);\n }\n\n componentWillUnmount() {\n eventEmitter.off(\"pageContents.showImg\", this.onShow);\n window.removeEventListener(EVT_KEYDOWN, this.onKeyDown);\n }\n\n onShow = (src: string) => {\n this.setState({\n src,\n show: true,\n });\n };\n\n onHide = () => this.setState({ src: \"\", show: false });\n\n onKeyDown = (evt: KeyboardEvent) => {\n if (evt.key === KEY_ESC) {\n this.onHide();\n }\n };\n\n onClick = (evt: React.MouseEvent<HTMLElement>) => {\n if ((evt.target as HTMLElement).nodeName !== \"img\") {\n this.onHide();\n }\n };\n\n render() {\n if (!this.state.show) {\n return null;\n }\n\n return (\n <Container onClick={this.onClick}>\n <Overlay />\n <Image src={this.state.src} />\n </Container>\n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport { Progress } from \"../../lib\";\n\nimport BgColor from \"../../components/Reader/BgColor\";\nimport Tools from \"../../components/Reader/Tools\";\nimport Toolbar from \"../../components/Reader/Toolbar\";\nimport TableOfContents from \"../../components/Reader/TableOfContents\";\nimport PageContents from \"../../components/Reader/PageContents\";\nimport Preview from \"../../components/Reader/Preview\";\n\nimport { Books } from \"../../models\";\nimport { device } from \"../../helpers\";\nimport { ReaderDoc } from \"../../components/Reader\";\nimport { Page } from \"../BookPage/TableOfContents\";\nimport { AxiosResponse } from \"axios\";\nimport { AppState } from \"../../store\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n position: relative;\n\n @media ${device.phone} {\n padding-bottom: 50px;\n }\n`;\n\nconst mapStateToProps = (\n _: AppState,\n {\n match: {\n params: { doc_id, page_id },\n },\n }: OwnProps\n) => ({\n doc_id: parseInt(doc_id),\n page_id: parseInt(page_id),\n});\ntype StateProps = ReturnType<typeof mapStateToProps>;\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n match: {\n params: {\n doc_id: string;\n page_id: string;\n };\n };\n};\ntype Props = StateProps & OwnProps;\ntype State = {\n loaded: boolean;\n doc: ReaderDoc | null;\n pages: Array<Page> | null;\n};\n\nclass ReaderPage extends React.Component<Props, State> {\n static paths = [\n \"/app/r-:doc_id-:page_id/\",\n \"/app/r-:doc_id-:page_id/:doc_name/:page_name\",\n \"/app/r-:doc_id-:page_id/:slug\",\n ];\n static requiresAuth = false;\n\n constructor(props: Props) {\n super(props);\n this.fetchDoc = this.fetchDoc.bind(this);\n\n this.state = {\n loaded: false,\n doc: null,\n pages: null,\n };\n }\n\n async componentDidMount() {\n await this.fetchDoc();\n }\n\n fetchDoc = async () => {\n try {\n const { doc_id } = this.props;\n const { data: doc }: AxiosResponse<ReaderDoc> = await Books.fetch(\n doc_id\n );\n this.setState({ doc, loaded: true });\n } catch (e) {\n console.warn(\"failed fetchDoc\");\n console.warn(e);\n }\n };\n\n render() {\n if (!this.state.loaded) {\n return <Progress />;\n }\n\n const { doc_id, page_id } = this.props;\n const { doc } = this.state;\n\n if (!doc) {\n return null;\n }\n\n const props = {\n doc_id,\n page_id,\n doc,\n };\n\n return (\n <Container>\n <BgColor />\n <Toolbar {...props} />\n <TableOfContents {...props} />\n <Tools {...props} />\n <Preview />\n <PageContents {...props} />\n </Container>\n );\n }\n}\n\nexport default connect(mapStateToProps)(ReaderPage);\n","import React from \"react\";\n// import \"./styles.css\";\n\ntype Props = {};\ntype State = {\n doc: null;\n pages: null;\n};\n\nexport class PDFDownload extends React.Component<Props, State> {\n static paths = [\"/app/pdf/:doc_id\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n doc: null,\n pages: null,\n };\n }\n\n async componentDidMount() {\n await this.fetch();\n }\n\n async fetch() {}\n\n render() {\n return <div>show pdf</div>;\n }\n}\n","import React from \"react\";\nimport { Content } from \"../../pages/Template\";\nimport { Tag } from \"../../models\";\nimport { NoResults, Results } from \"../../components/Results\";\nimport { Book } from \"../../components\";\nimport { navigate } from \"../../services\";\nimport { DocMeta, docUrl, setWindowTitle } from \"../../helpers\";\nimport Tags from \"../../components/Tags\";\nimport { AxiosResponse } from \"axios\";\n\nfunction tagId(props: Props) {\n return parseInt(props.match.params.tag_id);\n}\n\nfunction tagName(props: Props) {\n return props.match.params.tag_name.replace(\"-\", \" \");\n}\n\ntype Props = {\n match: {\n params: {\n tag_id: string;\n tag_name: string;\n };\n };\n};\ninterface TagBook {\n id: number;\n name: string;\n updated_at: string;\n doc_meta: Array<DocMeta>;\n}\ntype State = {\n list: Array<TagBook>;\n stats: {\n offset: number;\n limit: number;\n total: number;\n };\n};\nexport class TagPage extends React.Component<Props, State> {\n static paths = [\"/app/t-:tag_id-:tag_name\"];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n list: [],\n stats: {\n offset: 0,\n limit: 0,\n total: 0,\n },\n };\n }\n\n async componentDidMount() {\n setWindowTitle(tagName(this.props));\n await this.fetch(tagId(this.props));\n }\n\n async componentDidUpdate(\n prevProps: Props,\n prevState: State,\n snapshot: any\n ) {\n if (tagId(this.props) !== tagId(prevProps)) {\n await this.fetch(tagId(this.props));\n setWindowTitle(tagName(this.props));\n }\n }\n\n loading = false;\n async fetch(tagId: number, concat = false) {\n if (this.loading) {\n return;\n }\n\n this.loading = true;\n\n try {\n const { offset, limit } = this.state.stats;\n const params = [\n \"includeMeta=true\",\n \"includesPages=false\",\n `tag_id=${tagId}`,\n `offset=${concat ? offset + limit : 0}`,\n ];\n const {\n data: { list, stats },\n }: AxiosResponse<{\n list: Array<TagBook>;\n stats: {\n offset: number;\n limit: number;\n total: number;\n };\n }> = await Tag.fetch(\"books\", {\n url: params.join(\"&\"),\n });\n\n this.setState({\n stats,\n list: concat ? this.state.list.concat(list) : list,\n });\n this.loading = false;\n } catch (e) {\n console.warn(e);\n }\n }\n\n onMore = async () => {\n await this.fetch(tagId(this.props), true);\n };\n\n render() {\n const { list, stats } = this.state;\n if (list.length === 0) {\n return <NoResults message=\"results.tagsNone\" />;\n }\n\n const enableMore = stats.total > stats.offset + stats.limit;\n return (\n <Content>\n <Tags marginTop={23} />\n <Results\n stats={stats}\n onMore={this.onMore}\n enableMore={enableMore}\n >\n {list.map((item) => (\n <Book\n {...item}\n width={220}\n key={`book-${item.id}`}\n onClick={() => navigate.to(docUrl(item))}\n />\n ))}\n </Results>\n </Content>\n );\n }\n}\n","import styled from \"styled-components\";\nimport { Link } from \"react-router-dom\";\nimport { fixArabicText } from \"../../helpers/text\";\nimport { truncateTOC, isTOCIndented } from \"../../helpers/toc\";\n\nconst List = styled.div<{ isChild: boolean }>`\n user-select: none;\n display: block;\n margin-top: ${(p) => (p.isChild ? 10 : 0)}px;\n\n &:first-of-type {\n }\n\n [lang=\"ar\"] {\n font-size: 15px;\n }\n`;\nconst Item = styled.div<{ indent: number; heading: boolean }>`\n position: relative;\n min-height: 30px;\n padding-right: ${(p) => (p.indent > 0 ? p.indent * 18 : 0)}px;\n font-family: urdu, QuranFont, Roboto, sans-serif;\n\n a {\n text-decoration: none;\n }\n\n & > a {\n font-size: ${(p) => (p.heading ? 16 : 16)}px;\n font-weight: ${(p) => (p.heading ? 700 : 500)};\n\n [text=\"ؐ\"],\n [text=\"ؑ\"] {\n font-size: 10px;\n }\n\n &:hover {\n font-weight: 500;\n }\n }\n`;\nconst Index = styled.span<{ heading: boolean }>`\n position: relative;\n display: inline-block;\n right: -10px;\n top: 1px;\n min-width: 25px;\n font-family: urdu;\n font-size: ${(p) => (p.heading ? 16 : 14)}px;\n font-weight: 500;\n text-align: left;\n`;\n\nfunction children(list: Array<Page>, pages: Array<Page>, parent_id: number) {\n for (let i = 0; i < pages.length; i += 1) {\n const p = pages[i];\n\n if (parent_id === p.parent_id) {\n p.children = children([], pages, p.id);\n list.push(p);\n }\n }\n\n return list;\n}\n\ntype Props = {\n list: Array<Page>;\n prefix: string;\n indent: number;\n indented: boolean;\n};\n\nfunction Chapters({ list, prefix, indented, indent }: Props) {\n return (\n <List isChild={prefix.toString().length > 0}>\n {list.map(({ id, link, title, children }: Page, i) => {\n let n = prefix ? `${prefix}.${i + 1}` : (i + 1).toString();\n let heading = indent === 0;\n if (heading && !indented) {\n heading = false;\n }\n\n return (\n <Item key={`li-${id}`} indent={indent} heading={heading}>\n <Index heading={heading}>{n}</Index>\n <Link\n to={link}\n dangerouslySetInnerHTML={fixArabicText(title)}\n />\n {children.length > 0 && (\n <Chapters\n list={children}\n prefix={n}\n indent={indent + 1}\n indented={indented}\n />\n )}\n </Item>\n );\n })}\n </List>\n );\n}\n\nexport interface Page {\n _indent: number;\n parent_id: number;\n\n id: number;\n link: string;\n name: string;\n title: string;\n position: number;\n children: Array<Page>;\n}\n\ninterface TOC {\n pages: Array<Page>;\n}\n\nexport default function TableOfContents({ pages }: TOC) {\n const list = truncateTOC(pages) as Array<Page>;\n\n return (\n <Chapters\n prefix=\"\"\n indent={0}\n indented={isTOCIndented(list)}\n list={children([], list, 0)}\n />\n );\n}\n","import styled from \"styled-components\";\nimport { device } from \"../../helpers\";\n\nexport const Container = styled.div`\n position: relative;\n margin: 36px auto 36px auto;\n width: 1000px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n\n @media ${device.phone} {\n margin: 10px auto 24px auto;\n width: 100%;\n flex-direction: column;\n }\n`;\nexport const ImageCol = styled.div`\n max-width: 400px;\n margin-left: 60px;\n\n @media ${device.phone} {\n display: flex;\n flex-direction: column;\n max-width: 100%;\n margin-left: 0;\n align-items: center;\n }\n`;\nexport const TOCColumn = styled.div`\n width: 600px;\n max-width: 600px;\n\n @media ${device.phone} {\n display: none;\n }\n`;\n\nexport const Meta = styled.div`\n text-align: right;\n width: 94%;\n margin-right: 5%;\n\n @media ${device.phone} {\n width: 90%;\n margin-right: 0;\n }\n`;\nexport const Image = styled.img`\n cursor: pointer;\n width: 100%;\n border-radius: 4px;\n\n @media ${device.phone} {\n width: 85%;\n }\n`;\nexport const Title = styled.h1`\n margin: 20px 0 0 0;\n padding: 0;\n font-size: 20px;\n font-weight: 700 !important;\n text-align: center;\n font-family: urdu, QuranFont, sans-serif;\n\n [lang=\"ar\"] {\n font-size: 18px;\n }\n`;\nexport const Authors = styled.div`\n margin-top: 0;\n font-size: 14px;\n font-weight: 500;\n text-align: center;\n margin-bottom: 20px;\n\n @media ${device.phone} {\n margin: 5px 0 20px 0;\n }\n`;\nexport const Intro = styled.div`\n margin: 20px 0 24px 0;\n line-height: 26px;\n\n [lang=\"ar\"] {\n font-size: 15px;\n }\n\n span[text=\"ؓ\"],\n span[text=\"ؑ\"] {\n font-size: 10px;\n }\n\n @media ${device.phone} {\n margin: 20px 36px 24px 36px;\n text-align: center;\n }\n`;\nexport const Actions = styled.div`\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: center;\n margin-top: 12px;\n\n @media ${device.phone} {\n justify-content: center;\n }\n`;\nexport const ActionImg = styled.img`\n cursor: pointer;\n margin: 6px 10px 0 0;\n height: 24px;\n`;\nexport const ActionRow = styled.div`\n margin: 10px 0 0 0;\n display: flex;\n flex-direction: row;\n`;\n","import styled from \"styled-components\";\nimport { device } from \"../../../../helpers/style\";\n\nexport const Container = styled.div`\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n width: 600px;\n\n @media ${device.phone} {\n width: 90vw;\n max-width: 550px;\n } ;\n`;\nexport const StepContainer = styled.div`\n width: 100%;\n\n @media ${device.phone} {\n margin-top: 85px;\n } ;\n`;\nexport const Heading = styled.div`\n margin-bottom: 20px;\n font-size: 30px;\n font-weight: 500;\n text-align: center;\n font-family: Cairo, QuranFont, urdu, sans-serif;\n`;\n\ntype Props = {\n title: string;\n children: JSX.Element | JSX.Element[];\n};\nexport default function Step({ title, children }: Props) {\n return (\n <StepContainer>\n <Heading>{title}</Heading>\n {children}\n </StepContainer>\n );\n}\n","export default __webpack_public_path__ + \"static/media/onboarding-share-with-friends-whatsapp.13ee25f1.png\";","import React from \"react\";\nimport styled from \"styled-components\";\nimport { shareOnFacebook } from \"../../../helpers\";\nimport src from \"./onboarding-share-with-friends-whatsapp.png\";\n\nconst Container = styled.div`\n margin: 40px 0 0 0;\n`;\nconst Img = styled.img`\n width: 266px;\n height: 106px;\n`;\n\nfunction onClick(e: React.MouseEvent<HTMLImageElement>) {\n e.preventDefault();\n e.stopPropagation();\n\n shareOnFacebook(\"https://urdupub.com/b-170-/\");\n\n const { gtag } = window;\n gtag(\"event\", \"share\", {\n event_category: \"become-an-author\",\n });\n\n return false;\n}\n\nexport default function ShareOnWhatsApp() {\n return (\n <Container>\n <Img src={src} onClick={onClick} />\n </Container>\n );\n}\n","import styled from \"styled-components\";\nimport React from \"react\";\nimport { toArabicNumerals } from \"../../../helpers\";\n\nconst Countdown = styled.div`\n margin: 30px 0;\n font-size: 40px;\n font-weight: 500;\n`;\n\ntype Props = {\n seconds: number;\n onFinish: () => void;\n};\ntype State = {\n seconds: number;\n};\n\nexport default class Timer extends React.Component<Props, State> {\n private intervalId?: ReturnType<typeof setInterval>;\n\n state = {\n seconds: this.props.seconds,\n };\n\n clearInterval() {\n const i = this.intervalId;\n if (typeof i !== \"undefined\") {\n clearInterval((i as unknown) as number);\n }\n }\n\n componentDidMount() {\n this.clearInterval();\n this.intervalId = setInterval(this.onTick, 1000);\n }\n\n componentWillUnmount() {\n this.clearInterval();\n }\n\n onTick = () => {\n let { seconds } = this.state;\n seconds -= 1;\n\n if (seconds === 0) {\n this.clearInterval();\n this.props.onFinish();\n return;\n }\n\n this.setState({\n seconds,\n });\n };\n\n render() {\n return (\n <Countdown>\n {toArabicNumerals(this.state.seconds.toString())}\n </Countdown>\n );\n }\n}\n","import styled from \"styled-components\";\nimport ShareOnWhatsApp from \"./ShareOnWhatsApp\";\nimport Timer from \"./Timer\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\nconst Text = styled.div`\n font-size: 20px;\n margin: 28px 0 28px 0;\n text-align: center;\n`;\n\ntype Props = {\n onNext: () => void;\n};\n\nexport default function Share(props: Props) {\n return (\n <Container>\n <Text>کیا آپ اپنے دوستوں کو دعوت دینا چاہیں گے؟</Text>\n <Timer seconds={10} onFinish={props.onNext} />\n <ShareOnWhatsApp />\n </Container>\n );\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { fromJS } from \"immutable\";\nimport { createDoc } from \"../../../reducers/docs/actions\";\nimport { Form, TYPE_INFO } from \"../../../lib\";\nimport styled from \"styled-components\";\n\nconst Container = styled.div`\n margin: 0 auto 60px auto;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n width: 100%;\n`;\n\nconst mapDispatch = { createDoc };\ntype DispatchProps = typeof mapDispatch;\ntype Props = DispatchProps & {};\n\ntype State = {\n doc: ReturnType<typeof fromJS>;\n};\n\nclass CreateBook extends React.Component<Props, State> {\n state = {\n doc: fromJS({\n name: \"بلاعنوان\",\n }),\n };\n\n order = [\"name\"];\n\n fields = {\n name: {\n type: \"text\",\n },\n };\n\n constraints = {\n name: {\n presence: { message: \"nameRequired\" },\n length: {\n minimum: 3,\n message: \"nameMinChars\",\n },\n },\n };\n\n onSubmit = (values: any) => {\n this.props.createDoc({\n ...values,\n status: \"PUBLISHED\",\n visibility: \"PUBLIC\",\n redirect: false,\n });\n\n const { gtag } = window;\n gtag(\"event\", \"doc\", {\n event_label: \"create\",\n });\n };\n\n render() {\n return (\n <Container>\n <Form\n id=\"doc\"\n updateProp=\"doc\"\n doc={this.state.doc}\n order={this.order}\n fields={this.fields}\n constraints={this.constraints}\n focusOnFirst={true}\n editing=\"Create\"\n primaryBtnType={TYPE_INFO}\n onSubmit={this.onSubmit}\n />\n </Container>\n );\n }\n}\n\nexport default connect(null, mapDispatch)(CreateBook);\n","export default __webpack_public_path__ + \"static/media/icons-to-remember.00068d14.png\";","import React from \"react\";\nimport styled from \"styled-components\";\nimport { TYPE_PRIMARY } from \"../../../lib/ui\";\nimport { BTN_MEDIUM, Button } from \"../../../lib/form\";\nimport iconsToRemember from \"./icons-to-remember.png\";\nimport Timer from \"./Timer\";\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n`;\nconst Img = styled.img`\n margin-top: 20px;\n width: 360px;\n height: 227px;\n`;\n\ntype Props = {\n onStart: () => void;\n};\ntype State = {\n count: number;\n};\n\nexport default class Start extends React.Component<Props, State> {\n private intervalId?: ReturnType<typeof setInterval>;\n\n state = {\n count: 0,\n };\n\n componentDidMount() {\n this.intervalId = setInterval(this.onInterval, 1000);\n }\n\n componentWillUnmount() {\n const i = this.intervalId;\n if (typeof i !== \"undefined\") {\n clearInterval((i as unknown) as number);\n }\n }\n\n onInterval = () => {\n this.setState({\n count: this.state.count + 1,\n });\n };\n\n render() {\n const { onStart } = this.props;\n const { count } = this.state;\n\n return (\n <Container>\n <Img src={iconsToRemember} />\n <Timer seconds={30} onFinish={onStart} />\n\n {count > 15 && (\n <Button\n width=\"120px\"\n type={TYPE_PRIMARY}\n size={BTN_MEDIUM}\n onClick={onStart}\n messageId=\"onBoarding.startEditor\"\n />\n )}\n </Container>\n );\n }\n}\n","import React from \"react\";\nimport { eventEmitter, navigate } from \"../../../services\";\n\nimport Step, { Container } from \"./styles/onboarding\";\n// import Steps from './Steps'\n\nimport Share from \"./Share\";\nimport CreateBook from \"./CreateBook\";\nimport { EVT_USER_REGISTER } from \"../../../components/Forms/RegisterForm\";\nimport { EVT_DOC_CREATE } from \"../../../components/Forms/DocForm\";\nimport RegisterForm from \"../../../components/Forms/RegisterForm\";\nimport Start from \"./Start\";\nimport { TYPE_INFO } from \"../../../lib/ui\";\n\nexport default class OnBoarding extends React.Component {\n state = {\n step: 1,\n doc_id: -1,\n page_id: -1,\n };\n\n componentDidMount() {\n eventEmitter.on(EVT_USER_REGISTER, this.onRegister);\n eventEmitter.on(EVT_DOC_CREATE, this.onDocCreate);\n }\n\n componentWillUnmount() {\n eventEmitter.off(EVT_USER_REGISTER, this.onRegister);\n eventEmitter.off(EVT_DOC_CREATE, this.onDocCreate);\n }\n\n onRegister = () => this.setState({ step: 2 });\n onShareNext = () => this.setState({ step: 3 });\n onDocCreate = ({ doc_id, page_id }: { doc_id: number; page_id: number }) =>\n this.setState({ doc_id, page_id, step: 4 });\n\n onStart = () => {\n const { doc_id, page_id } = this.state;\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n };\n\n view() {\n const { step } = this.state;\n\n if (step === 1) {\n return (\n <Step title=\"رجسٹریشن\">\n <RegisterForm redirect={false} primaryBtnType={TYPE_INFO} />\n </Step>\n );\n } else if (step === 2) {\n return (\n <Step title=\"شئیر\">\n <Share onNext={this.onShareNext} />\n </Step>\n );\n } else if (step === 3) {\n return (\n <Step title=\"کتاب کا نام\">\n <CreateBook />\n </Step>\n );\n } else if (step === 4) {\n return (\n <Step title=\"سسٹم کے اندر\">\n <Start onStart={this.onStart} />\n </Step>\n );\n }\n\n return null;\n }\n\n render() {\n return (\n <Container>\n {/*<Steps step={this.state.step} />*/}\n {this.view()}\n </Container>\n );\n }\n}\n","import React, { Fragment } from \"react\";\nimport { Books, Resize } from \"../../models\";\nimport { eventEmitter, navigate } from \"../../services\";\nimport {\n docShareUrl,\n fixArabicText,\n getMetaValue,\n isLoggedIn,\n pageUrl,\n setWindowTitle,\n shareOnFacebook,\n} from \"../../helpers\";\nimport { downloadPDF } from \"../../helpers/pdf\";\nimport { Content } from \"../../pages/Template\";\nimport TableOfContents, { Page } from \"./TableOfContents\";\nimport { EVT_KEYDOWN, KEY_ESC, TYPE_WHATSAPP_SHARE } from \"../../lib\";\nimport { Button } from \"../../lib/form\";\nimport {\n ActionImg,\n ActionRow,\n Actions,\n Authors,\n Container,\n Image,\n ImageCol,\n Intro,\n Meta,\n Title,\n TOCColumn,\n} from \"./styles\";\nimport { download } from \"../../images\";\nimport { CircularLoader } from \"../../lib/ui/Progress\";\nimport { getURLParam, RouteMatch } from \"../../lib/routing\";\nimport OnBoarding from \"./OnBoarding\";\nimport { connect } from \"react-redux\";\nimport { AppState } from \"../../store\";\nimport { AxiosResponse } from \"axios\";\nimport { DocMeta } from \"../../helpers/meta\";\n\nconst mapState = ({ user }: AppState) => ({ user });\ntype StateProps = ReturnType<typeof mapState>;\ntype Props = StateProps & {\n match: RouteMatch;\n};\n\ntype Doc = {\n id: number;\n name: string;\n skip_pdf: boolean;\n doc_meta: DocMeta[];\n pages: Page[];\n};\ntype State = {\n doc: Doc | null;\n processingPDF: boolean;\n};\n\nclass BookPage extends React.Component<Props, State> {\n static paths = [\"/app/b-:doc_id-:doc_title\", \"/app/b-:doc_id-/\"];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n doc: null,\n processingPDF: false,\n };\n }\n\n async componentDidMount() {\n await this.fetch();\n window.addEventListener(EVT_KEYDOWN, this.onShortcut);\n eventEmitter.on(\"pdf.processing\", this.onPDFProcessing);\n }\n\n componentWillUnmount() {\n window.removeEventListener(EVT_KEYDOWN, this.onShortcut);\n eventEmitter.off(\"pdf.processing\", this.onPDFProcessing);\n }\n\n onPDFProcessing = (processingPDF: boolean) =>\n this.setState({ processingPDF });\n\n onShortcut = (evt: KeyboardEvent) => {\n if (evt.key === KEY_ESC) {\n navigate.back();\n }\n };\n\n async fetch() {\n try {\n const { doc_id } = this.props.match.params;\n const { data: doc }: AxiosResponse<Doc> = await Books.fetch(doc_id);\n\n doc.pages = doc.pages.map((p: Page) => {\n p.title = p.name;\n p.link = pageUrl(doc, p);\n\n return p;\n });\n\n setWindowTitle(doc.name);\n\n this.setState({ doc });\n } catch (e) {}\n }\n\n onReadBook = () => {\n if (this.state.doc) {\n navigate.to(this.state.doc.pages[0].link);\n }\n };\n\n onShare = () => {\n const doc = this.state.doc!;\n\n shareOnFacebook(docShareUrl(doc!));\n\n const { gtag } = window;\n gtag(\"event\", \"share\", {\n event_category: \"book\",\n event_label: `facebook-${doc!.id}`,\n });\n };\n\n onDownload = async () => {\n await downloadPDF(this.state.doc!.id);\n };\n\n downloadBtn() {\n const { doc, processingPDF } = this.state;\n if (!doc || doc!.skip_pdf) {\n return null;\n }\n\n return (\n <Fragment>\n {processingPDF && (\n <CircularLoader\n margin=\"6px 12px 0 0\"\n border=\"2px\"\n width=\"24px\"\n height=\"24px\"\n />\n )}\n\n {!processingPDF && (\n <ActionImg src={download} onClick={this.onDownload} />\n )}\n </Fragment>\n );\n }\n\n cover() {\n const coverImg = Resize.url(\n \"GET\",\n `book/cover/${this.state.doc!.id}/440`\n );\n return <Image src={coverImg} onClick={this.onReadBook} />;\n }\n\n meta() {\n if (!this.state.doc) {\n return null;\n }\n\n const { name, doc_meta } = this.state.doc;\n const authors = getMetaValue(doc_meta, \"authors\");\n const intro = getMetaValue(doc_meta, \"intro\")!;\n\n return (\n <Meta>\n <Title\n dangerouslySetInnerHTML={fixArabicText(name)}\n onClick={this.onReadBook}\n />\n <Authors>{authors}</Authors>\n\n {this.actions()}\n\n <Intro dangerouslySetInnerHTML={fixArabicText(intro)} />\n </Meta>\n );\n }\n\n toc() {\n return (\n <TOCColumn>\n <TableOfContents pages={this.state.doc!.pages} />\n </TOCColumn>\n );\n }\n\n actions() {\n return (\n <Actions>\n <ActionRow>\n <Button\n type={TYPE_WHATSAPP_SHARE}\n width=\"230px\"\n margin=\"0 0 0 10px\"\n messageId=\"book.shareWithFriends\"\n onClick={this.onShare}\n />\n </ActionRow>\n <ActionRow>\n <Button\n width=\"150px\"\n margin=\"0 0 0 10px\"\n messageId=\"book.read\"\n onClick={this.onReadBook}\n />\n\n {this.downloadBtn()}\n </ActionRow>\n </Actions>\n );\n }\n\n render() {\n const { doc } = this.state;\n if (!doc) {\n return null;\n }\n\n if (!isLoggedIn(this.props.user) && doc.id === 170) {\n return (\n <Content isLandingPage={true}>\n <OnBoarding />\n </Content>\n );\n }\n\n const isLandingPage = !!getURLParam(\"fbclid\");\n\n return (\n <Content isLandingPage={isLandingPage}>\n <Container>\n <ImageCol>\n {this.cover()}\n {this.meta()}\n </ImageCol>\n {this.toc()}\n </Container>\n </Content>\n );\n }\n}\n\nexport default connect(mapState)(BookPage);\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAEGWlDQ1BrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgAAOI2NVV1oHFUUPrtzZyMkzlNsNIV0qD8NJQ2TVjShtLp/3d02bpZJNtoi6GT27s6Yyc44M7v9oU9FUHwx6psUxL+3gCAo9Q/bPrQvlQol2tQgKD60+INQ6Ium65k7M5lpurHeZe58853vnnvuuWfvBei5qliWkRQBFpquLRcy4nOHj4g9K5CEh6AXBqFXUR0rXalMAjZPC3e1W99Dwntf2dXd/p+tt0YdFSBxH2Kz5qgLiI8B8KdVy3YBevqRHz/qWh72Yui3MUDEL3q44WPXw3M+fo1pZuQs4tOIBVVTaoiXEI/MxfhGDPsxsNZfoE1q66ro5aJim3XdoLFw72H+n23BaIXzbcOnz5mfPoTvYVz7KzUl5+FRxEuqkp9G/Ajia219thzg25abkRE/BpDc3pqvphHvRFys2weqvp+krbWKIX7nhDbzLOItiM8358pTwdirqpPFnMF2xLc1WvLyOwTAibpbmvHHcvttU57y5+XqNZrLe3lE/Pq8eUj2fXKfOe3pfOjzhJYtB/yll5SDFcSDiH+hRkH25+L+sdxKEAMZahrlSX8ukqMOWy/jXW2m6M9LDBc31B9LFuv6gVKg/0Szi3KAr1kGq1GMjU/aLbnq6/lRxc4XfJ98hTargX++DbMJBSiYMIe9Ck1YAxFkKEAG3xbYaKmDDgYyFK0UGYpfoWYXG+fAPPI6tJnNwb7ClP7IyF+D+bjOtCpkhz6CFrIa/I6sFtNl8auFXGMTP34sNwI/JhkgEtmDz14ySfaRcTIBInmKPE32kxyyE2Tv+thKbEVePDfW/byMM1Kmm0XdObS7oGD/MypMXFPXrCwOtoYjyyn7BV29/MZfsVzpLDdRtuIZnbpXzvlf+ev8MvYr/Gqk4H/kV/G3csdazLuyTMPsbFhzd1UabQbjFvDRmcWJxR3zcfHkVw9GfpbJmeev9F08WW8uDkaslwX6avlWGU6NRKz0g/SHtCy9J30o/ca9zX3Kfc19zn3BXQKRO8ud477hLnAfc1/G9mrzGlrfexZ5GLdn6ZZrrEohI2wVHhZywjbhUWEy8icMCGNCUdiBlq3r+xafL549HQ5jH+an+1y+LlYBifuxAvRN/lVVVOlwlCkdVm9NOL5BE4wkQ2SMlDZU97hX86EilU/lUmkQUztTE6mx1EEPh7OmdqBtAvv8HdWpbrJS6tJj3n0CWdM6busNzRV3S9KTYhqvNiqWmuroiKgYhshMjmhTh9ptWhsF7970j/SbMrsPE1suR5z7DMC+P/Hs+y7ijrQAlhyAgccjbhjPygfeBTjzhNqy28EdkUh8C+DU9+z2v/oyeH791OncxHOs5y2AtTc7nb/f73TWPkD/qwBnjX8BoJ98VQNcC+8AAADtSURBVGgF7VjtDoJADEOfvG+u7Q8SYkBv7LgPaRMScmxt1xmDLovhBJyAE+iZwKOi+CvIVUX7GRQdrtwD9F6JN+ANJBPwRygZYLrdG0hHmCS41QbAsPS+c3RFszzi0TmiZKX1Iv4mXOOZNC4FyF7D6B6HuJsAVNkzkDkTZ1OAahnD215xdQGoujVy5l4cXQGqnzGuHvUOAdBFdAj1DAXQTekQqh0SoKtfQ6hmaIDujobQsykAuvwcQmdTAXS7DqH7KQG61mU4ASdwUQKRf4j1jdISRd5u9Zu4ZfrFWtNvoHhSFzoBJ+AEnMBfJvAGFTW5d75meoIAAAAASUVORK5CYII=\"","import React from \"react\";\nimport { navigate } from \"../../services\";\nimport styled from \"styled-components\";\nimport { Button, BTN_MEDIUM } from \"../../lib\";\nimport { device } from \"../../helpers/style\";\n\nexport const Container = styled.div`\n user-select: none;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n margin-bottom: 60px;\n\n @media ${device.phone} {\n margin-bottom: 20px;\n }\n`;\n\nexport default function CreateDocLink() {\n return (\n <Container>\n <Button\n size={BTN_MEDIUM}\n messageId=\"doc.new\"\n onClick={() => navigate.to(\"/app/doc/create\")}\n />\n </Container>\n );\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Input } from \"../../lib\";\nimport { i18n } from \"../../services\";\nimport { device } from \"../../helpers/style\";\n\nconst Container = styled.div`\n margin: 0 auto 60px auto;\n width: 75%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n @media ${device.phone} {\n width: 100%;\n margin-bottom: 40px;\n }\n`;\n\ntype Props = {\n filter: string;\n onChange: (k: string, filter: string) => void;\n};\nexport default function SearchDocs({ filter, onChange }: Props) {\n return (\n <Container>\n <Input\n name=\"search_docs\"\n fullWidth={true}\n textAlign=\"center\"\n placeholder={i18n.get(\"doc.search\")}\n value={filter}\n onChange={onChange}\n />\n </Container>\n );\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Progress,\n Button,\n ButtonActionGroup,\n Confirm,\n BTN_SMALL,\n TYPE_FAILURE,\n TYPE_SECONDARY,\n} from \"../../lib\";\n\nimport { destroyDoc } from \"../../reducers/docs/actions\";\nimport { fetchPages } from \"../../reducers/pages/actions\";\nimport { removeAutoComplete } from \"../../reducers/autocomplete/actions\";\n\nimport { PAGE_EDITOR } from \"../../settings\";\nimport { navigate } from \"../../services\";\nimport { AppState } from \"../../store\";\n\nconst mapStateToProps = ({ docs, settings }: AppState) => ({\n docs,\n // @ts-ignore\n docLastOpened: settings.get(\"docLastOpened\") as Map<number, boolean>,\n});\nconst mapDispatch = {\n destroyDoc,\n fetchPages,\n removeAutoComplete,\n};\ntype StateProps = ReturnType<typeof mapStateToProps>;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n selected: number[];\n clearSelected: () => void;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\n\ntype State = {\n processing: boolean;\n confirmDelete: boolean;\n};\n\nclass Actions extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n processing: false,\n confirmDelete: false,\n };\n }\n\n onPreviewClick = () => navigate.to(`/app/b-${this.props.selected[0]}-`);\n\n onEditClick = () => navigate.to(`/app/doc/edit/${this.props.selected[0]}`);\n\n onEditDocClick = () => {\n const { docLastOpened } = this.props;\n const doc_id = this.props.selected[0];\n\n if (docLastOpened.has(doc_id)) {\n const page_id = docLastOpened.get(doc_id);\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n } else {\n this.setState({ processing: true });\n this.props.fetchPages({\n doc_id,\n redirect: PAGE_EDITOR,\n });\n }\n };\n\n onDeleteClick = () => this.setState({ confirmDelete: true });\n\n onDocMetaClick = () =>\n navigate.to(`/app/doc/meta/${this.props.selected[0]}`);\n\n onConfirmDelete = () => {\n const { selected } = this.props;\n\n try {\n for (const doc_id of selected) {\n this.props.destroyDoc(doc_id);\n this.props.removeAutoComplete({ doc_id });\n }\n } catch (e) {\n console.warn(e);\n }\n\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n onCancelDelete = () => {\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n render() {\n if (this.state.processing) {\n return <Progress margin=\"50px 0\" />;\n }\n\n const { selected } = this.props;\n if (selected.length === 0) {\n return null;\n }\n\n if (this.state.confirmDelete) {\n return (\n <Confirm\n type={TYPE_FAILURE}\n onConfirm={this.onConfirmDelete}\n onCancel={this.onCancelDelete}\n messageId={\n selected.length > 1\n ? \"doc.confirmRemoveAll\"\n : \"doc.confirmRemove\"\n }\n />\n );\n }\n\n const selectedOne = selected.length === 1;\n return (\n <ButtonActionGroup>\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"doc.edit\"\n onClick={this.onEditClick}\n />\n )}\n\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"doc.meta\"\n onClick={this.onDocMetaClick}\n />\n )}\n\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n messageId=\"doc.editDoc\"\n onClick={this.onEditDocClick}\n />\n )}\n\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"doc.preview\"\n onClick={this.onPreviewClick}\n />\n )}\n\n {selected.length > 0 && (\n <Button\n size={BTN_SMALL}\n type={TYPE_FAILURE}\n messageId=\"doc.remove\"\n onClick={this.onDeleteClick}\n />\n )}\n </ButtonActionGroup>\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(Actions);\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport { isMobile, mysqlDateToArabic } from \"../../helpers\";\nimport { Table } from \"../../lib\";\nimport { fetchDocs } from \"../../reducers/docs/actions\";\nimport Actions from \"./Actions\";\nimport { AppState } from \"../../store\";\nimport { RowProps } from \"../../lib/ui/Table\";\n\nexport const Container = styled.div`\n width: 100%;\n`;\n\nconst mapStateToProps = ({ docs }: AppState) => ({ docs });\nconst mapDispatch = {\n fetchDocs,\n};\ntype StateProps = ReturnType<typeof mapStateToProps>;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n filter: string;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n selected: number[];\n};\n\nclass List extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n selected: [],\n };\n }\n\n async componentDidMount() {\n this.props.fetchDocs(\"\");\n }\n\n onRowClick = (row: RowProps) => {\n const doc_id = row.id as number;\n let { selected } = this.state;\n\n if (selected.includes(doc_id)) {\n selected.splice(selected.indexOf(doc_id), 1);\n } else {\n selected.push(doc_id);\n }\n\n this.setState({ selected: selected.slice() });\n };\n\n isSelected = (row: RowProps) =>\n this.state.selected.includes(row.id as number);\n\n table() {\n const { docs, filter } = this.props;\n let fields = [\"name\", \"updated_at\"];\n let titles = [\"docForm.name\", \"docForm.lastUpdated\"];\n\n let width = [\"80%\", \"20%\"];\n if (isMobile()) {\n fields = [\"name\"];\n titles = [\"docForm.name\"];\n width = [\"100%\"];\n }\n\n const transform = {\n updated_at: mysqlDateToArabic,\n };\n\n const rows = docs\n //@ts-ignore\n .filter((d: any) =>\n filter ? d.get(\"name\").includes(filter) : true\n )\n .toList()\n .sort(\n (a: any, b: any) =>\n new Date(b.get(\"updated_at\")).getTime() -\n new Date(a.get(\"updated_at\")).getTime()\n )\n .slice(0, 10);\n\n if (rows.size === 0) {\n return null;\n }\n\n return (\n <Table\n width={width}\n titles={titles}\n fields={fields}\n transform={transform}\n rows={rows.toJS()}\n isSelected={this.isSelected}\n onRowClick={this.onRowClick}\n />\n );\n }\n\n clearSelected = () => this.setState({ selected: [] });\n\n render() {\n const { docs } = this.props;\n // @ts-ignore\n if (docs.size === 0) {\n return null;\n }\n\n return (\n <Container>\n <Actions\n selected={this.state.selected}\n clearSelected={this.clearSelected}\n />\n {this.table()}\n </Container>\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(List);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Content, Container } from \"../../pages/Template\";\nimport CreateDocLink from \"./CreateDocLink\";\nimport SearchDocs from \"./SearchDocs\";\nimport List from \"./List\";\nimport { isMobile, setWindowTitle } from \"../../helpers\";\nimport { AppState } from \"../../store\";\n\nconst mapStateToProps = ({ docs }: AppState) => ({\n // @ts-ignore\n showFilter: docs && docs.size > 5,\n});\n\ntype StateProps = ReturnType<typeof mapStateToProps>;\ntype Props = StateProps;\ntype State = {\n filter: string;\n};\n\nclass DocsPage extends React.Component<Props, State> {\n static paths = [\"/app/docs\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n filter: \"\",\n };\n }\n\n onFilterChange = (_k: string, filter: string) => this.setState({ filter });\n\n componentDidMount() {\n setWindowTitle(\"دستاویزات\");\n }\n\n render() {\n const { showFilter } = this.props;\n const { filter } = this.state;\n\n return (\n <Content isLandingPage={isMobile()}>\n <Container>\n <CreateDocLink />\n {showFilter && (\n <SearchDocs\n filter={filter}\n onChange={this.onFilterChange}\n />\n )}\n <List filter={filter} />\n </Container>\n </Content>\n );\n }\n}\n\nexport default connect(mapStateToProps)(DocsPage);\n","import React from \"react\";\nimport DocForm from \"../components/Forms/DocForm\";\nimport { Content, Container } from \"../pages/Template\";\nimport { isMobile } from \"../helpers\";\nimport { RouteMatch } from \"../lib/routing\";\n\ntype Props = {\n match: RouteMatch;\n};\nexport class DocFormPage extends React.Component<Props> {\n static paths = [\"/app/doc/create\", \"/app/doc/edit/:doc_id\"];\n static requiresAuth = true;\n\n render() {\n const { match } = this.props;\n console.log(\"match\", match);\n const editing = match.path.includes(\"create\") ? \"Create\" : \"Edit\";\n\n return (\n <Content isLandingPage={isMobile()}>\n <Container width=\"500px\">\n <DocForm\n doc_id={parseInt(match.params.doc_id)}\n editing={editing}\n />\n </Container>\n </Content>\n );\n }\n}\n","import React from \"react\";\nimport DocMetaForm from \"../components/Forms/DocMetaForm\";\nimport { Content, Container } from \"../pages/Template\";\nimport { isMobile } from \"../helpers\";\nimport { RouteMatch } from \"../lib\";\n\ntype Props = {\n match: RouteMatch;\n};\n\nexport class DocMetaPage extends React.Component<Props> {\n static paths = [\"/app/doc/meta/:doc_id\"];\n static requiresAuth = true;\n\n render() {\n return (\n <Content isLandingPage={isMobile()}>\n <Container width=\"500px\">\n <DocMetaForm\n doc_id={parseInt(this.props.match.params.doc_id)}\n match={this.props.match}\n />\n </Container>\n </Content>\n );\n }\n}\n","import React from \"react\";\nimport { navigate } from \"../../services\";\nimport styled from \"styled-components\";\nimport { Button, BTN_MEDIUM } from \"../../lib\";\n\nexport const Container = styled.div`\n user-select: none;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n margin-bottom: 20px;\n`;\n\nexport default function CreatePageLink({ doc_id }: { doc_id: number }) {\n return (\n <Container>\n <Button\n size={BTN_MEDIUM}\n messageId=\"pageForm.new\"\n onClick={() => navigate.to(`/app/pages/${doc_id}/create`)}\n />\n </Container>\n );\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Map } from \"immutable\";\nimport {\n Progress,\n Button,\n ButtonActionGroup,\n Confirm,\n BTN_SMALL,\n TYPE_SECONDARY,\n TYPE_FAILURE,\n} from \"../../lib\";\nimport { navigate } from \"../../services\";\n\nimport { setDocLastOpened } from \"../../reducers/settings/actions\";\nimport { removePageAutoComplete } from \"../../reducers/autocomplete/actions\";\nimport { destroyPage, fetchPages } from \"../../reducers/pages/actions\";\nimport { AppState } from \"../../store\";\n\nconst mapPropsToState = (\n { settings, pages }: AppState,\n { doc_id }: OwnProps\n) => ({\n // @ts-ignore\n docLastOpened: settings.get(\"docLastOpened\") as Map<number, number>,\n pages: Map<string, any>(\n // @ts-ignore\n pages.filter((p: any) => p.get(\"doc_id\") === doc_id)\n ),\n});\nconst mapDispatch = {\n destroyPage,\n fetchPages,\n setDocLastOpened,\n removePageAutoComplete,\n};\n\ntype StateProps = ReturnType<typeof mapPropsToState>;\ntype DispatchProps = typeof mapDispatch;\n\ntype OwnProps = {\n doc_id: number;\n page_id: number;\n size: number;\n selected: number[];\n\n clearSelected: () => void;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n processing: boolean;\n confirmDelete: boolean;\n};\n\nclass Actions extends React.Component<Props, State> {\n state = {\n processing: false,\n confirmDelete: false,\n };\n\n getParams = () => ({\n doc_id: this.props.doc_id,\n page_id: this.props.selected[0],\n });\n\n onEditClick = () => {\n const { doc_id, page_id } = this.getParams();\n navigate.to(`/app/page/edit/${doc_id}/${page_id}`);\n };\n\n onEditDocClick = () => {\n const { doc_id, page_id } = this.getParams();\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n };\n\n onDeleteClick = () => this.setState({ confirmDelete: true });\n\n onConfirmDelete = () => {\n const { doc_id, selected, pages, docLastOpened } = this.props;\n\n try {\n selected.forEach((page_id) => {\n this.props.destroyPage({ page_id, doc_id });\n this.props.removePageAutoComplete({ page_id, doc_id });\n });\n\n if (\n docLastOpened.has(doc_id) &&\n selected.includes(docLastOpened.get(doc_id)!)\n ) {\n const firstPageId = pages\n .min((p: any) => p.position)!\n .get(\"id\");\n this.props.setDocLastOpened({ doc_id, page_id: firstPageId });\n }\n } catch (e) {\n console.warn(e);\n }\n\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n onCancelDelete = () => {\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n onReturnClick = () => {\n const { doc_id, page_id, docLastOpened } = this.props;\n\n if (docLastOpened.has(doc_id)) {\n const lastOpened = docLastOpened.get(doc_id);\n navigate.to(`/app/e/${doc_id}/${lastOpened}`);\n } else {\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n }\n };\n\n render() {\n if (this.state.processing) {\n return <Progress margin=\"50px 0\" />;\n }\n\n const { size, selected } = this.props;\n const selectedOne = selected.length === 1;\n\n if (this.state.confirmDelete) {\n return (\n <Confirm\n type={TYPE_FAILURE}\n onConfirm={this.onConfirmDelete}\n onCancel={this.onCancelDelete}\n messageId={\n selectedOne\n ? \"pageForm.confirmRemove\"\n : \"pageForm.confirmRemoveAll\"\n }\n />\n );\n }\n\n return (\n <ButtonActionGroup>\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"pageForm.edit\"\n onClick={this.onEditClick}\n />\n )}\n\n {selectedOne && (\n <Button\n size={BTN_SMALL}\n messageId=\"doc.editDoc\"\n onClick={this.onEditDocClick}\n />\n )}\n\n {size > 1 && selected.length > 0 && (\n <Button\n size={BTN_SMALL}\n type={TYPE_FAILURE}\n messageId=\"pageForm.remove\"\n onClick={this.onDeleteClick}\n />\n )}\n\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"form.return\"\n onClick={this.onReturnClick}\n />\n </ButtonActionGroup>\n );\n }\n}\n\nexport default connect(mapPropsToState, mapDispatch)(Actions);\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { Map } from \"immutable\";\nimport { connect } from \"react-redux\";\nimport { i18n } from \"../../services\";\nimport { isMobile, mysqlDateToArabic } from \"../../helpers\";\nimport { fetchPages, setPagePositions } from \"../../reducers/pages/actions\";\nimport { AppState } from \"../../store\";\nimport Actions from \"./Actions\";\nimport { Table, RowProps, RowPositions } from \"../../lib/ui/Table\";\n\nexport const Container = styled.div``;\n\nconst mapState = ({ pages, settings }: AppState, { doc_id }: OwnProps) => ({\n // @ts-ignore\n docLastOpened: settings.get(\"docLastOpened\") as Map<number, number>,\n pages: Map<string, any>(\n // @ts-ignore\n pages.filter((p: any) => p.get(\"doc_id\") === doc_id)\n ),\n});\nconst mapDispatch = {\n fetchPages,\n setPagePositions,\n};\ntype StateProps = ReturnType<typeof mapState>;\ntype DispatchProps = typeof mapDispatch;\ntype OwnProps = {\n doc_id: number;\n};\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n selected: number[];\n};\n\nclass List extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n selected: [],\n };\n }\n\n async componentDidMount() {\n const { doc_id } = this.props;\n this.props.fetchPages({ doc_id });\n }\n\n onRowClick = (row: RowProps) => {\n const doc_id = row.id as number;\n let { selected } = this.state;\n\n if (selected.includes(doc_id)) {\n selected.splice(selected.indexOf(doc_id), 1);\n } else {\n selected.push(doc_id);\n }\n\n this.setState({ selected: selected.slice() });\n };\n\n isSelected = (row: RowProps) =>\n this.state.selected.includes(row.id as number);\n\n onDragEnd = (positions: RowPositions) => {\n const { doc_id } = this.props;\n this.props.setPagePositions({\n doc_id,\n positions: positions.map((p) => p),\n });\n };\n\n table() {\n const { pages } = this.props;\n let fields = [\"name\", \"status\", \"updated_at\"];\n let titles = [\"pageForm.name\", \"pageForm.status\", \"form.date\"];\n\n if (isMobile()) {\n fields = [\"name\", \"status\"];\n titles = [\"pageForm.name\", \"pageForm.status\"];\n }\n\n const transform = {\n updated_at: mysqlDateToArabic,\n visibility: (visibility: string) =>\n i18n.get(`docForm.visibility${visibility}`),\n status: (status: string) => i18n.get(`docForm.status${status}`),\n };\n\n const width = [\"70%\", \"15%\", \"15%\"];\n const rows = pages.toList().toJS();\n\n return (\n <Table\n width={width}\n titles={titles}\n fields={fields}\n transform={transform}\n //@ts-ignore\n rows={rows}\n indent={true}\n isSelected={this.isSelected}\n onRowClick={this.onRowClick}\n rowId=\"id\"\n draggable={true}\n onDragEnd={this.onDragEnd}\n />\n );\n }\n\n clearSelected = () => this.setState({ selected: [] });\n\n render() {\n const { pages, doc_id, docLastOpened } = this.props;\n if (pages.size === 0) {\n return null;\n }\n\n let lastOpened = pages.min((p) => p.position).get(\"id\");\n if (docLastOpened.has(doc_id)) {\n lastOpened = docLastOpened.get(doc_id);\n }\n\n return (\n <Container>\n <Actions\n page_id={lastOpened}\n doc_id={doc_id}\n size={pages.size}\n selected={this.state.selected}\n clearSelected={this.clearSelected}\n />\n {this.table()}\n </Container>\n );\n }\n}\n\nexport default connect(mapState, mapDispatch)(List);\n","import React from \"react\";\nimport { Content, Container } from \"../../pages/Template\";\nimport CreatePageLink from \"./CreatePageLink\";\nimport List from \"./List\";\nimport { isMobile, setWindowTitle } from \"../../helpers\";\n\ntype Props = {\n match: {\n params: {\n doc_id: string;\n };\n };\n};\nexport class PagesPage extends React.Component<Props> {\n static paths = [\"/app/pages/:doc_id\"];\n static requiresAuth = true;\n\n componentDidMount() {\n setWindowTitle(\"صفحہ\");\n }\n\n render() {\n const doc_id = parseInt(this.props.match.params.doc_id);\n return (\n <Content isLandingPage={isMobile()}>\n <Container>\n <CreatePageLink doc_id={doc_id} />\n <List doc_id={doc_id} />\n </Container>\n </Content>\n );\n }\n}\n","import React from \"react\";\nimport PageForm from \"../components/Forms/PageForm\";\nimport { Content, Container } from \"../pages/Template\";\nimport { isMobile } from \"../helpers\";\nimport { RouteMatch } from \"../lib\";\n\ntype Props = {\n match: RouteMatch;\n};\nexport class PageFormPage extends React.Component<Props> {\n static paths = [\n \"/app/pages/:doc_id/create\",\n \"/app/page/edit/:doc_id/:page_id\",\n ];\n static requiresAuth = true;\n\n render() {\n const { match } = this.props;\n return (\n <Content isLandingPage={isMobile()}>\n <Container width=\"500px\">\n <PageForm\n doc_id={parseInt(match.params.doc_id)}\n page_id={parseInt(match.params.page_id)}\n editing={\n this.props.match.path.indexOf(\"create\") === -1\n ? \"Edit\"\n : \"Create\"\n }\n />\n </Container>\n </Content>\n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { navigate } from \"../../services\";\nimport { Button, BTN_MEDIUM } from \"../../lib\";\n\nexport const Container = styled.div`\n user-select: none;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n margin-bottom: 20px;\n`;\nexport default function AddUserLink({ doc_id }: { doc_id: number }) {\n return (\n <Container>\n <Button\n size={BTN_MEDIUM}\n messageId=\"user.add\"\n onClick={() => navigate.to(`/app/users/${doc_id}/create`)}\n />\n </Container>\n );\n}\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Map } from \"immutable\";\nimport {\n Progress,\n Button,\n ButtonActionGroup,\n Confirm,\n BTN_SMALL,\n TYPE_FAILURE,\n TYPE_SECONDARY,\n} from \"../../lib\";\nimport { destroyDocUser } from \"../../reducers/doc_users/actions\";\nimport { navigate } from \"../../services\";\nimport { UD_EDITOR, UD_AUTHOR } from \"../../settings\";\n\ntype State = {\n processing: boolean;\n showEdit: boolean;\n showDelete: boolean;\n confirmDelete: boolean;\n};\n\nconst mapDispatch = {\n destroyDocUser,\n};\ntype DispatchProps = typeof mapDispatch;\ntype Props = DispatchProps & {\n doc_id: number;\n page_id: number;\n size: number;\n status: string;\n selected: string[];\n doc_users: Map<any, any>;\n selectedRow: Map<string, string>;\n\n clearSelected: () => void;\n};\n\nclass Actions extends React.Component<Props, State> {\n state = {\n processing: false,\n showEdit: false,\n showDelete: false,\n confirmDelete: false,\n };\n\n componentWillReceiveProps(nextProps: Props) {\n const { status, size, selectedRow } = nextProps;\n\n if (selectedRow) {\n const editorCount = this.numOfEditors();\n const selectedStatus: string = selectedRow.get(\"status\")!;\n\n if (size === 1) {\n this.setState({ showDelete: false });\n } else if (\n status === UD_EDITOR &&\n selectedStatus === UD_EDITOR &&\n editorCount > 1\n ) {\n this.setState({ showDelete: true });\n } else if (status === UD_EDITOR && selectedStatus !== UD_EDITOR) {\n this.setState({ showDelete: true });\n } else if (status === UD_AUTHOR && selectedStatus !== UD_EDITOR) {\n this.setState({ showDelete: true });\n } else {\n this.setState({ showDelete: false });\n }\n\n if (status === UD_EDITOR) {\n this.setState({ showEdit: true });\n } else if (status !== UD_EDITOR && selectedStatus === UD_EDITOR) {\n this.setState({ showEdit: false });\n } else if (status === UD_AUTHOR && selectedStatus !== UD_EDITOR) {\n this.setState({ showEdit: true });\n } else {\n this.setState({ showEdit: false });\n }\n } else {\n this.setState({ showEdit: false, showDelete: false });\n }\n }\n\n numOfEditors() {\n let count = 0;\n this.props.doc_users.forEach((u) => {\n if (u.get(\"status\") === UD_EDITOR) {\n count += 1;\n }\n });\n return count;\n }\n\n onEditClick = () =>\n navigate.to(\n `/app/users/edit/${this.props.selected[0].split(\"-\").join(\"/\")}`\n );\n\n onDeleteClick = () => this.setState({ confirmDelete: true });\n\n onConfirmDelete = () => {\n const { selected } = this.props;\n\n try {\n const tmp = selected[0].split(\"-\");\n this.props.destroyDocUser({ doc_id: tmp[0], user_id: tmp[1] });\n } catch (e) {\n console.warn(e);\n }\n\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n onCancelDelete = () => {\n this.setState({ confirmDelete: false });\n this.props.clearSelected();\n };\n\n onReturnClick = () => {\n const { doc_id, page_id } = this.props;\n navigate.to(`/app/e/${doc_id}/${page_id}`);\n };\n\n render() {\n if (this.state.processing) {\n return <Progress margin=\"50px 0\" />;\n }\n\n const { selected } = this.props;\n const selectedOne = selected.length === 1;\n\n if (this.state.confirmDelete) {\n return (\n <Confirm\n type={TYPE_FAILURE}\n onConfirm={this.onConfirmDelete}\n onCancel={this.onCancelDelete}\n messageId={\n selectedOne\n ? \"userDocForm.confirmRemove\"\n : \"userDocForm.confirmRemoveAll\"\n }\n />\n );\n }\n\n return (\n <ButtonActionGroup>\n {this.state.showEdit && (\n <Button\n size={BTN_SMALL}\n messageId=\"userDocForm.edit\"\n onClick={this.onEditClick}\n />\n )}\n\n {this.state.showDelete && (\n <Button\n size={BTN_SMALL}\n type={TYPE_FAILURE}\n messageId=\"userDocForm.remove\"\n onClick={this.onDeleteClick}\n />\n )}\n\n <Button\n size={BTN_SMALL}\n type={TYPE_SECONDARY}\n messageId=\"form.return\"\n onClick={this.onReturnClick}\n />\n </ButtonActionGroup>\n );\n }\n}\n\nexport default connect(null, mapDispatch)(Actions);\n","import React from \"react\";\nimport { Map } from \"immutable\";\nimport styled from \"styled-components\";\nimport { connect } from \"react-redux\";\nimport { i18n } from \"../../services\";\nimport { isMobile, mysqlDateToArabic } from \"../../helpers\";\nimport { Table } from \"../../lib\";\nimport { UD_EDITOR, UD_AUTHOR } from \"../../settings\";\n\nimport { fetchPages } from \"../../reducers/pages/actions\";\nimport { fetchDocUsers } from \"../../reducers/doc_users/actions\";\n\nimport Actions from \"./Actions\";\nimport { AppState } from \"../../store\";\n\nexport const Container = styled.div``;\n\ntype OwnProps = {\n doc_id: number;\n status: string;\n};\nconst mapDispatch = {\n fetchPages,\n fetchDocUsers,\n};\nconst mapStateToProps = (\n { user, pages, doc_users, settings }: AppState,\n { doc_id }: OwnProps\n) => ({\n user,\n pages: Map<string, any>(\n // @ts-ignore\n pages.filter((p: any) => p.get(\"doc_id\") === doc_id)\n ),\n // @ts-ignore\n doc_users: doc_users.filter((du: any) => du.get(\"doc_id\") === doc_id),\n // @ts-ignore\n docLastOpened: settings.get(\"docLastOpened\") as Map<number, boolean>,\n});\n\ntype StateProps = ReturnType<typeof mapStateToProps>;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps & DispatchProps & OwnProps;\ntype State = {\n selected: string[];\n};\n\nclass List extends React.Component<Props, State> {\n constructor(props: Props) {\n super(props);\n this.state = {\n selected: [],\n };\n }\n\n componentDidMount() {\n const { doc_id, pages, docLastOpened } = this.props;\n\n if (!docLastOpened.has(doc_id) || pages.size === 0) {\n this.props.fetchPages({ doc_id });\n }\n\n this.props.fetchDocUsers({ doc_id });\n }\n\n onRowClick = (row: Record<string, string | number>) => {\n if (![UD_EDITOR, UD_AUTHOR].includes(this.props.status)) {\n return;\n }\n\n const id = `${row.doc_id}-${row.user_id}`;\n const { selected } = this.state;\n this.setState({ selected: selected.includes(id) ? [] : [id] });\n };\n\n isSelected = (row: Record<string, string | number>) =>\n this.state.selected.includes(`${row.doc_id}-${row.user_id}`);\n\n table() {\n const { doc_users, user } = this.props;\n let fields = [\"name\", \"status\", \"updated_at\"];\n let titles = [\"user.name\", \"user.status\", \"form.date\"];\n\n if (isMobile()) {\n fields = [\"name\", \"status\"];\n titles = [\"user.name\", \"user.status\"];\n }\n\n const transform: Record<string, (value: any) => string> = {\n updated_at: mysqlDateToArabic,\n status: (status: string) => i18n.get(`userDocForm.status${status}`),\n };\n\n const width = [\"60%\", \"20%\", \"20%\"];\n\n // @ts-ignore\n const user_id = user.get(\"id\");\n const list = doc_users.toList();\n const rows = list.toJS();\n const focusedRowId = list.indexOf(\n list.find((v: any) => v.get(\"user_id\") === user_id)\n );\n\n return (\n <Table\n width={width}\n titles={titles}\n fields={fields}\n transform={transform}\n rows={rows}\n focusedRowIndex={focusedRowId}\n isSelected={this.isSelected}\n onRowClick={this.onRowClick}\n />\n );\n }\n\n clearSelected = () => this.setState({ selected: [] });\n\n render() {\n const { doc_users, status, pages, doc_id, docLastOpened } = this.props;\n if (doc_users.size === 0 || pages.size === 0) {\n return null;\n }\n\n const { selected } = this.state;\n let selectedRow = null;\n if (selected.length > 0) {\n selectedRow = doc_users.get(selected[0]);\n }\n\n let lastOpened = pages.min((p: any) => p.position).get(\"id\");\n if (docLastOpened.has(doc_id)) {\n lastOpened = docLastOpened.get(doc_id);\n }\n\n return (\n <Container>\n <Actions\n status={status}\n page_id={lastOpened}\n doc_id={doc_id}\n doc_users={doc_users as Map<any, any>}\n size={doc_users.size}\n selected={selected}\n selectedRow={selectedRow as Map<string, string>}\n clearSelected={this.clearSelected}\n />\n {this.table()}\n </Container>\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(List);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { fetchDocUser } from \"../../reducers/doc_users/actions\";\nimport { UD_EDITOR, UD_AUTHOR } from \"../../settings\";\nimport { Content, Container } from \"../../pages/Template\";\nimport AddUserLink from \"./AddUserLink\";\nimport List from \"./List\";\nimport { isMobile, setWindowTitle } from \"../../helpers\";\nimport { AppState } from \"../../store\";\n\nconst mapStateToProps = (\n { doc_users, user }: AppState,\n {\n match: {\n params: { doc_id },\n },\n }: { match: { params: { doc_id: string } } }\n) => ({\n doc_id: parseInt(doc_id),\n // @ts-ignore\n user_id: user.get(\"id\"),\n // @ts-ignore\n loggedInDocUser: doc_users.get(`${doc_id}-${user.get(\"id\")}`) as Map<\n string,\n string\n >,\n});\nconst mapDispatch = { fetchDocUser };\ntype StateProps = ReturnType<typeof mapStateToProps>;\ntype DispatchProps = typeof mapDispatch;\n\ntype Props = StateProps & DispatchProps;\ntype State = {\n status: string;\n};\n\nclass DocUsersPage extends React.Component<Props, State> {\n static paths = [\"/app/users/:doc_id\"];\n static requiresAuth = true;\n\n constructor(props: Props) {\n super(props);\n this.state = {\n status: \"\",\n };\n }\n\n componentDidMount() {\n const { doc_id, user_id } = this.props;\n this.props.fetchDocUser({ doc_id, user_id });\n\n setWindowTitle(\"دستاویز سے متعلق صارف\");\n }\n\n componentWillReceiveProps(nextProps: Props) {\n const { loggedInDocUser } = nextProps;\n if (loggedInDocUser) {\n this.setState({\n status: loggedInDocUser.get(\"status\")!,\n });\n }\n }\n\n render() {\n const { status } = this.state;\n const { doc_id } = this.props;\n\n return (\n <Content isLandingPage={isMobile()}>\n <Container width=\"800px\">\n {[UD_EDITOR, UD_AUTHOR].includes(status) && (\n <AddUserLink doc_id={doc_id} />\n )}\n <List doc_id={doc_id} status={status} />\n </Container>\n </Content>\n );\n }\n}\n\nexport default connect(mapStateToProps, mapDispatch)(DocUsersPage);\n","import React from \"react\";\nimport DocUserForm from \"../components/Forms/DocUserForm\";\nimport { Content, Container } from \"../pages/Template\";\nimport { isMobile } from \"../helpers\";\nimport { RouteMatch } from \"../lib\";\n\ntype Props = {\n match: RouteMatch;\n};\nexport class DocUsersFormPage extends React.Component<Props> {\n static paths = [\n \"/app/users/:doc_id/create\",\n \"/app/users/edit/:doc_id/:user_id\",\n ];\n static requiresAuth = true;\n\n render() {\n const match = this.props.match;\n return (\n <Content isLandingPage={isMobile()}>\n <Container width=\"500px\">\n <DocUserForm\n match={match}\n doc_id={parseInt(match.params.doc_id)}\n user_id={parseInt(match.params.user_id)}\n editing={\n this.props.match.path.indexOf(\"create\") === -1\n ? \"Edit\"\n : \"Create\"\n }\n />\n </Container>\n </Content>\n );\n }\n}\n","import React from \"react\";\n\nexport default class AdminPage<T, U> extends React.Component<T, U> {\n static requiresAuth = true;\n static requiresAdmin = true;\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\n\nconst Input = styled.input.attrs({\n type: \"number\",\n})`\n pointer-events: all;\n outline: none;\n direction: ltr;\n margin: 0 2px 0 0;\n border: 0;\n width: 100%;\n height: 30px;\n line-height: 30px;\n font-size: 20px;\n font-family: \"Source Code Pro\", monospace;\n text-align: right;\n color: #fff;\n background-color: transparent;\n`;\n\ntype Props = {\n value: number;\n onChange: (evt: React.ChangeEvent<HTMLInputElement>) => void;\n};\n\nexport default class TextField extends React.Component<Props> {\n preventEvent = (evt: React.MouseEvent | React.FocusEvent) => {\n evt.preventDefault();\n evt.stopPropagation();\n };\n\n render() {\n return (\n <Input\n value={this.props.value}\n onChange={this.props.onChange}\n onFocus={this.preventEvent}\n onClick={this.preventEvent}\n />\n );\n }\n}\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { star } from \"../../images\";\nimport Weight from \"./Weight\";\n\nconst Container = styled.div`\n position: absolute;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n padding: 0 10px 0 0;\n right: 20%;\n top: 33%;\n height: 30px;\n align-items: center;\n border-radius: 2px;\n width: 70%;\n background-color: rgba(0, 0, 0, 0.7);\n`;\nconst Image = styled.img.attrs({\n src: star,\n})`\n width: 20px;\n height: 20px;\n`;\n\ntype Props = {\n doc_id: number;\n weight: number;\n onWeightChange: (doc_id: number, value: number) => void;\n};\n\nexport default function FeaturedMark({\n doc_id,\n weight,\n onWeightChange,\n}: Props) {\n return (\n <Container>\n <Image />\n <Weight\n value={weight}\n onChange={(e) =>\n onWeightChange(doc_id, parseInt(e.target.value))\n }\n />\n </Container>\n );\n}\n","export default \"data:image/png;base64,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\"","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Content } from \"../../pages/Template\";\nimport AdminPage from \"../../admin/AdminPage\";\nimport { Featured } from \"../../models\";\nimport { Results, Book } from \"../../components\";\nimport FeaturedMark from \"./FeaturedMark\";\nimport { AppState } from \"../../store\";\nimport { AxiosResponse } from \"axios\";\nimport { ReaderDoc } from \"../../components/Reader/PageContents/index\";\n\nfunction isFeatured(id: number, featured: Record<number, number>) {\n return typeof featured[id] !== \"undefined\";\n}\n\nconst mapState = ({ user }: AppState) => ({ user });\ntype StateProps = ReturnType<typeof mapState>;\ntype Props = StateProps & {};\ntype List = Array<ReaderDoc>;\ntype Stats = {\n offset: number;\n limit: number;\n total: number;\n};\ntype State = {\n featured: Record<number, number>;\n list: List;\n stats: Stats;\n};\n\nclass FeaturedAdminPage extends AdminPage<Props, State> {\n static paths = [\"/app/a/featured\"];\n\n constructor(props: Props) {\n super(props);\n this.state = {\n featured: {},\n list: [],\n stats: {\n offset: 0,\n limit: 0,\n total: 0,\n },\n };\n }\n\n async componentDidMount() {\n await this.fetch();\n await this.fetchFeatured();\n }\n\n async componentWillReceiveProps(_nextProps: Props, _nextContext: any) {\n await this.fetch();\n }\n\n loading = false;\n async fetch(concat = false) {\n if (this.loading) {\n return;\n }\n this.loading = true;\n\n try {\n const {\n stats: { offset, limit },\n } = this.state;\n const params = [\n \"includeMeta=true\",\n `offset=${concat ? offset + limit : 0}`,\n ];\n\n const {\n data: { list, stats },\n }: AxiosResponse<{\n list: List;\n stats: Stats;\n }> = await Featured.list({\n url: params.join(\"&\"),\n });\n\n this.setState({\n stats,\n list: concat ? this.state.list.concat(list) : list,\n });\n this.loading = false;\n } catch (e) {\n console.warn(e);\n }\n }\n\n loadingFeatured = false;\n async fetchFeatured() {\n if (this.loadingFeatured) {\n return;\n }\n this.loadingFeatured = true;\n\n const {\n data,\n }: AxiosResponse<\n Array<{\n id: number;\n doc_id: number;\n weight: number;\n }>\n > = await Featured.fetch(\"doc_ids\");\n const featured: Record<number, number> = {};\n data.forEach((v) => (featured[v.doc_id] = v.weight));\n this.setState({ featured });\n\n this.loadingFeatured = false;\n }\n\n onMore = async () => {\n await this.fetch(true);\n };\n\n onClick = async ({ id }: { id: number }) => {\n if (isFeatured(id, this.state.featured)) {\n await Featured.destroy(id);\n } else {\n await Featured.save({ doc_id: id }, \"\");\n }\n await this.fetchFeatured();\n };\n\n onWeightChange = async (doc_id: number, weight: number) => {\n const { featured } = this.state;\n if (featured[doc_id] !== weight) {\n featured[doc_id] = weight;\n this.setState({ featured: { ...featured } });\n await Featured.save({ doc_id, weight }, \"weight\");\n }\n };\n\n render() {\n const { featured, list, stats } = this.state;\n if (list.length === 0) {\n return null;\n }\n\n return (\n <Content>\n <Results stats={stats} onMore={this.onMore}>\n {list.map((item) => (\n <Book\n {...item}\n width={160}\n key={`book-${item.id}`}\n onClick={() => this.onClick(item)}\n >\n {isFeatured(item.id, featured) ? (\n <FeaturedMark\n doc_id={item.id}\n weight={featured[item.id]}\n onWeightChange={this.onWeightChange}\n />\n ) : undefined}\n </Book>\n ))}\n </Results>\n </Content>\n );\n }\n}\n\nexport default connect(mapState)(FeaturedAdminPage);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { useLocation, useParams } from \"react-router-dom\";\nimport { isLoggedIn, isUserAdmin } from \"../../helpers\";\nimport { ReducerState } from \"../../helpers/reducers\";\nimport { Navigator } from \"../../lib/routing/Navigator\";\nimport Header from \"../../pages/Template/Header\";\nimport { AppState } from \"../../store\";\nimport \"./App.css\";\nimport AppRehydrate from \"./AppRehydrate\";\nimport AppUser from \"./AppUser\";\nimport { configureRoutes } from \"./routes\";\nimport { usePageViews } from \"./tracking\";\nimport * as pages from \"../../pages\";\nimport * as admin from \"../../admin\";\n\nconst mapStateToProps = (state: AppState) => ({\n user: state.user,\n settings: state.settings,\n});\n\ntype StateProps = {\n user: ReducerState;\n settings: ReducerState;\n};\n\ntype Props = StateProps;\n\nfunction App(props: Props) {\n usePageViews();\n const location = useLocation();\n const params = useParams();\n\n const isAuth = isLoggedIn(props.user);\n const isAdmin = isUserAdmin(props.user);\n\n return (\n <AppRehydrate>\n <AppUser>\n <Header location={location} />\n {configureRoutes({\n list: admin,\n isAuth,\n isAdmin,\n location,\n match: {\n params,\n },\n })}\n\n {configureRoutes({\n list: pages,\n isAuth,\n isAdmin,\n location,\n match: {\n params,\n },\n })}\n <Navigator />\n </AppUser>\n </AppRehydrate>\n );\n}\n\nexport default connect(mapStateToProps)(App);\n","import ReactGA from \"react-ga\";\nimport { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\nexport function usePageViews() {\n let location = useLocation();\n ReactGA.initialize(\"UA-120972226-1\");\n\n useEffect(() => {\n ReactGA.pageview(window.location.pathname + window.location.search);\n }, [location]);\n}\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Provider } from \"react-redux\";\nimport { IntlProvider } from \"react-intl\";\nimport { BrowserRouter as Router } from \"react-router-dom\";\nimport { store } from \"./store\";\nimport App from \"./components/App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport { DEFAULT_LOCALE, translations } from \"./lib/i18n\";\n\nReactDOM.render(\n <React.StrictMode>\n <Provider store={store}>\n <IntlProvider\n locale={DEFAULT_LOCALE}\n messages={translations[DEFAULT_LOCALE]}\n >\n <Router>\n <App />\n </Router>\n </IntlProvider>\n </Provider>\n </React.StrictMode>,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}