{"version":3,"file":"misago.js","mappings":"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","sources":["webpack://misago/webpack/runtime/chunk loaded","webpack://misago/webpack/runtime/load script","webpack://misago/./src/components/Api/ApiFetch.jsx","webpack://misago/./src/components/Api/ApiMutation.jsx","webpack://misago/./src/components/Dropdown/Dropdown.jsx","webpack://misago/./src/components/Dropdown/DropdownDivider.jsx","webpack://misago/./src/components/Dropdown/DropdownFooter.jsx","webpack://misago/./src/components/Dropdown/DropdownHeader.jsx","webpack://misago/./src/components/Dropdown/DropdownMenuItem.jsx","webpack://misago/./src/components/Dropdown/DropdownPills.jsx","webpack://misago/./src/components/Dropdown/DropdownSubheader.jsx","webpack://misago/./src/components/FlexRow/FlexRow.jsx","webpack://misago/./src/components/FlexRow/FlexRowCol.jsx","webpack://misago/./src/components/FlexRow/FlexRowSection.jsx","webpack://misago/./src/components/ListGroup/ListGroup.jsx","webpack://misago/./src/components/ListGroup/ListGroupItem.jsx","webpack://misago/./src/components/ListGroup/ListGroupEmpty.jsx","webpack://misago/./src/components/ListGroup/ListGroupError.jsx","webpack://misago/./src/components/ListGroup/ListGroupLoading.jsx","webpack://misago/./src/components/ListGroup/ListGroupMessage.jsx","webpack://misago/./src/components/NotificationsFetch/NotificationsFetch.jsx","webpack://misago/./src/components/NotificationsFetch/index.js","webpack://misago/./src/components/NotificationsList/NotificationsListEmpty.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListGroup.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemActor.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemMessage.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemReadStatus.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItemTimestamp.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListItem.jsx","webpack://misago/./src/components/NotificationsList/NotificationsList.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListError.jsx","webpack://misago/./src/components/NotificationsList/NotificationsListLoading.jsx","webpack://misago/./src/components/Overlay/Overlay.jsx","webpack://misago/./src/components/Overlay/OverlayHeader.jsx","webpack://misago/./src/components/PageContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeader.jsx","webpack://misago/./src/components/PageHeader/PageHeaderBanner.jsx","webpack://misago/./src/components/PageHeader/PageHeaderContainer.jsx","webpack://misago/./src/components/PageHeader/PageHeaderDetails.jsx","webpack://misago/./src/components/PageHeader/PageHeaderHTMLMessage.jsx","webpack://misago/./src/components/PageHeader/PageHeaderMessage.jsx","webpack://misago/./src/components/PageHeader/PageHeaderPlain.jsx","webpack://misago/./src/components/password-strength.js","webpack://misago/./src/components/register.js","webpack://misago/./src/components/RegisterButton/index.js","webpack://misago/./src/components/RegisterButton/RegisterButton.jsx","webpack://misago/./src/components/RegisterLegalFootnote.js","webpack://misago/./src/components/Search/SearchResultsList.jsx","webpack://misago/./src/components/Search/SearchMessage.jsx","webpack://misago/./src/components/Search/SearchResultPost.jsx","webpack://misago/./src/components/Search/SearchResultUser.jsx","webpack://misago/./src/components/Search/SearchResults.jsx","webpack://misago/./src/components/Search/SearchResultsEmpty.jsx","webpack://misago/./src/components/Search/SearchResultsError.jsx","webpack://misago/./src/components/Search/SearchResultsLoading.jsx","webpack://misago/./src/components/Search/SearchFetch.jsx","webpack://misago/./src/components/Search/SearchInput.jsx","webpack://misago/./src/components/Search/SearchQuery.jsx","webpack://misago/./src/components/Search/SearchDropdown.jsx","webpack://misago/./src/components/Search/SearchOverlay.jsx","webpack://misago/./src/components/SignInButton/index.js","webpack://misago/./src/components/SignInButton/SignInButton.jsx","webpack://misago/./src/components/SiteNav/SiteNavMenu.jsx","webpack://misago/./src/components/SiteNav/SiteNavDropdown.jsx","webpack://misago/./src/components/SiteNav/SiteNavOverlay.jsx","webpack://misago/./src/components/StartSocialAuth.js","webpack://misago/./src/components/ThreadFlags.jsx","webpack://misago/./src/components/ThreadReplies.jsx","webpack://misago/./src/components/Timestamp/Timestamp.jsx","webpack://misago/./src/components/Timestamp/index.js","webpack://misago/./src/components/Toolbar/Toolbar.jsx","webpack://misago/./src/components/Toolbar/ToolbarItem.jsx","webpack://misago/./src/components/Toolbar/ToolbarSection.jsx","webpack://misago/./src/components/Toolbar/ToolbarSpacer.jsx","webpack://misago/./src/components/change-avatar/index.js","webpack://misago/./src/components/change-avatar/crop.js","webpack://misago/./src/components/change-avatar/upload.js","webpack://misago/./src/components/change-avatar/gallery.js","webpack://misago/./src/components/change-avatar/root.js","webpack://misago/./src/components/UserNav/logout.js","webpack://misago/./src/components/UserNav/UserNavMenu.jsx","webpack://misago/./src/components/UserNav/UserNavDropdown.jsx","webpack://misago/./src/components/UserNav/UserNavOverlay.jsx","webpack://misago/./src/components/avatar.js","webpack://misago/./src/components/button.js","webpack://misago/./src/components/category-select.js","webpack://misago/./src/components/edit-details/blankslate.js","webpack://misago/./src/components/edit-details/loader.js","webpack://misago/./src/components/edit-details/field-input.js","webpack://misago/./src/components/edit-details/fieldset.js","webpack://misago/./src/components/edit-details/form.js","webpack://misago/./src/components/edit-details/index.js","webpack://misago/./src/components/form-group.js","webpack://misago/./src/components/form.js","webpack://misago/./src/components/li.js","webpack://misago/./src/components/loader.js","webpack://misago/./src/components/merge-conflict.js","webpack://misago/./src/services/one-box.js","webpack://misago/./src/components/misago-markup.js","webpack://misago/./src/components/modal-loader.js","webpack://misago/./src/components/modal-message.js","webpack://misago/./src/components/panel-loader.js","webpack://misago/./src/components/panel-message.js","webpack://misago/./src/components/post-feed/post/body.js","webpack://misago/./src/components/post-feed/post/header.js","webpack://misago/./src/components/post-feed/post/post-side/button.js","webpack://misago/./src/components/post-feed/post/post-side/anonymous.js","webpack://misago/./src/components/post-feed/post/post-side/user-title.js","webpack://misago/./src/components/post-feed/post/post-side/registered.js","webpack://misago/./src/components/post-feed/post/post-side/index.js","webpack://misago/./src/components/post-feed/post/index.js","webpack://misago/./src/components/post-feed/preview.js","webpack://misago/./src/components/post-feed/index.js","webpack://misago/./src/components/posting/PostingQuoteSelection.jsx","webpack://misago/./src/components/posting/getQuoteMarkup.js","webpack://misago/./src/components/posting/globalState.js","webpack://misago/./src/components/posting/utils/attachments.js","webpack://misago/./src/components/MarkupEditor/MarkupAttachmentModal.jsx","webpack://misago/./src/components/MarkupEditor/operations.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachment.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorAttachments.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorFooter.jsx","webpack://misago/./src/components/MarkupEditor/MarkupCodeModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupFormattingHelpModal.jsx","webpack://misago/./src/components/MarkupEditor/isUrl.js","webpack://misago/./src/components/MarkupEditor/MarkupImageModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupLinkModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupQuoteModal.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditorButton.jsx","webpack://misago/./src/components/MarkupEditor/uploadFile.js","webpack://misago/./src/components/MarkupEditor/MarkupEditorToolbar.jsx","webpack://misago/./src/components/MarkupEditor/MarkupEditor.jsx","webpack://misago/./src/components/MarkupEditor/index.js","webpack://misago/./src/components/posting/PostingDialog.jsx","webpack://misago/./src/components/posting/PostingDialogBody.jsx","webpack://misago/./src/components/posting/PostingDialogError.jsx","webpack://misago/./src/components/posting/PostingDialogHeader.jsx","webpack://misago/./src/components/posting/PostingThreadOptions.jsx","webpack://misago/./src/components/posting/start.js","webpack://misago/./src/components/posting/utils/usernames.js","webpack://misago/./src/components/posting/start-private.js","webpack://misago/./src/components/posting/reply.js","webpack://misago/./src/components/posting/edit.js","webpack://misago/./src/components/posting/index.js","webpack://misago/./src/components/posting/utils/validators.js","webpack://misago/./src/components/select.js","webpack://misago/./src/components/sign-in.js","webpack://misago/./src/components/user-status.js","webpack://misago/./src/components/username-history/list-empty.js","webpack://misago/./src/components/username-history/change.js","webpack://misago/./src/components/username-history/list-ready.js","webpack://misago/./src/components/username-history/change-preview.js","webpack://misago/./src/components/username-history/list-preview.js","webpack://misago/./src/components/username-history/root.js","webpack://misago/./src/components/users-list/card/stats.js","webpack://misago/./src/components/users-list/card/user-title.js","webpack://misago/./src/components/users-list/card/index.js","webpack://misago/./src/components/users-list/preview/card.js","webpack://misago/./src/components/users-list/preview/index.js","webpack://misago/./src/components/users-list/index.js","webpack://misago/./src/components/with-dropdown.js","webpack://misago/./src/components/yes-no-switch.js","webpack://misago/./src/datetimeFormats.js","webpack://misago/./src/utils/ordered-list.js","webpack://misago/./src/liveTimestamps.js","webpack://misago/./src/index.js","webpack://misago/./src/initializers/ajax.js","webpack://misago/./src/initializers/auth-sync.js","webpack://misago/./src/initializers/auth.js","webpack://misago/./src/initializers/captcha.js","webpack://misago/./src/components/accept-agreement.js","webpack://misago/./src/initializers/components/accept-agreement.js","webpack://misago/./src/components/auth-message.js","webpack://misago/./src/initializers/components/auth-message.js","webpack://misago/./src/initializers/components/banned-page.js","webpack://misago/./src/components/SignInModalAutoOpen.js","webpack://misago/./src/components/Navbar/NavbarBranding.jsx","webpack://misago/./src/components/Navbar/NavbarExtraMenu.jsx","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdownBody.jsx","webpack://misago/./src/components/NotificationsDropdown/index.js","webpack://misago/./src/components/NotificationsDropdown/NotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsToggle.jsx","webpack://misago/./src/components/Navbar/NavbarNotificationsDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarPrivateThreads.jsx","webpack://misago/./src/components/Navbar/NavbarSearchToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSearchDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarSiteNavDropdown.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavToggle.jsx","webpack://misago/./src/components/Navbar/NavbarUserNavDropdown.jsx","webpack://misago/./src/components/Navbar/Navbar.jsx","webpack://misago/./src/components/Navbar/index.js","webpack://misago/./src/initializers/components/navbar.js","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlayBody.jsx","webpack://misago/./src/components/NotificationsOverlay/NotificationsOverlay.jsx","webpack://misago/./src/components/NotificationsOverlay/index.js","webpack://misago/./src/initializers/components/notifications-overlay.js","webpack://misago/./src/components/Notifications/NotificationsHeader.jsx","webpack://misago/./src/components/PageTitle/index.js","webpack://misago/./src/components/PageTitle/PageTitle.jsx","webpack://misago/./src/components/PillsNav/PillsNav.jsx","webpack://misago/./src/components/PillsNav/PillsNavLink.jsx","webpack://misago/./src/components/Notifications/NotificationsPills.jsx","webpack://misago/./src/components/Notifications/NotificationsPagination.jsx","webpack://misago/./src/components/Notifications/NotificationsToolbar.jsx","webpack://misago/./src/components/Notifications/NotificationsRoute.jsx","webpack://misago/./src/components/Notifications/index.js","webpack://misago/./src/components/Notifications/Notifications.jsx","webpack://misago/./src/initializers/components/notifications.js","webpack://misago/./src/components/options/navs.js","webpack://misago/./src/components/options/delete-account.js","webpack://misago/./src/components/options/edit-details.js","webpack://misago/./src/components/options/download-data.js","webpack://misago/./src/components/options/forum-options.js","webpack://misago/./src/components/options/change-username/form-loading.js","webpack://misago/./src/components/options/change-username/form-locked.js","webpack://misago/./src/components/options/change-username/form.js","webpack://misago/./src/components/options/change-username/root.js","webpack://misago/./src/components/options/sign-in-credentials/change-email.js","webpack://misago/./src/components/options/sign-in-credentials/change-password.js","webpack://misago/./src/components/options/sign-in-credentials/UnusablePasswordMessage.js","webpack://misago/./src/components/options/sign-in-credentials/root.js","webpack://misago/./src/components/options/root.js","webpack://misago/./src/initializers/components/options.js","webpack://misago/./src/components/profile/ban-details.js","webpack://misago/./src/components/profile/details/form.js","webpack://misago/./src/components/profile/details/empty-message.js","webpack://misago/./src/components/profile/details/field-value.js","webpack://misago/./src/components/profile/details/field.js","webpack://misago/./src/components/profile/details/group.js","webpack://misago/./src/components/profile/details/groups-list.js","webpack://misago/./src/components/profile/details/header.js","webpack://misago/./src/data/profile-details.js","webpack://misago/./src/components/profile/details/index.js","webpack://misago/./src/components/profile/feed/route.js","webpack://misago/./src/components/quick-search.js","webpack://misago/./src/components/profile/followers.js","webpack://misago/./src/components/profile/follows.js","webpack://misago/./src/components/profile/username-history.js","webpack://misago/./src/components/profile/follow-button.js","webpack://misago/./src/components/profile/message-button.js","webpack://misago/./src/components/profile/moderation/avatar-controls.js","webpack://misago/./src/components/profile/moderation/change-username.js","webpack://misago/./src/components/profile/moderation/delete-account.js","webpack://misago/./src/components/profile/moderation/nav.js","webpack://misago/./src/components/profile/ProfileDataList.jsx","webpack://misago/./src/components/profile/ProfileHeader.jsx","webpack://misago/./src/components/profile/ProfileNav.js","webpack://misago/./src/components/profile/root.js","webpack://misago/./src/components/profile/feed/index.js","webpack://misago/./src/initializers/components/profile.js","webpack://misago/./src/components/request-activation-link.js","webpack://misago/./src/initializers/components/request-activation-link.js","webpack://misago/./src/components/request-password-reset.js","webpack://misago/./src/initializers/components/request-password-reset.js","webpack://misago/./src/components/reset-password-form.js","webpack://misago/./src/initializers/components/reset-password-form.js","webpack://misago/./src/initializers/components/search-overlay.js","webpack://misago/./src/components/search-route/form.js","webpack://misago/./src/components/search-route/sidenav.js","webpack://misago/./src/components/search-route/page.js","webpack://misago/./src/components/search-route/threads/results.js","webpack://misago/./src/components/search-route/threads/index.js","webpack://misago/./src/components/search-route/users/index.js","webpack://misago/./src/components/search-route/index.js","webpack://misago/./src/initializers/components/search.js","webpack://misago/./src/initializers/components/site-nav-overlay.js","webpack://misago/./src/components/snackbar.js","webpack://misago/./src/initializers/components/snackbar.js","webpack://misago/./src/components/social-auth/header.js","webpack://misago/./src/components/social-auth/register.js","webpack://misago/./src/components/social-auth/complete.js","webpack://misago/./src/components/social-auth/index.js","webpack://misago/./src/initializers/components/social-auth.js","webpack://misago/./src/components/add-participant.js","webpack://misago/./src/components/participants/add-participant.js","webpack://misago/./src/components/participants/cards-list/make-owner.js","webpack://misago/./src/components/participants/cards-list/actions.js","webpack://misago/./src/components/participants/cards-list/remove.js","webpack://misago/./src/components/participants/cards-list/card.js","webpack://misago/./src/components/participants/cards-list/index.js","webpack://misago/./src/components/participants/index.js","webpack://misago/./src/components/participants/utils.js","webpack://misago/./src/components/poll/results/chart.js","webpack://misago/./src/components/poll/results/modal.js","webpack://misago/./src/components/poll/results/options.js","webpack://misago/./src/components/poll/info.js","webpack://misago/./src/components/poll/results/index.js","webpack://misago/./src/components/poll/voting/help.js","webpack://misago/./src/components/poll/voting/select.js","webpack://misago/./src/components/poll/voting/utils.js","webpack://misago/./src/components/poll/voting/index.js","webpack://misago/./src/components/poll/poll.js","webpack://misago/./src/components/poll/form/choices-control.js","webpack://misago/./src/components/poll/form/index.js","webpack://misago/./src/components/posts-list/event/icon.js","webpack://misago/./src/components/posts-list/event/controls.js","webpack://misago/./src/components/posts-list/event/info.js","webpack://misago/./src/components/posts-list/event/message.js","webpack://misago/./src/components/posts-list/event/unread-label.js","webpack://misago/./src/components/posts-list/waypoint.js","webpack://misago/./src/components/posts-list/event/index.js","webpack://misago/./src/components/posts-list/post/attachments/attachment.js","webpack://misago/./src/components/posts-list/post/attachments/index.js","webpack://misago/./src/components/posts-list/post/body.js","webpack://misago/./src/components/posts-list/post/flags.js","webpack://misago/./src/components/posts-list/post/controls/actions.js","webpack://misago/./src/components/post-likes.js","webpack://misago/./src/components/posts-list/post/footer.js","webpack://misago/./src/components/posts-list/post/controls/move.js","webpack://misago/./src/components/post-changelog/diff.js","webpack://misago/./src/components/post-changelog/footer.js","webpack://misago/./src/components/post-changelog/toolbar.js","webpack://misago/./src/components/post-changelog/utils.js","webpack://misago/./src/components/post-changelog/index.js","webpack://misago/./src/components/posts-list/post/controls/split.js","webpack://misago/./src/components/posts-list/post/controls/dropdown.js","webpack://misago/./src/components/posts-list/post/controls/index.js","webpack://misago/./src/components/posts-list/post/select.js","webpack://misago/./src/components/posts-list/post/header.js","webpack://misago/./src/components/posts-list/post/post-side/anonymous.js","webpack://misago/./src/components/posts-list/post/post-side/has-visible-title.js","webpack://misago/./src/components/posts-list/post/post-side/user-postcount.js","webpack://misago/./src/components/posts-list/post/post-side/user-status.js","webpack://misago/./src/components/posts-list/post/post-side/user-title.js","webpack://misago/./src/components/posts-list/post/post-side/registered.js","webpack://misago/./src/components/posts-list/post/post-side/index.js","webpack://misago/./src/components/posts-list/post/index.js","webpack://misago/./src/components/posts-list/post/preview.js","webpack://misago/./src/components/posts-list/index.js","webpack://misago/./src/components/ThreadStarterCard.jsx","webpack://misago/./src/components/thread/moderation/thread/ThreadChangeTitleModal.jsx","webpack://misago/./src/components/thread/moderation/thread/merge.js","webpack://misago/./src/components/thread/moderation/thread/move.js","webpack://misago/./src/components/thread/moderation/thread/controls.js","webpack://misago/./src/components/thread/moderation/thread/index.js","webpack://misago/./src/components/thread/ThreadModeration.jsx","webpack://misago/./src/components/thread/ThreadWatchButton.jsx","webpack://misago/./src/components/Breadcrumbs/Breadcrumbs.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsCategory.jsx","webpack://misago/./src/components/Breadcrumbs/BreadcrumbsRootCategory.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeaderBreadcrumbs.jsx","webpack://misago/./src/components/thread/ThreadHeader/ThreadHeader.jsx","webpack://misago/./src/components/thread/ThreadHeader/index.js","webpack://misago/./src/components/thread/ThreadPaginator.jsx","webpack://misago/./src/components/thread/moderation/posts/errors-list.js","webpack://misago/./src/components/thread/moderation/posts/actions.js","webpack://misago/./src/components/thread/moderation/posts/move.js","webpack://misago/./src/components/thread/moderation/posts/split.js","webpack://misago/./src/components/thread/moderation/posts/dropdown.js","webpack://misago/./src/components/thread/ThreadPostsModeration.jsx","webpack://misago/./src/components/thread/ThreadReplyButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarBottom.jsx","webpack://misago/./src/components/thread/ThreadToolbarThird.jsx","webpack://misago/./src/components/thread/ThreadPollButton.jsx","webpack://misago/./src/components/thread/ThreadShortcutsButton.jsx","webpack://misago/./src/components/thread/ThreadToolbarTop.jsx","webpack://misago/./src/components/thread/route.js","webpack://misago/./src/components/thread/root.js","webpack://misago/./src/initializers/components/thread.js","webpack://misago/./src/components/threads/compare.js","webpack://misago/./src/components/threads/ThreadsCategoryPicker.jsx","webpack://misago/./src/components/threads/ThreadsListPicker.jsx","webpack://misago/./src/components/threads/moderation/errors-list.js","webpack://misago/./src/components/threads/moderation/merge.js","webpack://misago/./src/components/threads/moderation/move.js","webpack://misago/./src/components/threads/moderation/controls.js","webpack://misago/./src/components/threads/ThreadsToolbarModeration.jsx","webpack://misago/./src/components/threads/ThreadsToolbar.jsx","webpack://misago/./src/components/threads/container.js","webpack://misago/./src/components/threads/utils.js","webpack://misago/./src/components/ThreadsList/ThreadsListEmpty.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemActivity.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemCategory.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemCheckbox.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemLastPoster.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemNotifications.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemReadStatus.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemStarter.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItemTitle.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListItem.jsx","webpack://misago/./src/components/UIPreview/UIPreviewText.js","webpack://misago/./src/components/ThreadsList/ThreadsListLoader.jsx","webpack://misago/./src/components/ThreadsList/ThreadsListUpdatePrompt.jsx","webpack://misago/./src/components/ThreadsList/index.js","webpack://misago/./src/components/ThreadsList/ThreadsList.jsx","webpack://misago/./src/components/threads/route.js","webpack://misago/./src/initializers/components/threads.js","webpack://misago/./src/components/threads/root.js","webpack://misago/./src/initializers/components/user-nav-overlay.js","webpack://misago/./src/components/users/UsersNav.js","webpack://misago/./src/components/users/active-posters/list-empty.js","webpack://misago/./src/components/users/active-posters/list-item-preview.js","webpack://misago/./src/components/users/active-posters/list-preview.js","webpack://misago/./src/components/users/active-posters/list-item.js","webpack://misago/./src/components/users/active-posters/list-ready.js","webpack://misago/./src/components/users/active-posters/root.js","webpack://misago/./src/components/page-lead.js","webpack://misago/./src/utils/string-count.js","webpack://misago/./src/components/users/rank/RankUsersList.js","webpack://misago/./src/components/users/rank/RankUsersListLoader.js","webpack://misago/./src/components/users/rank/RankUsersLeft.jsx","webpack://misago/./src/components/users/rank/RankUsersPagination.jsx","webpack://misago/./src/components/users/rank/RankUsersToolbar.jsx","webpack://misago/./src/components/users/rank/root.js","webpack://misago/./src/components/users/root.js","webpack://misago/./src/initializers/components/users.js","webpack://misago/./src/initializers/include.js","webpack://misago/./src/initializers/local-storage.js","webpack://misago/./src/services/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/mobile-navbar-dropdown.js","webpack://misago/./src/initializers/modal.js","webpack://misago/./src/initializers/moment-locale.js","webpack://misago/./src/initializers/page-title.js","webpack://misago/./src/initializers/polls.js","webpack://misago/./src/initializers/posting.js","webpack://misago/./src/initializers/reducers/auth.js","webpack://misago/./src/initializers/reducers/overlay.js","webpack://misago/./src/initializers/reducers/participants.js","webpack://misago/./src/initializers/reducers/poll.js","webpack://misago/./src/initializers/reducers/posts.js","webpack://misago/./src/initializers/reducers/profile-details.js","webpack://misago/./src/initializers/reducers/profile-hydrate.js","webpack://misago/./src/initializers/reducers/profile.js","webpack://misago/./src/initializers/reducers/search.js","webpack://misago/./src/initializers/reducers/selection.js","webpack://misago/./src/initializers/reducers/snackbar.js","webpack://misago/./src/initializers/reducers/thread.js","webpack://misago/./src/initializers/reducers/threads.js","webpack://misago/./src/initializers/reducers/tick.js","webpack://misago/./src/initializers/reducers/username-history.js","webpack://misago/./src/initializers/reducers/users.js","webpack://misago/./src/initializers/snackbar.js","webpack://misago/./src/initializers/store.js","webpack://misago/./src/initializers/tick-start.js","webpack://misago/./src/initializers/zxcvbn.js","webpack://misago/./src/reducers/auth.js","webpack://misago/./src/reducers/overlay.js","webpack://misago/./src/reducers/participants.js","webpack://misago/./src/reducers/poll.js","webpack://misago/./src/reducers/post.js","webpack://misago/./src/reducers/posts.js","webpack://misago/./src/reducers/profile-details.js","webpack://misago/./src/reducers/profile.js","webpack://misago/./src/reducers/search.js","webpack://misago/./src/reducers/selection.js","webpack://misago/./src/reducers/snackbar.js","webpack://misago/./src/reducers/thread.js","webpack://misago/./src/reducers/threads.js","webpack://misago/./src/reducers/tick.js","webpack://misago/./src/reducers/username-history.js","webpack://misago/./src/reducers/users.js","webpack://misago/./src/services/ajax.js","webpack://misago/./src/services/auth.js","webpack://misago/./src/services/captcha.js","webpack://misago/./src/services/include.js","webpack://misago/./src/services/local-storage.js","webpack://misago/./src/services/modal.js","webpack://misago/./src/services/page-title.js","webpack://misago/./src/services/polls.js","webpack://misago/./src/services/posting.js","webpack://misago/./src/services/snackbar.js","webpack://misago/./src/services/store.js","webpack://misago/./src/services/zxcvbn.js","webpack://misago/./src/components/banned-page.js","webpack://misago/./src/utils/banned-page.js","webpack://misago/./src/utils/batch.js","webpack://misago/./src/utils/concat-unique.js","webpack://misago/./src/utils/escape-html.js","webpack://misago/./src/utils/file-size.js","webpack://misago/./src/utils/getRandomString.js","webpack://misago/./src/utils/mount-component.js","webpack://misago/./src/utils/random.js","webpack://misago/./src/utils/routed-component.js","webpack://misago/./src/utils/sets.js","webpack://misago/./src/utils/validators.js","webpack://misago/./node_modules/moment/locale/ sync ^\\.\\/.*$","webpack://misago/webpack/bootstrap","webpack://misago/webpack/runtime/compat get default export","webpack://misago/webpack/runtime/define property getters","webpack://misago/webpack/runtime/ensure chunk","webpack://misago/webpack/runtime/get javascript chunk filename","webpack://misago/webpack/runtime/get mini-css chunk filename","webpack://misago/webpack/runtime/global","webpack://misago/webpack/runtime/harmony module decorator","webpack://misago/webpack/runtime/hasOwnProperty shorthand","webpack://misago/webpack/runtime/make namespace object","webpack://misago/webpack/runtime/node module decorator","webpack://misago/webpack/runtime/publicPath","webpack://misago/webpack/runtime/jsonp chunk loading","webpack://misago/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"misago:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import React from \"react\"\n\nexport default class ApiFetch extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      data: null,\n      loading: false,\n      error: null,\n    }\n\n    this.controller = new AbortController()\n    this.signal = this.controller.signal\n  }\n\n  componentDidMount() {\n    if (this.props.url && !this.props.disabled) {\n      this.request(this.props.url)\n    }\n  }\n\n  componentDidUpdate(prevProps) {\n    const url = this.props.url\n    const urlChanged = url && url !== prevProps.url\n    const disabledChanged = this.props.disabled != prevProps.disabled\n\n    if (urlChanged || disabledChanged) {\n      if (!this.props.disabled) {\n        if (this.hasCache(url)) {\n          this.getCache(url)\n        } else {\n          this.controller.abort()\n\n          this.controller = new AbortController()\n          this.signal = this.controller.signal\n          this.request(url)\n        }\n      } else {\n        this.controller.abort()\n      }\n    }\n  }\n\n  componentWillUnmount() {\n    this.controller.abort()\n  }\n\n  hasCache = (url) => {\n    return this.props.cache && this.props.cache[url]\n  }\n\n  getCache = async (url) => {\n    const data = this.props.cache[url]\n    this.setState({ loading: false, error: null, data })\n    if (this.props.onData) {\n      await this.props.onData(data)\n    }\n  }\n\n  setCache = (url, data) => {\n    if (this.props.cache) {\n      this.props.cache[url] = data\n    }\n  }\n\n  request = (url) => {\n    this.setState({ loading: true })\n\n    fetch(url, {\n      method: \"GET\",\n      credentials: \"include\",\n      signal: this.signal,\n    }).then(\n      async (response) => {\n        if (url === this.props.url) {\n          if (response.status == 200) {\n            const data = await response.json()\n            this.setState({ loading: false, error: null, data })\n            this.setCache(url, data)\n            if (this.props.onData) {\n              await this.props.onData(data)\n            }\n          } else {\n            const error = { status: response.status }\n            if (response.headers.get(\"Content-Type\") === \"application/json\") {\n              error.data = await response.json()\n            }\n            this.setState({ loading: false, error })\n          }\n        }\n      },\n      (rejection) => {\n        if (url === this.props.url) {\n          this.setState({ loading: false, error: { status: 0, rejection } })\n        }\n      }\n    )\n  }\n\n  refetch = () => {\n    this.request(this.props.url)\n  }\n\n  update = (mutation) => {\n    this.setState((state) => {\n      return { data: mutation(state.data) }\n    })\n  }\n\n  render() {\n    return this.props.children(\n      Object.assign({ refetch: this.refetch, update: this.update }, this.state)\n    )\n  }\n}\n","import React from \"react\"\n\nexport default class ApiMutation extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      data: null,\n      loading: false,\n      error: null,\n    }\n  }\n\n  mutate = (options) => {\n    this.setState({ loading: true })\n\n    fetch(this.props.url, {\n      method: this.props.method || \"POST\",\n      credentials: \"include\",\n      headers: headers(options),\n      body: body(options),\n    }).then(\n      async (response) => {\n        if (response.status == 200) {\n          const data = await response.json()\n          this.setState({ loading: false, data })\n          if (options.onSuccess) {\n            await options.onSuccess(data)\n          }\n        } else if (response.status == 204) {\n          this.setState({ loading: false })\n          if (options.onSuccess) {\n            await options.onSuccess()\n          }\n        } else {\n          const error = { status: response.status }\n          if (response.headers.get(\"Content-Type\") === \"application/json\") {\n            error.data = await response.json()\n          }\n          this.setState({ loading: false, error })\n          if (options.onError) {\n            await options.onError(error)\n          }\n        }\n      },\n      async (rejection) => {\n        const error = { status: 0, rejection }\n        this.setState({ loading: false, error })\n        if (options.onError) {\n          await options.onError(error)\n        }\n      }\n    )\n  }\n\n  render() {\n    return this.props.children(this.mutate, this.state)\n  }\n}\n\nfunction headers(options) {\n  if (!!options.json) {\n    return {\n      \"Content-Type\": \"application/json; charset=utf-8\",\n      \"X-CSRFToken\": csrfToken(),\n    }\n  }\n\n  return {\n    \"X-CSRFToken\": csrfToken(),\n  }\n}\n\nfunction body(options) {\n  if (!!options.json) {\n    return JSON.stringify(options.json)\n  }\n\n  return undefined\n}\n\nfunction csrfToken() {\n  const cookieName = window.misago_csrf\n\n  if (document.cookie.indexOf(cookieName) !== -1) {\n    const cookieRegex = new RegExp(cookieName + \"=([^;]*)\")\n    const cookie = document.cookie.match(cookieRegex)[0]\n    return cookie ? cookie.split(\"=\")[1] : null\n  } else {\n    return null\n  }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default class Dropdown extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isOpen: false,\n    }\n\n    this.root = null\n    this.dropdown = null\n  }\n\n  componentDidMount() {\n    window.addEventListener(\"click\", this.handleClick)\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"click\", this.handleClick)\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    const didUpdate = prevState.isOpen !== this.state.isOpen\n    if (didUpdate) {\n      if (this.state.isOpen && this.props.onOpen) {\n        this.props.onOpen(this.root)\n      }\n\n      if (!this.state.isOpen && this.props.onClose) {\n        this.props.onClose(this.root)\n      }\n    }\n  }\n\n  handleClick = (event) => {\n    if (\n      this.state.isOpen &&\n      (!this.root.contains(event.target) ||\n        (this.menu.contains(event.target) && event.target.closest(\"a\")))\n    ) {\n      this.setState({ isOpen: false })\n    }\n  }\n\n  toggle = () => {\n    this.setState((prevState) => {\n      return { isOpen: !prevState.isOpen }\n    })\n  }\n\n  close = () => {\n    this.setState({ isOpen: false })\n  }\n\n  render() {\n    const { isOpen } = this.state\n\n    return (\n      <div\n        id={this.props.id}\n        className={classnames(\n          \"dropdown\",\n          { open: isOpen },\n          this.props.className\n        )}\n        ref={(element) => {\n          if (element && !this.element) {\n            this.root = element\n          }\n        }}\n      >\n        {this.props.toggle({\n          isOpen,\n          toggle: this.toggle,\n          aria: ariaProps(isOpen),\n        })}\n        <div\n          className={classnames(\n            \"dropdown-menu\",\n            { \"dropdown-menu-right\": this.props.menuAlignRight },\n            this.props.menuClassName\n          )}\n          ref={(element) => {\n            if (element && !this.menu) {\n              this.menu = element\n            }\n          }}\n          role=\"menu\"\n        >\n          {this.props.children({ isOpen, close: this.close })}\n        </div>\n      </div>\n    )\n  }\n}\n\nfunction ariaProps(isOpen) {\n  return {\n    \"aria-haspopup\": \"true\",\n    \"aria-expanded\": isOpen ? \"true\" : \"false\",\n  }\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownDivider({ className }) {\n  return <li className={classnames(\"divider\", className)}></li>\n}\n","import React from \"react\"\n\nexport default function DropdownFooter({ children, listItem }) {\n  if (listItem) {\n    return <li className=\"dropdown-footer\">{children}</li>\n  }\n\n  return <div className=\"dropdown-footer\">{children}</div>\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownHeader({ className, children }) {\n  return (\n    <div className={classnames(\"dropdown-header\", className)}>{children}</div>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownMenuItem({ className, children }) {\n  return (\n    <li className={classnames(\"dropdown-menu-item\", className)}>{children}</li>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownPills({ className, children }) {\n  return (\n    <div className={classnames(\"dropdown-pills\", className)}>{children}</div>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function DropdownSubheader({ className, children }) {\n  return (\n    <li className={classnames(\"dropdown-subheader\", className)}>{children}</li>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRow = ({ children, className }) => (\n  <div className={classnames(\"flex-row\", className)}>{children}</div>\n)\n\nexport default FlexRow\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowCol = ({ children, className, shrink }) => (\n  <div\n    className={classnames(\"flex-row-col\", className, {\n      \"flex-row-col-shrink\": shrink,\n    })}\n  >\n    {children}\n  </div>\n)\n\nexport default FlexRowCol\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst FlexRowSection = ({ auto, children, className }) => (\n  <div\n    className={classnames(\n      \"flex-row-section\",\n      { \"flex-row-section-auto\": auto },\n      className\n    )}\n  >\n    {children}\n  </div>\n)\n\nexport default FlexRowSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroup({ className, children }) {\n  return <ul className={classnames(\"list-group\", className)}>{children}</ul>\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function ListGroupItem({ className, children }) {\n  return (\n    <li className={classnames(\"list-group-item\", className)}>{children}</li>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupEmpty({ className, icon, message }) {\n  return (\n    <ListGroupItem className={classnames(\"list-group-empty\", className)}>\n      {!!icon && (\n        <div className=\"list-group-empty-icon\">\n          <span className=\"material-icon\">{icon}</span>\n        </div>\n      )}\n      <p className=\"list-group-empty-message\">{message}</p>\n    </ListGroupItem>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupError({ className, icon, message, detail }) {\n  return (\n    <ListGroupItem className={classnames(\"list-group-error\", className)}>\n      {!!icon && (\n        <div className=\"list-group-error-icon\">\n          <span className=\"material-icon\">{icon}</span>\n        </div>\n      )}\n      <p className=\"list-group-error-message\">{message}</p>\n      {!!detail && <p className=\"list-group-error-detail\">{detail}</p>}\n    </ListGroupItem>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupLoading({ className, message }) {\n  return (\n    <ListGroupItem className={classnames(\"list-group-loading\", className)}>\n      <p className=\"list-group-loading-message\">{message}</p>\n      <div className=\"list-group-loading-progress\">\n        <div className=\"list-group-loading-progress-bar\"></div>\n      </div>\n    </ListGroupItem>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ListGroupItem from \"./ListGroupItem\"\n\nexport default function ListGroupMessage({ className, icon, message, detail }) {\n  return (\n    <ListGroupItem className={classnames(\"list-group-message\", className)}>\n      {!!icon && (\n        <div className=\"list-group-message-icon\">\n          <span className=\"material-icon\">{icon}</span>\n        </div>\n      )}\n      <p className=\"list-group-message-message\">{message}</p>\n      {!!detail && <p className=\"list-group-message-detail\">{detail}</p>}\n    </ListGroupItem>\n  )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport { ApiFetch } from \"../Api\"\n\nfunction NotificationsFetch({\n  children,\n  filter,\n  query,\n  dispatch,\n  unreadNotifications,\n  disabled,\n}) {\n  return (\n    <ApiFetch\n      url={getApiUrl(filter, query)}\n      disabled={disabled}\n      onData={(data) => {\n        if (data.unreadNotifications != unreadNotifications) {\n          dispatch(\n            updateAuthenticatedUser({\n              unreadNotifications: data.unreadNotifications,\n            })\n          )\n        }\n      }}\n    >\n      {({ data, loading, error, refetch }) => {\n        return children({ data, loading, error, refetch })\n      }}\n    </ApiFetch>\n  )\n}\n\nfunction getApiUrl(filter, query) {\n  let api = misago.get(\"NOTIFICATIONS_API\") + \"?limit=30\"\n  api += \"&filter=\" + filter\n\n  if (query) {\n    if (query.after) {\n      api += \"&after=\" + query.after\n    }\n    if (query.before) {\n      api += \"&before=\" + query.before\n    }\n  }\n\n  return api\n}\n\nfunction selectState({ auth }) {\n  if (!auth.user) {\n    return { unreadNotifications: null }\n  }\n\n  return {\n    unreadNotifications: auth.user.unreadNotifications,\n  }\n}\n\nconst NotificationsFetchConnected = connect(selectState)(NotificationsFetch)\n\nexport default NotificationsFetchConnected\n","import NotificationsFetch from \"./NotificationsFetch\"\n\nexport default NotificationsFetch\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\n\nexport default function NotificationsListEmpty({ filter }) {\n  return (\n    <ListGroupEmpty\n      icon={\n        filter === \"unread\" ? \"sentiment_very_satisfied\" : \"notifications_none\"\n      }\n      message={emptyMessage(filter)}\n    />\n  )\n}\n\nfunction emptyMessage(filter) {\n  if (filter === \"read\") {\n    return pgettext(\n      \"notifications list\",\n      \"You don't have any read notifications.\"\n    )\n  } else if (filter === \"unread\") {\n    return pgettext(\n      \"notifications list\",\n      \"You don't have any unread notifications.\"\n    )\n  }\n\n  return pgettext(\"notifications list\", \"You don't have any notifications.\")\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function NotificationsListGroup({ className, children }) {\n  return (\n    <div className={classnames(\"notifications-list\", className)}>\n      <ListGroup>{children}</ListGroup>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NotificationsListItemActor({ notification }) {\n  if (!!notification.actor) {\n    return (\n      <a\n        href={notification.actor.url}\n        className=\"notifications-list-item-actor\"\n        title={notification.actor.username}\n      >\n        <Avatar size={30} user={notification.actor} />\n      </a>\n    )\n  }\n\n  return (\n    <span\n      className=\"threads-list-item-last-poster\"\n      title={notification.actor_name || null}\n    >\n      <Avatar size={30} />\n    </span>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NotificationsListItemMessage({ notification }) {\n  return (\n    <a\n      href={notification.url}\n      className={classnames(\"notification-message\", {\n        \"notification-message-read\": notification.isRead,\n        \"notification-message-unread\": !notification.isRead,\n      })}\n      dangerouslySetInnerHTML={{ __html: notification.message }}\n    />\n  )\n}\n","import React from \"react\"\n\nexport default function NotificationsListItemReadStatus({ notification }) {\n  if (notification.isRead) {\n    return (\n      <div\n        className=\"notifications-list-item-read-status\"\n        title={pgettext(\"notification status\", \"Read notification\")}\n      >\n        <span className=\"notification-read-icon\"></span>\n      </div>\n    )\n  }\n\n  return (\n    <div\n      className=\"notifications-list-item-read-status\"\n      title={pgettext(\"notification status\", \"Unread notification\")}\n    >\n      <span className=\"notification-unread-icon\"></span>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function NotificationsListItemTimestamp({ notification }) {\n  return (\n    <div className=\"notifications-list-item-timestamp\">\n      <Timestamp datetime={notification.createdAt} />\n    </div>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport NotificationsListItemActor from \"./NotificationsListItemActor\"\nimport NotificationsListItemMessage from \"./NotificationsListItemMessage\"\nimport NotificationsListItemReadStatus from \"./NotificationsListItemReadStatus\"\nimport NotificationsListItemTimestamp from \"./NotificationsListItemTimestamp\"\n\nexport default function NotificationsListItem({ notification }) {\n  return (\n    <ListGroupItem\n      key={notification.id}\n      className={classnames(\"notifications-list-item\", {\n        \"notifications-list-item-read\": notification.isRead,\n        \"notifications-list-item-unread\": !notification.isRead,\n      })}\n    >\n      <div className=\"notifications-list-item-left-col\">\n        <div className=\"notifications-list-item-col-actor\">\n          <NotificationsListItemActor notification={notification} />\n        </div>\n        <div className=\"notifications-list-item-col-read-icon\">\n          <NotificationsListItemReadStatus notification={notification} />\n        </div>\n      </div>\n      <div className=\"notifications-list-item-right-col\">\n        <div className=\"notifications-list-item-col-message\">\n          <NotificationsListItemMessage notification={notification} />\n        </div>\n        <div className=\"notifications-list-item-col-timestamp\">\n          <NotificationsListItemTimestamp notification={notification} />\n        </div>\n      </div>\n    </ListGroupItem>\n  )\n}\n","import React from \"react\"\nimport NotificationsListEmpty from \"./NotificationsListEmpty\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\nimport NotificationsListItem from \"./NotificationsListItem\"\n\nexport default function NotificationsList({ filter, items }) {\n  return (\n    <NotificationsListGroup\n      className={\n        items.length > 0\n          ? \"notifications-list-ready\"\n          : \"notifications-list-pending\"\n      }\n    >\n      {items.length === 0 && <NotificationsListEmpty filter={filter} />}\n      {items.map((notification) => (\n        <NotificationsListItem\n          key={notification.id}\n          notification={notification}\n        />\n      ))}\n    </NotificationsListGroup>\n  )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListError({ error }) {\n  const detail = errorDetail(error)\n\n  return (\n    <NotificationsListGroup className=\"notifications-list-pending\">\n      <ListGroupError\n        icon=\"notifications_off\"\n        message={pgettext(\n          \"notifications list\",\n          \"Notifications could not be loaded.\"\n        )}\n        detail={detail}\n      />\n    </NotificationsListGroup>\n  )\n}\n\nfunction errorDetail(error) {\n  if (error.status === 0) {\n    return gettext(\n      \"Check your internet connection and try refreshing the site.\"\n    )\n  }\n\n  if (error.data && error.data.detail) {\n    return error.data.detail\n  }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport NotificationsListGroup from \"./NotificationsListGroup\"\n\nexport default function NotificationsListLoading() {\n  return (\n    <NotificationsListGroup className=\"notifications-list-pending\">\n      <ListGroupLoading\n        message={pgettext(\"notifications list\", \"Loading notifications...\")}\n      />\n    </NotificationsListGroup>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nconst BODY_CLASS = \"has-overlay\"\n\nclass Overlay extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.scrollOrigin = null\n  }\n\n  componentDidUpdate(prevProps) {\n    if (prevProps.open !== this.props.open) {\n      if (this.props.open) {\n        this.scrollOrigin = window.pageYOffset\n        document.body.classList.add(BODY_CLASS)\n        if (this.props.onOpen) {\n          this.props.onOpen()\n        }\n      } else {\n        document.body.classList.remove(BODY_CLASS)\n        window.scrollTo(0, this.scrollOrigin)\n        this.scrollOrigin = null\n      }\n    }\n  }\n\n  closeOnNavigation = (event) => {\n    if (event.target.closest(\"a\")) {\n      this.props.dispatch(close())\n    }\n  }\n\n  render() {\n    return (\n      <div\n        className={classnames(\"overlay\", this.props.className, {\n          \"overlay-open\": this.props.open,\n        })}\n        onClick={this.closeOnNavigation}\n      >\n        {this.props.children}\n      </div>\n    )\n  }\n}\n\nconst OverlayConnected = connect()(Overlay)\n\nexport default OverlayConnected\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\n\nexport function OverlayHeader({ children, dispatch }) {\n  return (\n    <div className=\"overlay-header\">\n      <div className=\"overlay-header-caption\">{children}</div>\n      <button\n        className=\"btn btn-overlay-close\"\n        title={pgettext(\"modal\", \"Close\")}\n        type=\"button\"\n        onClick={() => dispatch(close())}\n      >\n        <span className=\"material-icon\">close</span>\n      </button>\n    </div>\n  )\n}\n\nconst OverlayHeaderConnected = connect()(OverlayHeader)\n\nexport default OverlayHeaderConnected\n","import React from \"react\"\n\nconst PageContainer = ({ children }) => (\n  <div className=\"container page-container\">{children}</div>\n)\n\nexport default PageContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeader = ({ children, className, styleName }) => (\n  <div\n    className={classnames(\n      \"page-header\",\n      className,\n      styleName && \"page-header-\" + styleName\n    )}\n  >\n    <div className=\"page-header-bg-image\">\n      <div className=\"page-header-bg-overlay\">\n        <div className=\"page-header-image\" />\n        {children}\n      </div>\n    </div>\n  </div>\n)\n\nexport default PageHeader\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderBanner = ({ children, className, styleName }) => (\n  <div\n    className={classnames(\n      \"page-header-banner\",\n      className,\n      styleName && \"page-header-banner-\" + styleName\n    )}\n  >\n    <div className=\"page-header-banner-bg-image\">\n      <div className=\"page-header-banner-bg-overlay\">{children}</div>\n    </div>\n  </div>\n)\n\nexport default PageHeaderBanner\n","import React from \"react\"\n\nconst PageHeaderContainer = ({ children }) => (\n  <div className=\"container page-header-container\">{children}</div>\n)\n\nexport default PageHeaderContainer\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderDetails = ({ children, className }) => (\n  <div className={classnames(\"page-header-details\", className)}>{children}</div>\n)\n\nexport default PageHeaderDetails\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderHTMLMessage = ({ className, message }) => (\n  <div\n    className={classnames(\"page-header-message\", className)}\n    dangerouslySetInnerHTML={{ __html: message }}\n  />\n)\n\nexport default PageHeaderHTMLMessage\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst PageHeaderMessage = ({ children, className }) => (\n  <div className={classnames(\"page-header-message\", className)}>{children}</div>\n)\n\nexport default PageHeaderMessage\n","import React from \"react\"\nimport PageHeader from \"./PageHeader\"\nimport PageHeaderBanner from \"./PageHeaderBanner\"\nimport PageHeaderContainer from \"./PageHeaderContainer\"\nimport PageHeaderDetails from \"./PageHeaderDetails\"\n\nconst PageHeaderPlain = ({ styleName, header, message }) => (\n  <PageHeaderContainer>\n    <PageHeader styleName={styleName}>\n      <PageHeaderBanner styleName={styleName}>\n        <h1>{header}</h1>\n      </PageHeaderBanner>\n      {message && (\n        <PageHeaderDetails styleName={styleName}>{message}</PageHeaderDetails>\n      )}\n    </PageHeader>\n  </PageHeaderContainer>\n)\n\nexport default PageHeaderPlain\n","import React from \"react\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport const STYLES = [\n  \"progress-bar-danger\",\n  \"progress-bar-warning\",\n  \"progress-bar-warning\",\n  \"progress-bar-primary\",\n  \"progress-bar-success\",\n]\n\nexport const LABELS = [\n  pgettext(\"password strength indicator\", \"Entered password is very weak.\"),\n  pgettext(\"password strength indicator\", \"Entered password is weak.\"),\n  pgettext(\"password strength indicator\", \"Entered password is average.\"),\n  pgettext(\"password strength indicator\", \"Entered password is strong.\"),\n  pgettext(\"password strength indicator\", \"Entered password is very strong.\"),\n]\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this._score = 0\n    this._password = null\n    this._inputs = []\n\n    this.state = {\n      loaded: false,\n    }\n  }\n\n  componentDidMount() {\n    zxcvbn.load().then(() => {\n      this.setState({ loaded: true })\n    })\n  }\n\n  getScore(password, inputs) {\n    let cacheStale = false\n\n    if (password !== this._password) {\n      cacheStale = true\n    }\n\n    if (inputs.length !== this._inputs.length) {\n      cacheStale = true\n    } else {\n      inputs.map((value, i) => {\n        if (value.trim() !== this._inputs[i]) {\n          cacheStale = true\n        }\n      })\n    }\n\n    if (cacheStale) {\n      this._score = zxcvbn.scorePassword(password, inputs)\n      this._password = password\n      this._inputs = inputs.map(function (value) {\n        return value.trim()\n      })\n    }\n\n    return this._score\n  }\n\n  render() {\n    if (!this.state.loaded) return null\n\n    let score = this.getScore(this.props.password, this.props.inputs)\n\n    return (\n      <div className=\"help-block password-strength\">\n        <div className=\"progress\">\n          <div\n            className={\"progress-bar \" + STYLES[score]}\n            style={{ width: 20 + 20 * score + \"%\" }}\n            role=\"progress-bar\"\n            aria-valuenow={score}\n            aria-valuemin=\"0\"\n            aria-valuemax=\"4\"\n          >\n            <span className=\"sr-only\">{LABELS[score]}</span>\n          </div>\n        </div>\n        <p className=\"text-small\">{LABELS[score]}</p>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport PasswordStrength from \"misago/components/password-strength\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport captcha from \"misago/services/captcha\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\nimport * as validators from \"misago/utils/validators\"\n\nexport class RegisterForm extends Form {\n  constructor(props) {\n    super(props)\n\n    const { username, password } = this.props.criteria\n\n    let passwordMinLength = 0\n    password.forEach((item) => {\n      if (item.name === \"MinimumLengthValidator\") {\n        passwordMinLength = item.min_length\n      }\n    })\n\n    const formValidators = {\n      username: [\n        validators.usernameContent(),\n        validators.usernameMinLength(username.min_length),\n        validators.usernameMaxLength(username.max_length),\n      ],\n      email: [validators.email()],\n      password: [validators.passwordMinLength(passwordMinLength)],\n      captcha: captcha.validator(),\n    }\n\n    if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n      formValidators.termsOfService = [validators.requiredTermsOfService()]\n    }\n\n    if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n      formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n    }\n\n    this.state = {\n      isLoading: false,\n\n      username: \"\",\n      email: \"\",\n      password: \"\",\n      captcha: \"\",\n\n      termsOfService: null,\n      privacyPolicy: null,\n\n      validators: formValidators,\n      errors: {},\n    }\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(gettext(\"Form contains errors.\"))\n      this.setState({\n        errors: this.validate(),\n      })\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"USERS_API\"), {\n      username: this.state.username,\n      email: this.state.email,\n      password: this.state.password,\n      captcha: this.state.captcha,\n      terms_of_service: this.state.termsOfService,\n      privacy_policy: this.state.privacyPolicy,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.props.callback(apiResponse)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      this.setState({\n        errors: Object.assign({}, this.state.errors, rejection),\n      })\n\n      if (rejection.__all__ && rejection.__all__.length > 0) {\n        snackbar.error(rejection.__all__[0])\n      } else {\n        snackbar.error(gettext(\"Form contains errors.\"))\n      }\n    } else if (rejection.status === 403 && rejection.ban) {\n      showBannedPage(rejection.ban)\n      modal.hide()\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  handlePrivacyPolicyChange = (event) => {\n    const value = event.target.value\n    this.handleToggleAgreement(\"privacyPolicy\", value)\n  }\n\n  handleTermsOfServiceChange = (event) => {\n    const value = event.target.value\n    this.handleToggleAgreement(\"termsOfService\", value)\n  }\n\n  handleToggleAgreement = (agreement, value) => {\n    this.setState((prevState, props) => {\n      if (prevState[agreement] === null) {\n        const errors = { ...prevState.errors, [agreement]: null }\n        return { errors, [agreement]: value }\n      }\n\n      const validator = this.state.validators[agreement][0]\n      const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n      return { errors, [agreement]: null }\n    })\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-register\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"register modal title\", \"Register\")}\n            </h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <input type=\"type\" style={{ display: \"none\" }} />\n            <input type=\"password\" style={{ display: \"none\" }} />\n            <div className=\"modal-body\">\n              <StartSocialAuth\n                buttonClassName=\"col-xs-12 col-sm-6\"\n                buttonLabel={pgettext(\n                  \"register modal field\",\n                  \"Join with %(site)s\"\n                )}\n                formLabel={pgettext(\n                  \"register modal field\",\n                  \"Or create forum account:\"\n                )}\n              />\n\n              <FormGroup\n                label={pgettext(\"register modal field\", \"Username\")}\n                for=\"id_username\"\n                validation={this.state.errors.username}\n              >\n                <input\n                  type=\"text\"\n                  id=\"id_username\"\n                  className=\"form-control\"\n                  aria-describedby=\"id_username_status\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"username\")}\n                  value={this.state.username}\n                />\n              </FormGroup>\n\n              <FormGroup\n                label={pgettext(\"register modal field\", \"E-mail\")}\n                for=\"id_email\"\n                validation={this.state.errors.email}\n              >\n                <input\n                  type=\"text\"\n                  id=\"id_email\"\n                  className=\"form-control\"\n                  aria-describedby=\"id_email_status\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"email\")}\n                  value={this.state.email}\n                />\n              </FormGroup>\n\n              <FormGroup\n                label={pgettext(\"register modal field\", \"Password\")}\n                for=\"id_password\"\n                validation={this.state.errors.password}\n                extra={\n                  <PasswordStrength\n                    password={this.state.password}\n                    inputs={[this.state.username, this.state.email]}\n                  />\n                }\n              >\n                <input\n                  type=\"password\"\n                  id=\"id_password\"\n                  className=\"form-control\"\n                  aria-describedby=\"id_password_status\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"password\")}\n                  value={this.state.password}\n                />\n              </FormGroup>\n\n              {captcha.component({\n                form: this,\n              })}\n\n              <RegisterLegalFootnote\n                errors={this.state.errors}\n                privacyPolicy={this.state.privacyPolicy}\n                termsOfService={this.state.termsOfService}\n                onPrivacyPolicyChange={this.handlePrivacyPolicyChange}\n                onTermsOfServiceChange={this.handleTermsOfServiceChange}\n              />\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"register modal btn\", \"Cancel\")}\n              </button>\n              <Button className=\"btn-primary\" loading={this.state.isLoading}>\n                {pgettext(\"register modal btn\", \"Register account\")}\n              </Button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport class RegisterComplete extends React.Component {\n  getLead() {\n    if (this.props.activation === \"user\") {\n      return pgettext(\n        \"account activation required\",\n        \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n      )\n    } else if (this.props.activation === \"admin\") {\n      return pgettext(\n        \"account activation required\",\n        \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n      )\n    }\n  }\n\n  getSubscript() {\n    if (this.props.activation === \"user\") {\n      return pgettext(\n        \"account activation required\",\n        \"We have sent an e-mail to %(email)s with link that you have to click to activate your account.\"\n      )\n    } else if (this.props.activation === \"admin\") {\n      return pgettext(\n        \"account activation required\",\n        \"We will send an e-mail to %(email)s when this takes place.\"\n      )\n    }\n  }\n\n  render() {\n    return (\n      <div\n        className=\"modal-dialog modal-message modal-register\"\n        role=\"document\"\n      >\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"register modal title\", \"Registration complete\")}\n            </h4>\n          </div>\n          <div className=\"modal-body\">\n            <div className=\"message-icon\">\n              <span className=\"material-icon\">info_outline</span>\n            </div>\n            <div className=\"message-body\">\n              <p className=\"lead\">\n                {interpolate(\n                  this.getLead(),\n                  { username: this.props.username },\n                  true\n                )}\n              </p>\n              <p>\n                {interpolate(\n                  this.getSubscript(),\n                  { email: this.props.email },\n                  true\n                )}\n              </p>\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                type=\"button\"\n              >\n                {pgettext(\"register modal dismiss\", \"Ok\")}\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      complete: false,\n    }\n  }\n\n  completeRegistration = (apiResponse) => {\n    if (apiResponse.activation === \"active\") {\n      modal.hide()\n      auth.signIn(apiResponse)\n    } else {\n      this.setState({\n        complete: apiResponse,\n      })\n    }\n  }\n\n  render() {\n    if (this.state.complete) {\n      return (\n        <RegisterComplete\n          activation={this.state.complete.activation}\n          email={this.state.complete.email}\n          username={this.state.complete.username}\n        />\n      )\n    }\n\n    return <RegisterForm callback={this.completeRegistration} {...this.props} />\n  }\n}\n","import RegisterButton from \"./RegisterButton\"\n\nexport default RegisterButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ajax from \"../../services/ajax\"\nimport captcha from \"../../services/captcha\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport Loader from \"../loader\"\nimport RegisterForm from \"../register.js\"\n\nexport default class RegisterButton extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      isLoaded: false,\n\n      criteria: null,\n    }\n  }\n\n  showRegisterForm = () => {\n    if (this.props.onClick) {\n      this.props.onClick()\n    }\n\n    if (misago.get(\"SETTINGS\").account_activation === \"closed\") {\n      snackbar.info(\n        pgettext(\n          \"register form\",\n          \"Registration form is currently disabled by the site administrator.\"\n        )\n      )\n    } else if (this.state.isLoaded) {\n      modal.show(<RegisterForm criteria={this.state.criteria} />)\n    } else {\n      this.setState({ isLoading: true })\n\n      Promise.all([\n        captcha.load(),\n        ajax.get(misago.get(\"AUTH_CRITERIA_API\")),\n      ]).then(\n        (result) => {\n          this.setState({\n            isLoading: false,\n            isLoaded: true,\n            criteria: result[1],\n          })\n\n          modal.show(<RegisterForm criteria={result[1]} />)\n        },\n        () => {\n          this.setState({ isLoading: false })\n\n          snackbar.error(\n            pgettext(\n              \"register form\",\n              \"Registration form is currently unavailable due to an error.\"\n            )\n          )\n        }\n      )\n    }\n  }\n\n  render() {\n    return (\n      <button\n        className={classnames(\"btn btn-register\", this.props.className, {\n          \"btn-block\": this.props.block,\n          \"btn-loading\": this.state.isLoading,\n        })}\n        disabled={this.state.isLoading}\n        onClick={this.showRegisterForm}\n        type=\"button\"\n      >\n        {pgettext(\"cta\", \"Register\")}\n        {this.state.isLoading ? <Loader /> : null}\n      </button>\n    )\n  }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst AGREEMENT_URL = '<a href=\"%(url)s\" target=\"_blank\">%(agreement)s</a>'\n\nconst RegisterLegalFootnote = (props) => {\n  const {\n    errors,\n    privacyPolicy,\n    termsOfService,\n    onPrivacyPolicyChange,\n    onTermsOfServiceChange,\n  } = props\n\n  const termsOfServiceId = misago.get(\"TERMS_OF_SERVICE_ID\")\n  const termsOfServiceUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n\n  const privacyPolicyId = misago.get(\"PRIVACY_POLICY_ID\")\n  const privacyPolicyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n\n  if (!termsOfServiceId && !privacyPolicyId) return null\n\n  return (\n    <div>\n      <LegalAgreement\n        agreement={pgettext(\n          \"register form agreement prompt\",\n          \"the terms of service\"\n        )}\n        checked={termsOfService !== null}\n        errors={errors.termsOfService}\n        url={termsOfServiceUrl}\n        value={termsOfServiceId}\n        onChange={onTermsOfServiceChange}\n      />\n      <LegalAgreement\n        agreement={pgettext(\n          \"register form agreement prompt\",\n          \"the privacy policy\"\n        )}\n        checked={privacyPolicy !== null}\n        errors={errors.privacyPolicy}\n        url={privacyPolicyUrl}\n        value={privacyPolicyId}\n        onChange={onPrivacyPolicyChange}\n      />\n    </div>\n  )\n}\n\nconst LegalAgreement = (props) => {\n  const { agreement, checked, errors, url, value, onChange } = props\n\n  if (!url) return null\n\n  const agreementHtml = interpolate(\n    AGREEMENT_URL,\n    { agreement: escapeHtml(agreement), url: escapeHtml(url) },\n    true\n  )\n  const label = interpolate(\n    pgettext(\n      \"register form agreement prompt\",\n      \"I have read and accept %(agreement)s.\"\n    ),\n    { agreement: agreementHtml },\n    true\n  )\n\n  return (\n    <div className=\"checkbox legal-footnote\">\n      <label>\n        <input\n          checked={checked}\n          type=\"checkbox\"\n          value={value}\n          onChange={onChange}\n        />\n        <span dangerouslySetInnerHTML={{ __html: label }} />\n      </label>\n      {errors &&\n        errors.map((error, i) => (\n          <div className=\"help-block errors\" key={i}>\n            {error}\n          </div>\n        ))}\n    </div>\n  )\n}\n\nexport default RegisterLegalFootnote\n","import React from \"react\"\nimport { ListGroup } from \"../ListGroup\"\n\nexport default function SearchResultsList({ children }) {\n  return <ListGroup className=\"search-results-list\">{children}</ListGroup>\n}\n","import React from \"react\"\nimport { ListGroupMessage } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchMessage() {\n  return (\n    <SearchResultsList>\n      <ListGroupMessage\n        message={pgettext(\n          \"search cta\",\n          \"Enter search query (at least 3 characters).\"\n        )}\n      />\n    </SearchResultsList>\n  )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultPost({ post }) {\n  return (\n    <ListGroupItem className=\"search-result\">\n      <a href={post.url.index}>\n        <div className=\"search-result-card\">\n          <div className=\"search-result-name\">{post.thread.title}</div>\n          <div\n            className=\"search-result-summary\"\n            dangerouslySetInnerHTML={{ __html: post.content }}\n          />\n          <ul className=\"search-result-details\">\n            <li>\n              <b>{post.category.name}</b>\n            </li>\n            <li>{post.poster ? post.poster.username : post.poster_name}</li>\n            <li>\n              <Timestamp datetime={post.posted_on} />\n            </li>\n          </ul>\n        </div>\n      </a>\n    </ListGroupItem>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport Timestamp from \"../Timestamp\"\n\nexport default function SearchResultUser({ user }) {\n  const title = user.title || user.rank.title\n\n  return (\n    <ListGroupItem className=\"search-result\">\n      <a href={user.url}>\n        <Avatar user={user} size={32} />\n        <div className=\"search-result-card\">\n          <div className=\"search-result-name\">{user.username}</div>\n          <ul className=\"search-result-details\">\n            {!!title && (\n              <li>\n                <b>{title}</b>\n              </li>\n            )}\n            <li>{user.rank.name}</li>\n            <li>\n              <Timestamp datetime={user.joined_on} />\n            </li>\n          </ul>\n        </div>\n      </a>\n    </ListGroupItem>\n  )\n}\n","import React from \"react\"\nimport { ListGroupItem } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\nimport SearchResultPost from \"./SearchResultPost\"\nimport SearchResultUser from \"./SearchResultUser\"\n\nexport default function SearchResults({ query, results }) {\n  const threads = results[0]\n  const users = results[1]\n\n  const { count } = threads.results\n\n  return (\n    <SearchResultsList>\n      {users.results.results.map((user) => (\n        <SearchResultUser key={user.id} user={user} />\n      ))}\n      {threads.results.results.map((post) => (\n        <SearchResultPost key={post.id} post={post} />\n      ))}\n      {count > 0 && (\n        <ListGroupItem>\n          <a\n            href={threads.url + \"?q=\" + encodeURIComponent(query)}\n            className=\"btn btn-default btn-block\"\n          >\n            {npgettext(\n              \"search results list\",\n              \"See all %(count)s result.\",\n              \"See all %(count)s results.\",\n              threads.results.count\n            ).replace(\"%(count)s\", threads.results.count)}\n          </a>\n        </ListGroupItem>\n      )}\n    </SearchResultsList>\n  )\n}\n","import React from \"react\"\nimport { ListGroupEmpty } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsEmpty() {\n  return (\n    <SearchResultsList>\n      <ListGroupEmpty\n        message={pgettext(\"search results\", \"The search returned no results.\")}\n      />\n    </SearchResultsList>\n  )\n}\n","import React from \"react\"\nimport { ListGroupError } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsError({ error }) {\n  return (\n    <SearchResultsList>\n      <ListGroupError\n        message={pgettext(\n          \"search results\",\n          \"The search could not be completed.\"\n        )}\n        detail={errorDetail(error)}\n      />\n    </SearchResultsList>\n  )\n}\n\nfunction errorDetail(error) {\n  if (error.status === 0) {\n    return gettext(\n      \"Check your internet connection and try refreshing the site.\"\n    )\n  }\n\n  if (error.data && error.data.detail) {\n    return error.data.detail\n  }\n}\n","import React from \"react\"\nimport { ListGroupLoading } from \"../ListGroup\"\nimport SearchResultsList from \"./SearchResultsList\"\n\nexport default function SearchResultsLoading() {\n  return (\n    <SearchResultsList>\n      <ListGroupLoading message={pgettext(\"search results\", \"Searching...\")} />\n    </SearchResultsList>\n  )\n}\n","import React from \"react\"\nimport { ApiFetch } from \"../Api\"\nimport SearchMessage from \"./SearchMessage\"\nimport SearchResults from \"./SearchResults\"\nimport SearchResultsEmpty from \"./SearchResultsEmpty\"\nimport SearchResultsError from \"./SearchResultsError\"\nimport SearchResultsLoading from \"./SearchResultsLoading\"\n\nconst DEBOUNCE = 750\nconst CACHE = {}\n\nexport default class SearchFetch extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      query: this.props.query.trim(),\n    }\n\n    this.debounce = null\n  }\n\n  componentDidUpdate() {\n    const query = this.props.query.trim()\n\n    if (this.state.query != query) {\n      if (this.debounce) {\n        window.clearTimeout(this.debounce)\n      }\n\n      this.debounce = window.setTimeout(() => {\n        this.setState({ query })\n      }, DEBOUNCE)\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.debounce) {\n      window.clearTimeout(this.debounce)\n    }\n  }\n\n  render() {\n    return (\n      <ApiFetch\n        url={getSearchUrl(this.state.query)}\n        cache={CACHE}\n        disabled={this.state.query.length < 3}\n      >\n        {({ data, loading, error }) => {\n          if (this.state.query.length < 3) {\n            return <SearchMessage />\n          }\n\n          if (loading) {\n            return <SearchResultsLoading />\n          }\n\n          if (error) {\n            return <SearchResultsError error={error} />\n          }\n\n          if (isResultEmpty(data)) {\n            return <SearchResultsEmpty />\n          }\n\n          if (data !== null) {\n            return <SearchResults query={this.state.query} results={data} />\n          }\n\n          return null\n        }}\n      </ApiFetch>\n    )\n  }\n}\n\nfunction getSearchUrl(query) {\n  return misago.get(\"SEARCH_API\") + \"?q=\" + encodeURIComponent(query)\n}\n\nfunction isResultEmpty(results) {\n  if (results === null) {\n    return true\n  }\n\n  let resultsCount = 0\n  results.forEach((result) => {\n    resultsCount += result.results.count\n  })\n  return resultsCount === 0\n}\n","import React from \"react\"\n\nexport default function SearchInput({ query, setQuery }) {\n  return (\n    <div className=\"search-input\">\n      <input\n        className=\"form-control form-control-search\"\n        type=\"text\"\n        placeholder={pgettext(\"cta\", \"Search\")}\n        value={query}\n        onChange={(event) => setQuery(event.target.value)}\n      />\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default class SearchQuery extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      query: \"\",\n    }\n  }\n\n  setQuery = (query) => {\n    this.setState({ query })\n  }\n\n  render() {\n    return this.props.children({\n      query: this.state.query,\n      setQuery: this.setQuery,\n    })\n  }\n}\n","import React from \"react\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nexport default function SearchDropdown() {\n  return (\n    <SearchQuery>\n      {({ query, setQuery }) => {\n        return (\n          <div className=\"search-dropdown-body\">\n            <SearchInput query={query} setQuery={setQuery} />\n            <SearchFetch query={query} />\n          </div>\n        )\n      }}\n    </SearchQuery>\n  )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SearchFetch from \"./SearchFetch\"\nimport SearchInput from \"./SearchInput\"\nimport SearchQuery from \"./SearchQuery\"\n\nfunction SearchOverlay({ open }) {\n  return (\n    <Overlay\n      open={open}\n      onOpen={() => {\n        window.setTimeout(() => {\n          document.querySelector(\"#search-mount .form-control-search\").focus()\n        }, 0)\n      }}\n    >\n      <OverlayHeader>{pgettext(\"cta\", \"Search\")}</OverlayHeader>\n      <SearchQuery>\n        {({ query, setQuery }) => {\n          return (\n            <div className=\"search-overlay-body\">\n              <SearchInput query={query} setQuery={setQuery} />\n              <div className=\"search-results-container\">\n                <SearchFetch query={query} />\n              </div>\n            </div>\n          )\n        }}\n      </SearchQuery>\n    </Overlay>\n  )\n}\n\nfunction select(state) {\n  return { open: state.overlay.search }\n}\n\nconst SearchOverlayConnected = connect(select)(SearchOverlay)\n\nexport default SearchOverlayConnected\n","import SignInButton from \"./SignInButton\"\n\nexport default SignInButton\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport modal from \"../../services/modal\"\nimport SignInModal from \"../sign-in\"\n\nexport default function SignInButton({ block, className, onClick }) {\n  const settings = misago.get(\"SETTINGS\")\n\n  if (settings.DELEGATE_AUTH) {\n    return (\n      <a\n        className={classnames(\"btn btn-sign-in\", className, {\n          \"btn-block\": block,\n        })}\n        href={settings.LOGIN_URL}\n        onClick={onClick}\n      >\n        {pgettext(\"cta\", \"Sign in\")}\n      </a>\n    )\n  }\n\n  return (\n    <button\n      className={classnames(\"btn btn-sign-in\", className, {\n        \"btn-block\": block,\n      })}\n      type=\"button\"\n      onClick={() => {\n        if (onClick) {\n          onClick()\n        }\n\n        modal.show(<SignInModal />)\n      }}\n    >\n      {pgettext(\"cta\", \"Sign in\")}\n    </button>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport {\n  DropdownDivider,\n  DropdownHeader,\n  DropdownMenuItem,\n  DropdownPills,\n  DropdownSubheader,\n} from \"../Dropdown\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\n\nfunction SiteNavMenu({ isAnonymous, close, dropdown, overlay }) {\n  const baseUrl = misago.get(\"MISAGO_PATH\")\n  const settings = misago.get(\"SETTINGS\")\n  const extraItems = misago.get(\"extraMenuItems\")\n  const extraFooterItems = misago.get(\"extraFooterItems\")\n  const categories = misago.get(\"categoriesMap\")\n  const users = misago.get(\"usersLists\")\n  const authDelegated = settings.enable_oauth2_client\n\n  const topNav = []\n  if (misago.get(\"THREADS_ON_INDEX\")) {\n    topNav.push({ title: pgettext(\"site nav\", \"Threads\"), url: baseUrl })\n    topNav.push({\n      title: pgettext(\"site nav\", \"Categories\"),\n      url: baseUrl + \"categories/\",\n    })\n  } else {\n    topNav.push({ title: pgettext(\"site nav\", \"Categories\"), url: baseUrl })\n    topNav.push({\n      title: pgettext(\"site nav\", \"Threads\"),\n      url: baseUrl + \"threads/\",\n    })\n  }\n\n  topNav.push({\n    title: pgettext(\"site nav\", \"Search\"),\n    url: baseUrl + \"search/\",\n  })\n\n  const footerNav = []\n\n  const tosTitle = misago.get(\"TERMS_OF_SERVICE_TITLE\")\n  const tosUrl = misago.get(\"TERMS_OF_SERVICE_URL\")\n  if (tosTitle && tosUrl) {\n    footerNav.push({\n      title: tosTitle,\n      url: tosUrl,\n    })\n  }\n\n  const privacyTitle = misago.get(\"PRIVACY_POLICY_TITLE\")\n  const privacyUrl = misago.get(\"PRIVACY_POLICY_URL\")\n  if (privacyTitle && privacyUrl) {\n    footerNav.push({\n      title: privacyTitle,\n      url: privacyUrl,\n    })\n  }\n\n  return (\n    <ul\n      className={classnames(\"site-nav-menu\", {\n        \"dropdown-menu-list\": dropdown,\n        \"overlay-menu-list\": overlay,\n      })}\n    >\n      {isAnonymous && (\n        <DropdownHeader className=\"site-nav-sign-in-message\">\n          {pgettext(\"cta\", \"You are not signed in\")}\n        </DropdownHeader>\n      )}\n      {isAnonymous && (\n        <DropdownPills className=\"site-nav-sign-in-options\">\n          <SignInButton onClick={close} />\n          {!authDelegated && <RegisterButton onClick={close} />}\n        </DropdownPills>\n      )}\n      <DropdownSubheader>{settings.forum_name}</DropdownSubheader>\n      {topNav.map((item) => (\n        <DropdownMenuItem key={item.url}>\n          <a href={item.url}>{item.title}</a>\n        </DropdownMenuItem>\n      ))}\n      {extraItems.map((item, index) => (\n        <DropdownMenuItem key={index} className={item.className}>\n          <a\n            href={item.url}\n            target={item.targetBlank ? \"_blank\" : null}\n            rel={item.rel}\n          >\n            {item.title}\n          </a>\n        </DropdownMenuItem>\n      ))}\n      {!!users.length && <DropdownDivider className=\"site-nav-users-divider\" />}\n      {!!users.length && (\n        <DropdownSubheader className=\"site-nav-users\">\n          {pgettext(\"site nav section\", \"Users\")}\n        </DropdownSubheader>\n      )}\n      {users.map((item) => (\n        <DropdownMenuItem key={item.url}>\n          <a href={item.url}>{item.name}</a>\n        </DropdownMenuItem>\n      ))}\n      <DropdownDivider className=\"site-nav-categories-divider\" />\n      <DropdownSubheader className=\"site-nav-categories\">\n        {pgettext(\"site nav section\", \"Categories\")}\n      </DropdownSubheader>\n      {categories.map((category) => (\n        <DropdownMenuItem className=\"site-nav-category\" key={category.id}>\n          <a href={category.url}>\n            <span>{category.name}</span>\n            <span\n              className={classnames(\n                \"threads-list-item-category threads-list-category-label\",\n                { \"threads-list-category-label-color\": !!category.color }\n              )}\n              style={{ \"--label-color\": category.color }}\n            >\n              {category.shortName || category.name}\n            </span>\n          </a>\n        </DropdownMenuItem>\n      ))}\n      {(!!footerNav.length || !!extraFooterItems.length) && (\n        <DropdownDivider className=\"site-nav-footer-divider\" />\n      )}\n      {(!!footerNav.length || !!extraFooterItems.length) && (\n        <DropdownSubheader className=\"site-nav-footer\">\n          {pgettext(\"site nav section\", \"Footer\")}\n        </DropdownSubheader>\n      )}\n      {extraFooterItems.map((item, index) => (\n        <DropdownMenuItem key={index} className={item.className}>\n          <a\n            href={item.url}\n            target={item.targetBlank ? \"_blank\" : null}\n            rel={item.rel}\n          >\n            {item.title}\n          </a>\n        </DropdownMenuItem>\n      ))}\n      {footerNav.map((item) => (\n        <DropdownMenuItem key={item.url}>\n          <a href={item.url}>{item.title}</a>\n        </DropdownMenuItem>\n      ))}\n    </ul>\n  )\n}\n\nfunction select(state) {\n  return {\n    isAnonymous: !state.auth.user.id,\n  }\n}\n\nconst SiteNavMenuConnected = connect(select)(SiteNavMenu)\n\nexport default SiteNavMenuConnected\n","import React from \"react\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport default function SiteNavDropdown({ close }) {\n  return <SiteNavMenu close={close} dropdown />\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport SiteNavMenu from \"./SiteNavMenu\"\n\nexport function SiteNavOverlay({ dispatch, isOpen }) {\n  return (\n    <Overlay open={isOpen}>\n      <OverlayHeader>{pgettext(\"site nav title\", \"Menu\")}</OverlayHeader>\n      <SiteNavMenu close={() => dispatch(close())} overlay />\n    </Overlay>\n  )\n}\n\nfunction select(state) {\n  return {\n    isOpen: state.overlay.siteNav,\n  }\n}\n\nconst SiteNavOverlayConnected = connect(select)(SiteNavOverlay)\n\nexport default SiteNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nconst StartSocialAuth = (props) => {\n  const { buttonClassName, buttonLabel, formLabel, header, labelClassName } =\n    props\n  const socialAuth = misago.get(\"SOCIAL_AUTH\")\n\n  if (socialAuth.length === 0) return null\n\n  return (\n    <div className=\"form-group form-social-auth\">\n      <FormHeader className={labelClassName} text={header} />\n      <div className=\"row\">\n        {socialAuth.map(({ pk, name, button_text, button_color, url }) => {\n          const className = \"btn btn-block btn-default btn-social-\" + pk\n          const style = button_color ? { color: button_color } : null\n          const finalButtonLabel =\n            button_text || interpolate(buttonLabel, { site: name }, true)\n\n          return (\n            <div className={buttonClassName || \"col-xs-12\"} key={pk}>\n              <a className={className} style={style} href={url}>\n                {finalButtonLabel}\n              </a>\n            </div>\n          )\n        })}\n      </div>\n      <hr />\n      <FormHeader className={labelClassName} text={formLabel} />\n    </div>\n  )\n}\n\nconst FormHeader = ({ className, text }) => {\n  if (!text) return null\n  return <h5 className={className || \"\"}>{text}</h5>\n}\n\nexport default StartSocialAuth\n","import React from \"react\"\n\nconst ThreadFlags = ({ thread }) => (\n  <ul className=\"thread-flags\">\n    {thread.weight == 2 && (\n      <li\n        className=\"thread-flag-pinned-globally\"\n        title={pgettext(\"thread flag\", \"Pinned globally\")}\n      >\n        <span className=\"material-icon\">bookmark</span>\n      </li>\n    )}\n    {thread.weight == 1 && (\n      <li\n        className=\"thread-flag-pinned-locally\"\n        title={pgettext(\"thread flag\", \"Pinned in category\")}\n      >\n        <span className=\"material-icon\">bookmark_outline</span>\n      </li>\n    )}\n    {thread.best_answer && (\n      <li\n        className=\"thread-flag-answered\"\n        title={pgettext(\"thread flag\", \"Answered\")}\n      >\n        <span className=\"material-icon\">check_circle</span>\n      </li>\n    )}\n    {thread.has_poll && (\n      <li className=\"thread-flag-poll\" title={pgettext(\"thread flag\", \"Poll\")}>\n        <span className=\"material-icon\">poll</span>\n      </li>\n    )}\n    {(thread.is_unapproved || thread.has_unapproved_posts) && (\n      <li\n        className=\"thread-flag-unapproved\"\n        title={\n          thread.is_unapproved\n            ? pgettext(\"thread flag\", \"Awaiting approval\")\n            : pgettext(\"thread flag\", \"Has unapproved posts\")\n        }\n      >\n        <span className=\"material-icon\">visibility</span>\n      </li>\n    )}\n    {thread.is_closed && (\n      <li\n        className=\"thread-flag-closed\"\n        title={pgettext(\"thread flag\", \"Closed\")}\n      >\n        <span className=\"material-icon\">lock</span>\n      </li>\n    )}\n    {thread.is_hidden && (\n      <li\n        className=\"thread-flag-hidden\"\n        title={pgettext(\"thread flag\", \"Hidden\")}\n      >\n        <span className=\"material-icon\">visibility_off</span>\n      </li>\n    )}\n  </ul>\n)\n\nexport default ThreadFlags\n","import React from \"react\"\n\nconst ThreadReplies = ({ thread }) => (\n  <span\n    className=\"threads-replies\"\n    title={interpolate(\n      npgettext(\n        \"thread replies stat\",\n        \"%(replies)s reply\",\n        \"%(replies)s replies\",\n        thread.replies\n      ),\n      { replies: thread.replies },\n      true\n    )}\n  >\n    <span className=\"material-icon\">chat_bubble_outline</span>\n    {thread.replies > 980\n      ? Math.round(thread.replies / 1000) + \"K\"\n      : thread.replies}\n  </span>\n)\n\nexport default ThreadReplies\n","import React from \"react\"\nimport {\n  formatNarrow,\n  formatRelative,\n  fullDateTime,\n} from \"../../datetimeFormats\"\n\nclass Timestamp extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = { tick: 0 }\n    this.date = new Date(props.datetime)\n    this.timeout = null\n  }\n\n  componentDidMount() {\n    this.scheduleNextUpdate()\n  }\n\n  componentWillUnmount() {\n    if (this.timeout) {\n      window.clearTimeout(this.timeout)\n    }\n  }\n\n  scheduleNextUpdate = () => {\n    const now = new Date()\n    const diff = Math.ceil(Math.abs(Math.round((this.date - now) / 1000)))\n\n    if (diff < 3600) {\n      this.timeout = window.setTimeout(\n        () => {\n          this.setState(tick)\n          this.scheduleNextUpdate()\n        },\n        50 * 1000 // Update every 50 seconds\n      )\n    } else if (diff < 3600 * 24) {\n      this.timeout = window.setTimeout(\n        () => {\n          this.setState(tick)\n        },\n        40 * 60 * 1000 // Update every 40 minutes\n      )\n    }\n  }\n\n  render() {\n    const displayed = this.props.narrow\n      ? formatNarrow(this.date)\n      : formatRelative(this.date)\n\n    return (\n      <attr\n        title={\n          this.props.title\n            ? this.props.title.replace(\n                \"%(timestamp)s\",\n                fullDateTime.format(this.date)\n              )\n            : fullDateTime.format(this.date)\n        }\n      >\n        {displayed}\n      </attr>\n    )\n  }\n}\n\nfunction tick(state) {\n  return { tick: state.tick + 1 }\n}\n\nexport default Timestamp\n","import Timestamp from \"./Timestamp\"\n\nexport default Timestamp\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Toolbar = ({ children, className }) => (\n  <nav className={classnames(\"toolbar\", className)}>{children}</nav>\n)\n\nexport default Toolbar\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarItem = ({ children, className, shrink }) => (\n  <div\n    className={classnames(\"toolbar-item\", className, {\n      \"toolbar-item-shrink\": shrink,\n    })}\n  >\n    {children}\n  </div>\n)\n\nexport default ToolbarItem\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSection = ({ auto, children, className }) => (\n  <div\n    className={classnames(\n      \"toolbar-section\",\n      { \"toolbar-section-auto\": auto },\n      className\n    )}\n  >\n    {children}\n  </div>\n)\n\nexport default ToolbarSection\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ToolbarSpacer = ({ className }) => (\n  <div className={classnames(\"toolbar-spacer\", className)} />\n)\n\nexport default ToolbarSpacer\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport Loader from \"misago/components/loader\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n    }\n  }\n\n  callApi(avatarType) {\n    if (this.state.isLoading) {\n      return false\n    }\n\n    this.setState({\n      isLoading: true,\n    })\n\n    ajax\n      .post(this.props.user.api.avatar, {\n        avatar: avatarType,\n      })\n      .then(\n        (response) => {\n          this.setState({\n            isLoading: false,\n          })\n\n          snackbar.success(response.detail)\n          this.props.onComplete(response)\n        },\n        (rejection) => {\n          if (rejection.status === 400) {\n            snackbar.error(rejection.detail)\n            this.setState({\n              isLoading: false,\n            })\n          } else {\n            this.props.showError(rejection)\n          }\n        }\n      )\n  }\n\n  setGravatar = () => {\n    this.callApi(\"gravatar\")\n  }\n\n  setGenerated = () => {\n    this.callApi(\"generated\")\n  }\n\n  getGravatarButton() {\n    if (this.props.options.gravatar) {\n      return (\n        <Button\n          onClick={this.setGravatar}\n          disabled={this.state.isLoading}\n          className=\"btn-default btn-block btn-avatar-gravatar\"\n        >\n          {pgettext(\"avatar modal btn\", \"Download my Gravatar\")}\n        </Button>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getCropButton() {\n    if (!this.props.options.crop_src) return null\n\n    return (\n      <Button\n        className=\"btn-default btn-block btn-avatar-crop\"\n        disabled={this.state.isLoading}\n        onClick={this.props.showCrop}\n      >\n        {pgettext(\"avatar modal btn\", \"Re-crop uploaded image\")}\n      </Button>\n    )\n  }\n\n  getUploadButton() {\n    if (!this.props.options.upload) return null\n\n    return (\n      <Button\n        className=\"btn-default btn-block btn-avatar-upload\"\n        disabled={this.state.isLoading}\n        onClick={this.props.showUpload}\n      >\n        {pgettext(\"avatar modal btn\", \"Upload new image\")}\n      </Button>\n    )\n  }\n\n  getGalleryButton() {\n    if (!this.props.options.galleries) return null\n\n    return (\n      <Button\n        className=\"btn-default btn-block btn-avatar-gallery\"\n        disabled={this.state.isLoading}\n        onClick={this.props.showGallery}\n      >\n        {pgettext(\"avatar modal btn\", \"Pick avatar from gallery\")}\n      </Button>\n    )\n  }\n\n  getAvatarPreview() {\n    let userPeview = {\n      id: this.props.user.id,\n      avatars: this.props.options.avatars,\n    }\n\n    if (this.state.isLoading) {\n      return (\n        <div className=\"avatar-preview preview-loading\">\n          <Avatar size=\"200\" user={userPeview} />\n          <Loader />\n        </div>\n      )\n    }\n\n    return (\n      <div className=\"avatar-preview\">\n        <Avatar size=\"200\" user={userPeview} />\n      </div>\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"modal-body modal-avatar-index\">\n        <div className=\"row\">\n          <div className=\"col-md-5\">{this.getAvatarPreview()}</div>\n          <div className=\"col-md-7\">\n            {this.getGravatarButton()}\n\n            <Button\n              onClick={this.setGenerated}\n              disabled={this.state.isLoading}\n              className=\"btn-default btn-block btn-avatar-generate\"\n            >\n              {pgettext(\"avatar modal btn\", \"Generate my individual avatar\")}\n            </Button>\n\n            {this.getCropButton()}\n            {this.getUploadButton()}\n            {this.getGalleryButton()}\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      deviceRatio: 1,\n    }\n  }\n\n  getAvatarSize() {\n    if (this.props.upload) {\n      return this.props.options.crop_tmp.size\n    } else {\n      return this.props.options.crop_src.size\n    }\n  }\n\n  getImagePath() {\n    if (this.props.upload) {\n      return this.props.dataUrl\n    } else {\n      return this.props.options.crop_src.url\n    }\n  }\n\n  componentDidMount() {\n    let cropit = $(\".crop-form\")\n    let cropperWidth = this.getAvatarSize()\n\n    const initialWidth = cropit.width()\n    while (initialWidth < cropperWidth) {\n      cropperWidth = cropperWidth / 2\n    }\n\n    const deviceRatio = this.getAvatarSize() / cropperWidth\n\n    cropit.width(cropperWidth)\n\n    cropit.cropit({\n      width: cropperWidth,\n      height: cropperWidth,\n      exportZoom: deviceRatio,\n      imageState: {\n        src: this.getImagePath(),\n      },\n      onImageLoaded: () => {\n        if (this.props.upload) {\n          // center uploaded image\n          let zoomLevel = cropit.cropit(\"zoom\")\n          let imageSize = cropit.cropit(\"imageSize\")\n\n          // is it wider than taller?\n          if (imageSize.width > imageSize.height) {\n            let displayedWidth = imageSize.width * zoomLevel\n            let offsetX = (displayedWidth - this.getAvatarSize()) / -2\n\n            cropit.cropit(\"offset\", {\n              x: offsetX,\n              y: 0,\n            })\n          } else if (imageSize.width < imageSize.height) {\n            let displayedHeight = imageSize.height * zoomLevel\n            let offsetY = (displayedHeight - this.getAvatarSize()) / -2\n\n            cropit.cropit(\"offset\", {\n              x: 0,\n              y: offsetY,\n            })\n          } else {\n            cropit.cropit(\"offset\", {\n              x: 0,\n              y: 0,\n            })\n          }\n        } else {\n          // use preserved crop\n          let crop = this.props.options.crop_src.crop\n\n          if (crop) {\n            cropit.cropit(\"zoom\", crop.zoom)\n            cropit.cropit(\"offset\", {\n              x: crop.x,\n              y: crop.y,\n            })\n          }\n        }\n      },\n    })\n  }\n\n  componentWillUnmount() {\n    $(\".crop-form\").cropit(\"disable\")\n  }\n\n  cropAvatar = () => {\n    if (this.state.isLoading) {\n      return false\n    }\n\n    this.setState({\n      isLoading: true,\n    })\n\n    let avatarType = this.props.upload ? \"crop_tmp\" : \"crop_src\"\n    let cropit = $(\".crop-form\")\n\n    const deviceRatio = cropit.cropit(\"exportZoom\")\n    const cropitOffset = cropit.cropit(\"offset\")\n\n    ajax\n      .post(this.props.user.api.avatar, {\n        avatar: avatarType,\n        crop: {\n          offset: {\n            x: cropitOffset.x * deviceRatio,\n            y: cropitOffset.y * deviceRatio,\n          },\n          zoom: cropit.cropit(\"zoom\") * deviceRatio,\n        },\n      })\n      .then(\n        (data) => {\n          this.props.onComplete(data)\n          snackbar.success(data.detail)\n        },\n        (rejection) => {\n          if (rejection.status === 400) {\n            snackbar.error(rejection.detail)\n            this.setState({\n              isLoading: false,\n            })\n          } else {\n            this.props.showError(rejection)\n          }\n        }\n      )\n  }\n\n  render() {\n    return (\n      <div>\n        <div className=\"modal-body modal-avatar-crop\">\n          <div className=\"crop-form\">\n            <div className=\"cropit-preview\" />\n            <input type=\"range\" className=\"cropit-image-zoom-input\" />\n          </div>\n        </div>\n        <div className=\"modal-footer\">\n          <div className=\"col-md-6 col-md-offset-3\">\n            <Button\n              onClick={this.cropAvatar}\n              loading={this.state.isLoading}\n              className=\"btn-primary btn-block\"\n            >\n              {this.props.upload\n                ? pgettext(\"avatar crop modal btn\", \"Set avatar\")\n                : pgettext(\"avatar crop modal btn\", \"Crop image\")}\n            </Button>\n\n            <Button\n              onClick={this.props.showIndex}\n              disabled={this.state.isLoading}\n              className=\"btn-default btn-block\"\n            >\n              {pgettext(\"avatar crop modal btn\", \"Cancel\")}\n            </Button>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport fileSize from \"misago/utils/file-size\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      image: null,\n      preview: null,\n      progress: 0,\n      uploaded: null,\n      dataUrl: null,\n    }\n  }\n\n  validateFile(image) {\n    if (image.size > this.props.options.upload.limit) {\n      return interpolate(\n        pgettext(\n          \"avatar upload modal\",\n          \"Selected file is too big. (%(filesize)s)\"\n        ),\n        {\n          filesize: fileSize(image.size),\n        },\n        true\n      )\n    }\n\n    let invalidTypeMsg = pgettext(\n      \"avatar upload modal\",\n      \"Selected file type is not supported.\"\n    )\n    if (\n      this.props.options.upload.allowed_mime_types.indexOf(image.type) === -1\n    ) {\n      return invalidTypeMsg\n    }\n\n    let extensionFound = false\n    let loweredFilename = image.name.toLowerCase()\n    this.props.options.upload.allowed_extensions.map(function (extension) {\n      if (loweredFilename.substr(extension.length * -1) === extension) {\n        extensionFound = true\n      }\n    })\n\n    if (!extensionFound) {\n      return invalidTypeMsg\n    }\n\n    return false\n  }\n\n  pickFile = () => {\n    document.getElementById(\"avatar-hidden-upload\").click()\n  }\n\n  uploadFile = () => {\n    let image = document.getElementById(\"avatar-hidden-upload\").files[0]\n    if (!image) return\n\n    let validationError = this.validateFile(image)\n    if (validationError) {\n      snackbar.error(validationError)\n      return\n    }\n\n    this.setState({\n      image,\n      preview: URL.createObjectURL(image),\n      progress: 0,\n    })\n\n    let data = new FormData()\n    data.append(\"avatar\", \"upload\")\n    data.append(\"image\", image)\n\n    ajax\n      .upload(this.props.user.api.avatar, data, (progress) => {\n        this.setState({\n          progress,\n        })\n      })\n      .then(\n        (data) => {\n          this.setState({\n            options: data,\n            uploaded: data.detail,\n          })\n\n          snackbar.info(\n            pgettext(\n              \"avatar upload modal\",\n              \"Your image has been uploaded and you may now crop it.\"\n            )\n          )\n        },\n        (rejection) => {\n          if (rejection.status === 400 || rejection.status === 413) {\n            snackbar.error(rejection.detail)\n            this.setState({\n              isLoading: false,\n              image: null,\n              progress: 0,\n            })\n          } else {\n            this.props.showError(rejection)\n          }\n        }\n      )\n  }\n\n  getUploadRequirements(options) {\n    let extensions = options.allowed_extensions.map(function (extension) {\n      return extension.substr(1)\n    })\n\n    return interpolate(\n      pgettext(\"avatar upload modal\", \"%(files)s files smaller than %(limit)s\"),\n      {\n        files: extensions.join(\", \"),\n        limit: fileSize(options.limit),\n      },\n      true\n    )\n  }\n\n  getUploadButton() {\n    return (\n      <div className=\"modal-body modal-avatar-upload\">\n        <Button className=\"btn-pick-file\" onClick={this.pickFile}>\n          <div className=\"material-icon\">input</div>\n          {pgettext(\"avatar upload modal field\", \"Select file\")}\n        </Button>\n        <p className=\"text-muted\">\n          {this.getUploadRequirements(this.props.options.upload)}\n        </p>\n      </div>\n    )\n  }\n\n  getUploadProgressLabel() {\n    return interpolate(\n      pgettext(\"avatar upload modal field\", \"%(progress)s % complete\"),\n      {\n        progress: this.state.progress,\n      },\n      true\n    )\n  }\n\n  getUploadProgress() {\n    return (\n      <div className=\"modal-body modal-avatar-upload\">\n        <div className=\"upload-progress\">\n          <img src={this.state.preview} />\n\n          <div className=\"progress\">\n            <div\n              className=\"progress-bar\"\n              role=\"progressbar\"\n              aria-valuenow=\"{this.state.progress}\"\n              aria-valuemin=\"0\"\n              aria-valuemax=\"100\"\n              style={{ width: this.state.progress + \"%\" }}\n            >\n              <span className=\"sr-only\">{this.getUploadProgressLabel()}</span>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n\n  renderUpload() {\n    return (\n      <div>\n        <input\n          type=\"file\"\n          id=\"avatar-hidden-upload\"\n          className=\"hidden-file-upload\"\n          onChange={this.uploadFile}\n        />\n        {this.state.image ? this.getUploadProgress() : this.getUploadButton()}\n        <div className=\"modal-footer\">\n          <div className=\"col-md-6 col-md-offset-3\">\n            <Button\n              onClick={this.props.showIndex}\n              disabled={!!this.state.image}\n              className=\"btn-default btn-block\"\n            >\n              {pgettext(\"avatar upload modal btn\", \"Cancel\")}\n            </Button>\n          </div>\n        </div>\n      </div>\n    )\n  }\n\n  renderCrop() {\n    return (\n      <AvatarCrop\n        options={this.state.options}\n        user={this.props.user}\n        upload={this.state.uploaded}\n        dataUrl={this.state.preview}\n        onComplete={this.props.onComplete}\n        showError={this.props.showError}\n        showIndex={this.props.showIndex}\n      />\n    )\n  }\n\n  render() {\n    if (this.state.uploaded) return this.renderCrop()\n\n    return this.renderUpload()\n  }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Button from \"misago/components/button\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport batch from \"misago/utils/batch\"\n\nexport class GalleryItem extends React.Component {\n  select = () => {\n    this.props.select(this.props.id)\n  }\n\n  getClassName() {\n    if (this.props.selection === this.props.id) {\n      if (this.props.disabled) {\n        return \"btn btn-avatar btn-disabled avatar-selected\"\n      } else {\n        return \"btn btn-avatar avatar-selected\"\n      }\n    } else if (this.props.disabled) {\n      return \"btn btn-avatar btn-disabled\"\n    } else {\n      return \"btn btn-avatar\"\n    }\n  }\n\n  render() {\n    return (\n      <button\n        type=\"button\"\n        className={this.getClassName()}\n        disabled={this.props.disabled}\n        onClick={this.select}\n      >\n        <img src={this.props.url} />\n      </button>\n    )\n  }\n}\n\nexport class Gallery extends React.Component {\n  render() {\n    return (\n      <div className=\"avatars-gallery\">\n        <h3>{this.props.name}</h3>\n\n        <div className=\"avatars-gallery-images\">\n          {batch(this.props.images, 4, null).map((row, i) => {\n            return (\n              <div className=\"row\" key={i}>\n                {row.map((item, i) => {\n                  return (\n                    <div className=\"col-xs-3\" key={i}>\n                      {item ? (\n                        <GalleryItem\n                          disabled={this.props.disabled}\n                          select={this.props.select}\n                          selection={this.props.selection}\n                          {...item}\n                        />\n                      ) : (\n                        <div className=\"blank-avatar\" />\n                      )}\n                    </div>\n                  )\n                })}\n              </div>\n            )\n          })}\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      selection: null,\n      isLoading: false,\n    }\n  }\n\n  select = (image) => {\n    this.setState({\n      selection: image,\n    })\n  }\n\n  save = () => {\n    if (this.state.isLoading) {\n      return false\n    }\n\n    this.setState({\n      isLoading: true,\n    })\n\n    ajax\n      .post(this.props.user.api.avatar, {\n        avatar: \"galleries\",\n        image: this.state.selection,\n      })\n      .then(\n        (response) => {\n          this.setState({\n            isLoading: false,\n          })\n\n          snackbar.success(response.detail)\n          this.props.onComplete(response)\n          this.props.showIndex()\n        },\n        (rejection) => {\n          if (rejection.status === 400) {\n            snackbar.error(rejection.detail)\n            this.setState({\n              isLoading: false,\n            })\n          } else {\n            this.props.showError(rejection)\n          }\n        }\n      )\n  }\n\n  render() {\n    return (\n      <div>\n        <div className=\"modal-body modal-avatar-gallery\">\n          {this.props.options.galleries.map((item, i) => {\n            return (\n              <Gallery\n                name={item.name}\n                images={item.images}\n                selection={this.state.selection}\n                disabled={this.state.isLoading}\n                select={this.select}\n                key={i}\n              />\n            )\n          })}\n        </div>\n        <div className=\"modal-footer\">\n          <div className=\"row\">\n            <div className=\"col-md-6 col-md-offset-3\">\n              <Button\n                onClick={this.save}\n                loading={this.state.isLoading}\n                disabled={!this.state.selection}\n                className=\"btn-primary btn-block\"\n              >\n                {this.state.selection\n                  ? pgettext(\"avatar gallery modal btn\", \"Save choice\")\n                  : pgettext(\"avatar gallery modal btn\", \"Select avatar\")}\n              </Button>\n\n              <Button\n                onClick={this.props.showIndex}\n                disabled={this.state.isLoading}\n                className=\"btn-default btn-block\"\n              >\n                {pgettext(\"avatar gallery modal btn\", \"Cancel\")}\n              </Button>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport AvatarIndex from \"misago/components/change-avatar/index\"\nimport AvatarCrop from \"misago/components/change-avatar/crop\"\nimport AvatarUpload from \"misago/components/change-avatar/upload\"\nimport AvatarGallery from \"misago/components/change-avatar/gallery\"\nimport Loader from \"misago/components/modal-loader\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport store from \"misago/services/store\"\n\nexport class ChangeAvatarError extends React.Component {\n  getErrorReason() {\n    if (this.props.reason) {\n      return <p dangerouslySetInnerHTML={{ __html: this.props.reason }} />\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">remove_circle_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">{this.props.message}</p>\n          {this.getErrorReason()}\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"avatar modal dismiss\", \"Ok\")}\n          </button>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  componentDidMount() {\n    ajax.get(this.props.user.api.avatar).then(\n      (options) => {\n        this.setState({\n          component: AvatarIndex,\n          options: options,\n          error: null,\n        })\n      },\n      (rejection) => {\n        this.showError(rejection)\n      }\n    )\n  }\n\n  showError = (error) => {\n    this.setState({\n      error,\n    })\n  }\n\n  showIndex = () => {\n    this.setState({\n      component: AvatarIndex,\n    })\n  }\n\n  showUpload = () => {\n    this.setState({\n      component: AvatarUpload,\n    })\n  }\n\n  showCrop = () => {\n    this.setState({\n      component: AvatarCrop,\n    })\n  }\n\n  showGallery = () => {\n    this.setState({\n      component: AvatarGallery,\n    })\n  }\n\n  completeFlow = (options) => {\n    store.dispatch(updateAvatar(this.props.user, options.avatars))\n\n    this.setState({\n      component: AvatarIndex,\n      options,\n    })\n  }\n\n  getBody() {\n    if (this.state) {\n      if (this.state.error) {\n        return (\n          <ChangeAvatarError\n            message={this.state.error.detail}\n            reason={this.state.error.reason}\n          />\n        )\n      } else {\n        return (\n          <this.state.component\n            options={this.state.options}\n            user={this.props.user}\n            onComplete={this.completeFlow}\n            showError={this.showError}\n            showIndex={this.showIndex}\n            showCrop={this.showCrop}\n            showUpload={this.showUpload}\n            showGallery={this.showGallery}\n          />\n        )\n      }\n    } else {\n      return <Loader />\n    }\n  }\n\n  getClassName() {\n    if (this.state && this.state.error) {\n      return \"modal-dialog modal-message modal-change-avatar\"\n    } else {\n      return \"modal-dialog modal-change-avatar\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"avatar modal title\", \"Change your avatar\")}\n            </h4>\n          </div>\n\n          {this.getBody()}\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function select(state) {\n  return {\n    user: state.auth.user,\n  }\n}\n","export default function logout() {\n  document.getElementById(\"hidden-logout-form\").submit()\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport modal from \"../../services/modal\"\nimport ChangeAvatarModal, {\n  select as selectAvatar,\n} from \"../change-avatar/root\"\nimport {\n  DropdownDivider,\n  DropdownFooter,\n  DropdownMenuItem,\n  DropdownSubheader,\n} from \"../Dropdown\"\nimport logout from \"./logout\"\n\nclass UserNavMenu extends React.Component {\n  constructor(props) {\n    super(props)\n\n    if (props.dropdown) {\n      // Collapse options on dropdown\n      this.state = {\n        options: props.options.slice(0, 2),\n        optionsMore: props.options.length > 2,\n      }\n    } else {\n      // Reveal all options on mobile overlay\n      this.state = {\n        options: props.options,\n        optionsMore: false,\n      }\n    }\n  }\n\n  changeAvatar = () => {\n    this.props.close()\n    modal.show(connect(selectAvatar)(ChangeAvatarModal))\n  }\n\n  revealOptions = () => {\n    this.setState({\n      options: this.props.options,\n      optionsMore: false,\n    })\n  }\n\n  render() {\n    const { user, close, dropdown, overlay } = this.props\n\n    if (!user) {\n      return null\n    }\n\n    const adminUrl = misago.get(\"ADMIN_URL\")\n\n    return (\n      <ul\n        className={classnames(\"user-nav-menu\", {\n          \"dropdown-menu-list\": dropdown,\n          \"overlay-menu-list\": overlay,\n        })}\n      >\n        <li className=\"dropdown-menu-item\">\n          <a href={user.url} className=\"user-nav-profile\">\n            <strong>{user.username}</strong>\n            <small>{pgettext(\"user nav\", \"Go to your profile\")}</small>\n          </a>\n        </li>\n        <DropdownDivider />\n        <DropdownMenuItem>\n          <a href={misago.get(\"NOTIFICATIONS_URL\")}>\n            <span className=\"material-icon\">\n              {user.unreadNotifications\n                ? \"notifications_active\"\n                : \"notifications_none\"}\n            </span>\n            {pgettext(\"user nav\", \"Notifications\")}\n            {!!user.unreadNotifications && (\n              <span className=\"badge\">{user.unreadNotifications}</span>\n            )}\n          </a>\n        </DropdownMenuItem>\n        {!!user.showPrivateThreads && (\n          <DropdownMenuItem>\n            <a href={misago.get(\"PRIVATE_THREADS_URL\")}>\n              <span className=\"material-icon\">inbox</span>\n              {pgettext(\"user nav\", \"Private threads\")}\n              {!!user.unreadPrivateThreads && (\n                <span className=\"badge\">{user.unreadPrivateThreads}</span>\n              )}\n            </a>\n          </DropdownMenuItem>\n        )}\n        {!!adminUrl && (\n          <DropdownMenuItem>\n            <a href={adminUrl} target=\"_blank\">\n              <span className=\"material-icon\">security</span>\n              {pgettext(\"user nav\", \"Admin control panel\")}\n            </a>\n          </DropdownMenuItem>\n        )}\n        <DropdownDivider />\n        <DropdownSubheader className=\"user-nav-options\">\n          {pgettext(\"user nav section\", \"Change options\")}\n        </DropdownSubheader>\n        <DropdownMenuItem>\n          <button\n            className=\"btn-link\"\n            onClick={this.changeAvatar}\n            type=\"button\"\n          >\n            <span className=\"material-icon\">portrait</span>\n            {pgettext(\"user nav\", \"Change avatar\")}\n          </button>\n        </DropdownMenuItem>\n        {this.state.options.map((item) => (\n          <DropdownMenuItem key={item.icon}>\n            <a href={item.url}>\n              <span className=\"material-icon\">{item.icon}</span>\n              {item.name}\n            </a>\n          </DropdownMenuItem>\n        ))}\n        <DropdownMenuItem>\n          <button\n            className={classnames(\"btn-link\", {\n              \"d-none\": !this.state.optionsMore,\n            })}\n            onClick={this.revealOptions}\n            type=\"button\"\n          >\n            <span className=\"material-icon\">more_vertical</span>\n            {pgettext(\"user nav\", \"See more\")}\n          </button>\n        </DropdownMenuItem>\n        {!!dropdown && (\n          <DropdownFooter listItem>\n            <button\n              className=\"btn btn-default btn-block\"\n              onClick={() => {\n                logout()\n                close()\n              }}\n              type=\"button\"\n            >\n              {pgettext(\"user nav\", \"Log out\")}\n            </button>\n          </DropdownFooter>\n        )}\n      </ul>\n    )\n  }\n}\n\nfunction select(state) {\n  const user = state.auth.user\n  if (!user.id) {\n    return { user: null }\n  }\n\n  return {\n    user: {\n      username: user.username,\n      unreadNotifications: user.unreadNotifications,\n      unreadPrivateThreads: user.unread_private_threads,\n      showPrivateThreads: user.acl.can_use_private_threads,\n      url: user.url,\n    },\n    options: [...misago.get(\"userOptions\")],\n  }\n}\n\nconst UserNavMenuConnected = connect(select)(UserNavMenu)\n\nexport default UserNavMenuConnected\n","import React from \"react\"\nimport UserNavMenu from \"./UserNavMenu\"\n\nexport default function UserNavDropdown({ close }) {\n  return <UserNavMenu close={close} dropdown />\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { close } from \"../../reducers/overlay\"\nimport { DropdownFooter } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\nimport UserNavMenu from \"./UserNavMenu\"\nimport logout from \"./logout\"\n\nexport function UserNavOverlay({ dispatch, isOpen }) {\n  return (\n    <Overlay open={isOpen}>\n      <OverlayHeader>\n        {pgettext(\"user nav title\", \"Your options\")}\n      </OverlayHeader>\n      <UserNavMenu close={() => dispatch(close())} overlay />\n      <DropdownFooter>\n        <button\n          className=\"btn btn-default btn-block\"\n          onClick={() => {\n            logout()\n            dispatch(close())\n          }}\n          type=\"button\"\n        >\n          {pgettext(\"user nav\", \"Log out\")}\n        </button>\n      </DropdownFooter>\n    </Overlay>\n  )\n}\n\nfunction select(state) {\n  return {\n    isOpen: state.overlay.userNav,\n  }\n}\n\nconst UserNavOverlayConnected = connect(select)(UserNavOverlay)\n\nexport default UserNavOverlayConnected\n","import React from \"react\"\nimport misago from \"misago\"\n\nexport default function (props) {\n  const size = props.size || 100\n  const size2x = props.size2x || size * 2\n\n  return (\n    <img\n      alt=\"\"\n      className={props.className || \"user-avatar\"}\n      src={getSrc(props.user, size)}\n      srcSet={getSrc(props.user, size2x)}\n      width={props.height || size}\n      height={props.height || size}\n    />\n  )\n}\n\nexport function getSrc(user, size) {\n  if (user && user.id) {\n    // just avatar hash, size and user id\n    return resolveAvatarForSize(user.avatars, size).url\n  } else {\n    // just append avatar size to file to produce no-avatar placeholder\n    return misago.get(\"BLANK_AVATAR_URL\")\n  }\n}\n\nexport function resolveAvatarForSize(avatars, size) {\n  let avatar = avatars[0]\n  avatars.forEach((av) => {\n    if (av.size >= size) {\n      avatar = av\n    }\n  })\n  return avatar\n}\n","import React from \"react\"\nimport Loader from \"./loader\"\n\nexport default class Button extends React.Component {\n  render() {\n    let className = \"btn \" + this.props.className\n    let disabled = this.props.disabled\n\n    if (this.props.loading) {\n      className += \" btn-loading\"\n      disabled = true\n    }\n\n    return (\n      <button\n        className={className}\n        disabled={disabled}\n        onClick={this.props.onClick}\n        type={this.props.onClick ? \"button\" : \"submit\"}\n      >\n        {this.props.children}\n        {this.props.loading ? <Loader /> : null}\n      </button>\n    )\n  }\n}\n\nButton.defaultProps = {\n  className: \"btn-default\",\n\n  type: \"submit\",\n\n  loading: false,\n  disabled: false,\n\n  onClick: null,\n}\n","import React from \"react\"\n\nexport default function (props) {\n  return (\n    <select\n      className={props.className || \"form-control\"}\n      disabled={props.disabled || false}\n      id={props.id || null}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {props.choices.map((item) => {\n        return (\n          <option\n            disabled={item.disabled || false}\n            key={item.value}\n            value={item.value}\n          >\n            {\"- - \".repeat(item.level) + item.label}\n          </option>\n        )\n      })}\n    </select>\n  )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default function ({ display }) {\n  if (!display) return null\n\n  return (\n    <PanelMessage\n      helpText={pgettext(\n        \"user profile details\",\n        \"No profile details are editable at this time.\"\n      )}\n      message={pgettext(\n        \"user profile details\",\n        \"This option is currently unavailable.\"\n      )}\n    />\n  )\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({ display }) {\n  if (!display) return null\n\n  return (\n    <div className=\"panel-body\">\n      <Loader />\n    </div>\n  )\n}\n","import React from \"react\"\nimport Select from \"misago/components/select\"\n\nexport default class extends React.Component {\n  onChange = (ev) => {\n    const { field, onChange } = this.props\n    onChange(field.fieldname, ev.target.value)\n  }\n\n  render() {\n    const { disabled, field, value } = this.props\n    const { input } = field\n\n    if (input.type === \"select\") {\n      return (\n        <Select\n          choices={input.choices}\n          disabled={disabled}\n          id={\"id_\" + field.fieldname}\n          onChange={this.onChange}\n          value={value}\n        />\n      )\n    }\n\n    if (input.type === \"textarea\") {\n      return (\n        <textarea\n          className=\"form-control\"\n          disabled={disabled}\n          id={\"id_\" + field.fieldname}\n          onChange={this.onChange}\n          rows=\"4\"\n          type=\"text\"\n          value={value}\n        />\n      )\n    }\n\n    if (input.type === \"text\") {\n      return (\n        <input\n          className=\"form-control\"\n          disabled={disabled}\n          id={\"id_\" + field.fieldname}\n          onChange={this.onChange}\n          type=\"text\"\n          value={value}\n        />\n      )\n    }\n\n    return null\n  }\n}\n","import React from \"react\"\nimport FieldInput from \"./field-input\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport default function ({ disabled, errors, fields, name, onChange, value }) {\n  return (\n    <fieldset>\n      <legend>{name}</legend>\n      {fields.map((field) => {\n        return (\n          <FormGroup\n            for={\"id_\" + field.fieldname}\n            helpText={field.help_text}\n            key={field.fieldname}\n            label={field.label}\n            validation={errors[field.fieldname]}\n          >\n            <FieldInput\n              disabled={disabled}\n              field={field}\n              onChange={onChange}\n              value={value[field.fieldname]}\n            />\n          </FormGroup>\n        )\n      })}\n    </fieldset>\n  )\n}\n","import React from \"react\"\nimport Fieldset from \"./fieldset\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      errors: {},\n    }\n\n    const groups = props.groups.length\n    for (let i = 0; i < groups; i++) {\n      const group = props.groups[i]\n      const fields = group.fields.length\n      for (let f = 0; f < fields; f++) {\n        const fieldname = group.fields[f].fieldname\n        const initial = group.fields[f].initial\n        this.state[fieldname] = initial\n      }\n    }\n  }\n\n  send() {\n    const data = Object.assign({}, this.state, {\n      errors: null,\n      isLoading: null,\n    })\n\n    return ajax.post(this.props.api, data)\n  }\n\n  handleSuccess(data) {\n    this.props.onSuccess(data)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(gettext(\"Form contains errors.\"))\n      this.setState({ errors: rejection })\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onChange = (name, value) => {\n    this.setState({\n      [name]: value,\n    })\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"panel-body\">\n          {this.props.groups.map((group, i) => {\n            return (\n              <Fieldset\n                disabled={this.state.isLoading}\n                errors={this.state.errors}\n                fields={group.fields}\n                name={group.name}\n                key={i}\n                onChange={this.onChange}\n                value={this.state}\n              />\n            )\n          })}\n        </div>\n        <div className=\"panel-footer text-right\">\n          <CancelButton\n            disabled={this.state.isLoading}\n            onCancel={this.props.onCancel}\n          />{\" \"}\n          <Button className=\"btn-primary\" loading={this.state.isLoading}>\n            {pgettext(\"user profile details form btn\", \"Save changes\")}\n          </Button>\n        </div>\n      </form>\n    )\n  }\n}\n\nexport function CancelButton({ onCancel, disabled }) {\n  if (!onCancel) return null\n\n  return (\n    <button\n      className=\"btn btn-default\"\n      disabled={disabled}\n      onClick={onCancel}\n      type=\"button\"\n    >\n      {pgettext(\"user profile details form btn\", \"Cancel\")}\n    </button>\n  )\n}\n","import React from \"react\"\nimport Blankslate from \"./blankslate\"\nimport Loader from \"./loader\"\nimport Form from \"./form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      loading: true,\n      groups: null,\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.api).then(\n      (groups) => {\n        this.setState({\n          loading: false,\n\n          groups,\n        })\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n        if (this.props.cancel) {\n          this.props.cancel()\n        }\n      }\n    )\n  }\n\n  render() {\n    const { groups, loading } = this.state\n\n    return (\n      <div className=\"panel panel-default panel-form\">\n        <div className=\"panel-heading\">\n          <h3 className=\"panel-title\">\n            {pgettext(\"user profile details form title\", \"Edit details\")}\n          </h3>\n        </div>\n        <Loader display={loading} />\n        <Blankslate display={!loading && !groups.length} />\n        <FormDisplay\n          api={this.props.api}\n          display={!loading && groups.length}\n          groups={groups}\n          onCancel={this.props.onCancel}\n          onSuccess={this.props.onSuccess}\n        />\n      </div>\n    )\n  }\n}\n\nexport function FormDisplay({ api, display, groups, onCancel, onSuccess }) {\n  if (!display) return null\n\n  return (\n    <Form api={api} groups={groups} onCancel={onCancel} onSuccess={onSuccess} />\n  )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  isValidated() {\n    return typeof this.props.validation !== \"undefined\"\n  }\n\n  getClassName() {\n    let className = \"form-group\"\n    if (this.isValidated()) {\n      className += \" has-feedback\"\n      if (this.props.validation === null) {\n        className += \" has-success\"\n      } else {\n        className += \" has-error\"\n      }\n    }\n    return className\n  }\n\n  getFeedback() {\n    if (this.props.validation) {\n      return (\n        <div className=\"help-block errors\">\n          {this.props.validation.map((error, i) => {\n            return <p key={this.props.for + \"FeedbackItem\" + i}>{error}</p>\n          })}\n        </div>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getFeedbackDescription() {\n    if (this.isValidated()) {\n      return (\n        <span id={this.props.for + \"_status\"} className=\"sr-only\">\n          {this.props.validation\n            ? pgettext(\"field validation status\", \"(error)\")\n            : pgettext(\"field validation status\", \"(success)\")}\n        </span>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getHelpText() {\n    if (this.props.helpText) {\n      return <p className=\"help-block\">{this.props.helpText}</p>\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()}>\n        <label\n          className={\"control-label \" + (this.props.labelClass || \"\")}\n          htmlFor={this.props.for || \"\"}\n        >\n          {this.props.label + \":\"}\n        </label>\n        <div className={this.props.controlClass || \"\"}>\n          {this.props.children}\n          {this.getFeedbackDescription()}\n          {this.getFeedback()}\n          {this.getHelpText()}\n          {this.props.extra || null}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { required } from \"../utils/validators\"\nimport snackbar from \"../services/snackbar\"\n\nlet validateRequired = required()\n\nexport default class extends React.Component {\n  validate() {\n    let errors = {}\n    if (!this.state.validators) {\n      return errors\n    }\n\n    let validators = {\n      required: this.state.validators.required || this.state.validators,\n      optional: this.state.validators.optional || {},\n    }\n\n    let validatedFields = []\n\n    // add required fields to validation\n    for (let name in validators.required) {\n      if (\n        validators.required.hasOwnProperty(name) &&\n        validators.required[name]\n      ) {\n        validatedFields.push(name)\n      }\n    }\n\n    // add optional fields to validation\n    for (let name in validators.optional) {\n      if (\n        validators.optional.hasOwnProperty(name) &&\n        validators.optional[name]\n      ) {\n        validatedFields.push(name)\n      }\n    }\n\n    // validate fields values\n    for (let i in validatedFields) {\n      let name = validatedFields[i]\n      let fieldErrors = this.validateField(name, this.state[name])\n\n      if (fieldErrors === null) {\n        errors[name] = null\n      } else if (fieldErrors) {\n        errors[name] = fieldErrors\n      }\n    }\n\n    return errors\n  }\n\n  isValid() {\n    let errors = this.validate()\n    for (let field in errors) {\n      if (errors.hasOwnProperty(field)) {\n        if (errors[field] !== null) {\n          return false\n        }\n      }\n    }\n\n    return true\n  }\n\n  validateField(name, value) {\n    let errors = []\n    if (!this.state.validators) {\n      return errors\n    }\n\n    let validators = {\n      required: (this.state.validators.required || this.state.validators)[name],\n      optional: (this.state.validators.optional || {})[name],\n    }\n\n    let requiredError = validateRequired(value) || false\n\n    if (validators.required) {\n      if (requiredError) {\n        errors = [requiredError]\n      } else {\n        for (let i in validators.required) {\n          let validationError = validators.required[i](value)\n          if (validationError) {\n            errors.push(validationError)\n          }\n        }\n      }\n\n      return errors.length ? errors : null\n    } else if (requiredError === false && validators.optional) {\n      for (let i in validators.optional) {\n        let validationError = validators.optional[i](value)\n        if (validationError) {\n          errors.push(validationError)\n        }\n      }\n\n      return errors.length ? errors : null\n    }\n\n    return false // false === field wasn't validated\n  }\n\n  bindInput = (name) => {\n    return (event) => {\n      this.changeValue(name, event.target.value)\n    }\n  }\n\n  changeValue = (name, value) => {\n    let newState = {\n      [name]: value,\n    }\n\n    const formErrors = this.state.errors || {}\n    formErrors[name] = this.validateField(name, newState[name])\n    newState.errors = formErrors\n\n    this.setState(newState)\n  }\n\n  clean() {\n    return true\n  }\n\n  send() {\n    return null\n  }\n\n  handleSuccess(success) {\n    return\n  }\n\n  handleError(rejection) {\n    snackbar.apiError(rejection)\n  }\n\n  handleSubmit = (event) => {\n    // we don't reload page on submissions\n    if (event) {\n      event.preventDefault()\n    }\n\n    if (this.state.isLoading) {\n      return\n    }\n\n    if (this.clean()) {\n      this.setState({ isLoading: true })\n      let promise = this.send()\n\n      if (promise) {\n        promise.then(\n          (success) => {\n            this.setState({ isLoading: false })\n            this.handleSuccess(success)\n          },\n          (rejection) => {\n            this.setState({ isLoading: false })\n            this.handleError(rejection)\n          }\n        )\n      } else {\n        this.setState({ isLoading: false })\n      }\n    }\n  }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  isActive() {\n    if (this.props.isControlled) {\n      return this.props.isActive\n    } else {\n      if (this.props.path) {\n        return document.location.pathname.indexOf(this.props.path) === 0\n      } else {\n        return false\n      }\n    }\n  }\n\n  getClassName() {\n    if (this.isActive()) {\n      return (\n        (this.props.className || \"\") +\n        \" \" +\n        (this.props.activeClassName || \"active\")\n      )\n    } else {\n      return this.props.className || \"\"\n    }\n  }\n\n  render() {\n    return <li className={this.getClassName()}>{this.props.children}</li>\n  }\n}\n","import React from \"react\"\n\nexport default function (props) {\n  return (\n    <div className={props.className || \"loader\"}>\n      <div className=\"loader-spinning-wheel\" />\n    </div>\n  )\n}\n","import React from \"react\"\nimport Button from \"./button\"\nimport Form from \"./form\"\nimport FormGroup from \"./form-group\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      bestAnswer: \"0\",\n      poll: \"0\",\n    }\n  }\n\n  clean() {\n    if (this.props.polls && this.state.poll === \"0\") {\n      const confirmation = window.confirm(\n        pgettext(\n          \"merge threads conflict form\",\n          \"Are you sure you want to delete all polls?\"\n        )\n      )\n      return confirmation\n    }\n\n    return true\n  }\n\n  send() {\n    const data = Object.assign({}, this.props.data, {\n      best_answer: this.state.bestAnswer,\n      poll: this.state.poll,\n    })\n\n    return ajax.post(this.props.api, data)\n  }\n\n  handleSuccess = (success) => {\n    this.props.onSuccess(success)\n    modal.hide()\n  }\n\n  handleError = (rejection) => {\n    this.props.onError(rejection)\n  }\n\n  onBestAnswerChange = (event) => {\n    this.changeValue(\"bestAnswer\", event.target.value)\n  }\n\n  onPollChange = (event) => {\n    this.changeValue(\"poll\", event.target.value)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"merge threads conflict modal title\", \"Merge threads\")}\n            </h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <BestAnswerSelect\n                choices={this.props.bestAnswers}\n                onChange={this.onBestAnswerChange}\n                value={this.state.bestAnswer}\n              />\n              <PollSelect\n                choices={this.props.polls}\n                onChange={this.onPollChange}\n                value={this.state.poll}\n              />\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"merge threads conflict btn\", \"Cancel\")}\n              </button>\n              <Button className=\"btn-primary\" loading={this.state.isLoading}>\n                {pgettext(\"merge threads conflict btn\", \"Merge threads\")}\n              </Button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function BestAnswerSelect({ choices, onChange, value }) {\n  if (!choices) return null\n\n  return (\n    <FormGroup\n      label={pgettext(\"merge threads conflict best answer\", \"Best answer\")}\n      helpText={pgettext(\n        \"merge threads conflict best answer\",\n        \"Select the best answer for your newly merged thread. No posts will be deleted during the merge.\"\n      )}\n      for=\"id_best_answer\"\n    >\n      <select\n        className=\"form-control\"\n        id=\"id_best_answer\"\n        onChange={onChange}\n        value={value}\n      >\n        {choices.map((choice) => {\n          return (\n            <option value={choice[0]} key={choice[0]}>\n              {choice[1]}\n            </option>\n          )\n        })}\n      </select>\n    </FormGroup>\n  )\n}\n\nexport function PollSelect({ choices, onChange, value }) {\n  if (!choices) return null\n\n  return (\n    <FormGroup\n      label={pgettext(\"merge threads conflict poll\", \"Poll\")}\n      helpText={pgettext(\n        \"merge threads conflict poll\",\n        \"Select the poll for your newly merged thread. Rejected polls will be permanently deleted and cannot be recovered.\"\n      )}\n      for=\"id_poll\"\n    >\n      <select\n        className=\"form-control\"\n        id=\"id_poll\"\n        onChange={onChange}\n        value={value}\n      >\n        {choices.map((choice) => {\n          return (\n            <option value={choice[0]} key={choice[0]}>\n              {choice[1]}\n            </option>\n          )\n        })}\n      </select>\n    </FormGroup>\n  )\n}\n","const ytRegExp = new RegExp(\n  \"^.*(?:(?:youtu.be/|v/|vi/|u/w/|embed/)|(?:(?:watch)??v(?:i)?=|&v(?:i)?=))([^#&?]*).*\"\n)\n\nexport class OneBox {\n  constructor() {\n    this._youtube = {}\n  }\n\n  render = (element) => {\n    if (!element) return\n    this.highlightCode(element)\n    this.embedYoutubePlayers(element)\n  }\n\n  highlightCode(element) {\n    import(\"highlight\").then(({ default: hljs }) => {\n      const codeblocks = element.querySelectorAll(\"pre>code\")\n      for (let i = 0; i < codeblocks.length; i++) {\n        hljs.highlightElement(codeblocks[i])\n      }\n    })\n  }\n\n  embedYoutubePlayers(element) {\n    const anchors = element.querySelectorAll(\"p>a\")\n    for (let i = 0; i < anchors.length; i++) {\n      const a = anchors[i]\n      const p = a.parentNode\n      const onlyChild = p.childNodes.length === 1\n\n      if (!this._youtube[a.href]) {\n        this._youtube[a.href] = parseYoutubeUrl(a.href)\n      }\n\n      const youtubeMovie = this._youtube[a.href]\n      if (onlyChild && !!youtubeMovie && youtubeMovie.data !== false) {\n        this.swapYoutubePlayer(a, youtubeMovie)\n      }\n    }\n  }\n\n  swapYoutubePlayer(element, youtube) {\n    let url = \"https://www.youtube.com/embed/\"\n    url += youtube.video\n    url += \"?feature=oembed\"\n    if (youtube.start) {\n      url += \"&start=\" + youtube.start\n    }\n\n    const player = $(\n      '<iframe class=\"embed-responsive-item\" frameborder=\"0\" ' +\n        'src=\"' +\n        url +\n        '\" ' +\n        'allow=\"encrypted-media; gyroscope; picture-in-picture\" ' +\n        \"allowfullscreen></iframe>\"\n    )\n    $(element).replaceWith(player)\n    player.wrap('<div class=\"embed-responsive embed-responsive-16by9\"></div>')\n  }\n}\n\nexport default new OneBox()\n\nexport function parseYoutubeUrl(url) {\n  const cleanedUrl = cleanUrl(url)\n  const video = getVideoIdFromUrl(cleanedUrl)\n\n  if (!video) return null\n\n  let start = 0\n  if (cleanedUrl.indexOf(\"?\") > 0) {\n    const query = cleanedUrl.substr(cleanedUrl.indexOf(\"?\") + 1)\n    const timebit = query.split(\"&\").filter((i) => {\n      return i.substr(0, 2) === \"t=\"\n    })[0]\n\n    if (timebit) {\n      const bits = timebit.substr(2).split(\"m\")\n      if (bits[0].substr(-1) === \"s\") {\n        start += parseInt(bits[0].substr(0, bits[0].length - 1))\n      } else {\n        start += parseInt(bits[0]) * 60\n        if (!!bits[1] && bits[1].substr(-1) === \"s\") {\n          start += parseInt(bits[1].substr(0, bits[1].length - 1))\n        }\n      }\n    }\n  }\n\n  return {\n    start,\n    video,\n  }\n}\n\nexport function cleanUrl(url) {\n  let clean = url\n\n  if (url.substr(0, 8) === \"https://\") {\n    clean = clean.substr(8)\n  } else if (url.substr(0, 7) === \"http://\") {\n    clean = clean.substr(7)\n  }\n\n  if (clean.substr(0, 4) === \"www.\") {\n    clean = clean.substr(4)\n  }\n\n  return clean\n}\n\nexport function getVideoIdFromUrl(url) {\n  if (url.indexOf(\"youtu\") === -1) return null\n\n  const video = url.match(ytRegExp)\n  if (video) {\n    return video[1]\n  }\n  return null\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport onebox from \"misago/services/one-box\"\n\nexport default class extends React.Component {\n  componentDidMount() {\n    onebox.render(this.documentNode)\n    $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    onebox.render(this.documentNode)\n    $(this.documentNode).find(\".spoiler-reveal\").click(revealSpoiler)\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    return nextProps.markup !== this.props.markup\n  }\n\n  render() {\n    return (\n      <article\n        className={classnames(\"misago-markup\", this.props.className)}\n        dangerouslySetInnerHTML={{ __html: this.props.markup }}\n        data-author={this.props.author || undefined}\n        ref={(node) => {\n          this.documentNode = node\n        }}\n      />\n    )\n  }\n}\n\nfunction revealSpoiler(event) {\n  var btn = event.target\n  $(btn).parent().parent().addClass(\"revealed\")\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n  render() {\n    return (\n      <div className=\"modal-body modal-loader\">\n        <Loader />\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends PanelMessage {\n  getHelpText() {\n    if (this.props.helpText) {\n      return <p className=\"help-block\">{this.props.helpText}</p>\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">\n            {this.props.icon || \"info_outline\"}\n          </span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">{this.props.message}</p>\n          {this.getHelpText()}\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"modal message dismiss btn\", \"Ok\")}\n          </button>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Loader from \"misago/components/loader\"\n\nexport default class extends React.Component {\n  render() {\n    return (\n      <div className=\"panel-body panel-body-loading\">\n        <Loader className=\"loader loader-spaced\" />\n      </div>\n    )\n  }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getHelpText() {\n    if (this.props.helpText) {\n      return <p className=\"help-block\">{this.props.helpText}</p>\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"panel-body panel-message-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">\n            {this.props.icon || \"info_outline\"}\n          </span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">{this.props.message}</p>\n          {this.getHelpText()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\n\nexport default function (props) {\n  if (props.post.content) {\n    return <Default {...props} />\n  } else {\n    return <Invalid {...props} />\n  }\n}\n\nexport function Default(props) {\n  return (\n    <div className=\"post-body\">\n      <MisagoMarkup markup={props.post.content} />\n    </div>\n  )\n}\n\nexport function Invalid(props) {\n  return (\n    <div className=\"post-body post-body-invalid\">\n      <p className=\"lead\">\n        {pgettext(\n          \"post body invalid\",\n          \"This post's contents cannot be displayed.\"\n        )}\n      </p>\n      <p className=\"text-muted\">\n        {pgettext(\n          \"post body invalid\",\n          \"This error is caused by invalid post content manipulation.\"\n        )}\n      </p>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n  const { category, thread } = post\n\n  const tooltip = interpolate(\n    pgettext(\"posts feed item header\", \"posted %(posted_on)s\"),\n    {\n      posted_on: post.posted_on.format(\"LL, LT\"),\n    },\n    true\n  )\n\n  return (\n    <div className=\"post-heading\">\n      <a className=\"btn btn-link item-title\" href={thread.url}>\n        {thread.title}\n      </a>\n      <a className=\"btn btn-link post-category\" href={category.url.index}>\n        {category.name}\n      </a>\n      <a\n        href={post.url.index}\n        className=\"btn btn-link posted-on\"\n        title={tooltip}\n      >\n        {post.posted_on.fromNow()}\n      </a>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n  return (\n    <a className=\"btn btn-default btn-icon pull-right\" href={post.url.index}>\n      <span className=\"btn-text-left hidden-xs\">\n        {pgettext(\"go to post link\", \"See post\")}\n      </span>\n      <span className=\"material-icon\">chevron_right</span>\n    </a>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\n\nexport default function ({ post }) {\n  return (\n    <div className=\"post-side post-side-anonymous\">\n      <GoToButton post={post} />\n      <div className=\"media\">\n        <div className=\"media-left\">\n          <span>\n            <Avatar className=\"poster-avatar\" size={50} />\n          </span>\n        </div>\n        <div className=\"media-body\">\n          <div className=\"media-heading\">\n            <span className=\"item-title\">{post.poster_name}</span>\n          </div>\n          <span className=\"user-title user-title-anonymous\">\n            {pgettext(\"post removed poster username\", \"Removed user\")}\n          </span>\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n  let userTitle = title || rank.title || rank.name\n\n  let className = \"user-title\"\n  if (rank.css_class) {\n    className += \" user-title-\" + rank.css_class\n  }\n\n  if (rank.is_tab) {\n    return (\n      <a className={className} href={rank.url}>\n        {userTitle}\n      </a>\n    )\n  }\n\n  return <span className={className}>{userTitle}</span>\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport GoToButton from \"./button\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, poster }) {\n  return (\n    <div className=\"post-side post-side-registered\">\n      <GoToButton post={post} />\n      <div className=\"media\">\n        <div className=\"media-left\">\n          <a href={poster.url}>\n            <Avatar className=\"poster-avatar\" size={50} user={poster} />\n          </a>\n        </div>\n        <div className=\"media-body\">\n          <div className=\"media-heading\">\n            <a className=\"item-title\" href={poster.url}>\n              {poster.username}\n            </a>\n          </div>\n          <UserTitle title={poster.title} rank={poster.rank} />\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function ({ post, poster }) {\n  if (poster && poster.id) {\n    return <Registered post={post} poster={poster} />\n  }\n\n  return <Anonymous post={post} />\n}\n","import React from \"react\"\nimport Body from \"./body\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function ({ post, poster }) {\n  const user = poster || post.poster\n\n  let className = \"post\"\n  if (user && user.rank.css_class) {\n    className += \" post-\" + user.rank.css_class\n  }\n\n  return (\n    <li className={className} id={\"post-\" + post.id}>\n      <div className=\"panel panel-default panel-post\">\n        <div className=\"panel-body\">\n          <div className=\"panel-content\">\n            <PostSide post={post} poster={user} />\n            <Header post={post} />\n            <Body post={post} />\n          </div>\n        </div>\n      </div>\n    </li>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default function () {\n  return (\n    <ul className=\"posts-list post-feed ui-preview\">\n      <li className=\"post\">\n        <div className=\"panel panel-default panel-post\">\n          <div className=\"panel-body\">\n            <div className=\"panel-content\">\n              <div className=\"post-side post-side-anonymous\">\n                <div className=\"media\">\n                  <div className=\"media-left\">\n                    <span>\n                      <Avatar className=\"poster-avatar\" size={50} />\n                    </span>\n                  </div>\n                  <div className=\"media-body\">\n                    <div className=\"media-heading\">\n                      <span className=\"item-title\">\n                        <span\n                          className=\"ui-preview-text\"\n                          style={{ width: random.int(30, 200) + \"px\" }}\n                        >\n                          &nbsp;\n                        </span>\n                      </span>\n                    </div>\n                    <span className=\"user-title user-title-anonymous\">\n                      <span\n                        className=\"ui-preview-text\"\n                        style={{ width: random.int(30, 200) + \"px\" }}\n                      >\n                        &nbsp;\n                      </span>\n                    </span>\n                  </div>\n                </div>\n              </div>\n              <div className=\"post-heading\">\n                <span\n                  className=\"ui-preview-text\"\n                  style={{ width: random.int(30, 200) + \"px\" }}\n                >\n                  &nbsp;\n                </span>\n              </div>\n              <div className=\"post-body\">\n                <article className=\"misago-markup\">\n                  <p>\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 200) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                    &nbsp;\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 200) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                    &nbsp;\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 200) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                  </p>\n                </article>\n              </div>\n            </div>\n          </div>\n        </div>\n      </li>\n    </ul>\n  )\n}\n","import React from \"react\"\nimport Post from \"./post\"\nimport Preview from \"./preview\"\n\nexport default function ({ isReady, posts, poster }) {\n  if (!isReady) {\n    return <Preview />\n  }\n\n  return (\n    <ul className=\"posts-list post-feed ui-ready\">\n      {posts.map((post) => {\n        return <Post key={post.id} post={post} poster={poster} />\n      })}\n    </ul>\n  )\n}\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport { getGlobalState, getQuoteMarkup } from \"../posting\"\n\nexport default class PostingQuoteSelection extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      range: null,\n      rect: null,\n    }\n\n    this.element = null\n  }\n\n  selected = () => {\n    if (this.element) {\n      const range = getQuoteSelection(this.element) || null\n      const rect = range ? range.getBoundingClientRect() : null\n\n      this.setState({ range, rect })\n    }\n  }\n\n  reply = () => {\n    if (!posting.isOpen()) {\n      const content = getQuoteMarkup(this.state.range)\n      posting.open(Object.assign({}, this.props.posting, { default: content }))\n\n      this.setState({ range: null, rect: null })\n\n      window.setTimeout(focusEditor, 1000)\n    } else {\n      const globalState = getGlobalState()\n      if (globalState && !globalState.disabled) {\n        globalState.quote(getQuoteMarkup(this.state.range))\n        this.setState({ range: null, rect: null })\n        focusEditor()\n      }\n    }\n  }\n\n  render = () => (\n    <div>\n      <div\n        ref={(element) => {\n          if (element) {\n            this.element = element\n          }\n        }}\n        onMouseUp={this.selected}\n        onTouchEnd={this.selected}\n      >\n        {this.props.children}\n      </div>\n      {!!this.state.rect && (\n        <div\n          className=\"quote-control\"\n          style={{\n            position: \"absolute\",\n            left: this.state.rect.left + window.scrollX,\n            top: this.state.rect.bottom + window.scrollY,\n          }}\n        >\n          <div className=\"quote-control-arrow\" />\n          <div className=\"quote-control-inner\">\n            <button\n              className=\"btn quote-control-btn\"\n              type=\"button\"\n              onClick={this.reply}\n            >\n              {pgettext(\"post reply\", \"Quote\")}\n            </button>\n          </div>\n        </div>\n      )}\n    </div>\n  )\n}\n\nfunction focusEditor() {\n  const textarea = document.querySelector(\"#posting-mount textarea\")\n  textarea.focus()\n  textarea.selectionStart = textarea.selectionEnd = textarea.value.length\n}\n\nconst getQuoteSelection = (container) => {\n  if (typeof window.getSelection === \"undefined\") return\n\n  // Validate that selection is of valid type and has one range\n  const selection = window.getSelection()\n  if (!selection) return\n  if (selection.type !== \"Range\") return\n  if (selection.rangeCount !== 1) return\n\n  // Validate that selection is within the container and post's article\n  const range = selection.getRangeAt(0)\n  if (!isRangeContained(range, container)) return\n  if (!isPostContained(range)) return\n  if (!isAnyTextSelected(range.cloneContents())) return\n\n  return range\n}\n\nconst isRangeContained = (range, container) => {\n  const node = range.commonAncestorContainer\n  if (node === container) return true\n\n  let p = node.parentNode\n  while (p) {\n    if (p === container) return true\n    p = p.parentNode\n  }\n\n  return false\n}\n\nconst isPostContained = (range) => {\n  const element = range.commonAncestorContainer\n  if (element.nodeName === \"ARTICLE\") return true\n  if (element.dataset && element.dataset.noquote === \"1\") return false\n  let p = element.parentNode\n  while (p) {\n    if (p.dataset && p.dataset.noquote === \"1\") return false\n    if (p.nodeName === \"ARTICLE\") return true\n    p = p.parentNode\n  }\n  return false\n}\n\nconst isAnyTextSelected = (node) => {\n  for (let i = 0; i < node.childNodes.length; i++) {\n    const child = node.childNodes[i]\n    if (child.nodeType === Node.TEXT_NODE) {\n      if (child.textContent && child.textContent.trim().length > 0) return true\n    }\n    if (child.nodeName === \"IMG\") return true\n    if (isAnyTextSelected(child)) return true\n  }\n\n  return false\n}\n","const getQuoteMarkup = (range) => {\n  const metadata = getQuoteMetadata(range)\n  let markup = convertNodesToMarkup(range.cloneContents().childNodes, [])\n  let prefix = metadata ? `[quote=\"${metadata}\"]\\n` : \"[quote]\\n\"\n  let suffix = \"\\n[/quote]\\n\\n\"\n\n  const codeBlock = getQuoteCodeBlock(range)\n  if (codeBlock) {\n    prefix += codeBlock.syntax ? `[code=${codeBlock.syntax}]\\n` : \"[code]\\n\"\n    suffix = \"\\n[/code]\" + suffix\n  } else if (isNodeInlineCodeBlock(range)) {\n    markup = markup.trim()\n    prefix += \"`\"\n    suffix = \"`\" + suffix\n  } else {\n    markup = markup.trim()\n  }\n\n  return prefix + markup + suffix\n}\n\nexport default getQuoteMarkup\n\nconst getQuoteMetadata = (range) => {\n  const node = range.commonAncestorContainer\n  if (isNodeElementWithQuoteMetadata(node)) {\n    return getQuoteMetadataFromNode(node)\n  }\n\n  let p = node.parentNode\n  while (p) {\n    if (isNodeElementWithQuoteMetadata(p)) {\n      return getQuoteMetadataFromNode(p)\n    }\n    p = p.parentNode\n  }\n\n  return \"\"\n}\n\nconst isNodeElementWithQuoteMetadata = (node) => {\n  if (node.nodeType !== Node.ELEMENT_NODE) return false\n  if (node.nodeName === \"ARTICLE\") return true\n  if (node.nodeName === \"BLOCKQUOTE\") {\n    return node.dataset && node.dataset.block === \"quote\"\n  }\n\n  return false\n}\n\nconst getQuoteMetadataFromNode = (element) => {\n  if (element.dataset) {\n    return element.dataset.author || null\n  }\n  return null\n}\n\nconst getQuoteCodeBlock = (range) => {\n  const node = range.commonAncestorContainer\n  if (isNodeCodeBlock(node)) {\n    return getNodeCodeBlockMeta(node)\n  }\n\n  let p = node.parentNode\n  while (p) {\n    if (isNodeCodeBlock(p)) {\n      return getNodeCodeBlockMeta(p)\n    }\n    p = p.parentNode\n  }\n\n  return null\n}\n\nconst isNodeCodeBlock = (node) => {\n  return node.nodeName === \"PRE\"\n}\n\nconst isNodeInlineCodeBlock = (range) => {\n  const node = range.commonAncestorContainer\n  if (node.nodeName === \"CODE\") {\n    return true\n  }\n\n  let p = node.parentNode\n  while (p) {\n    if (isNodeElementWithQuoteMetadata(p)) {\n      return false\n    }\n\n    if (p.nodeName === \"CODE\") {\n      return true\n    }\n\n    p = p.parentNode\n  }\n\n  return false\n}\n\nconst getNodeCodeBlockMeta = (node) => {\n  if (!node.dataset) {\n    return { syntax: null }\n  }\n\n  return { syntax: node.dataset.syntax || null }\n}\n\nconst convertNodesToMarkup = (nodes, stack) => {\n  let markup = \"\"\n  for (let i = 0; i < nodes.length; i++) {\n    const node = nodes[i]\n    markup += convertNodeToMarkup(node, stack)\n  }\n  return markup\n}\n\nconst SIMPLE_NODE_MAPPINGS = {\n  H1: [\"\\n\\n# \", \"\"],\n  H2: [\"\\n\\n## \", \"\"],\n  H3: [\"\\n\\n### \", \"\"],\n  H4: [\"\\n\\n#### \", \"\"],\n  H5: [\"\\n\\n##### \", \"\"],\n  H6: [\"\\n\\n###### \", \"\"],\n  STRONG: [\"**\", \"**\"],\n  EM: [\"*\", \"*\"],\n  DEL: [\"~~\", \"~~\"],\n  B: [\"[b]\", \"[/b]\"],\n  U: [\"[u]\", \"[/u]\"],\n  I: [\"[i]\", \"[/i]\"],\n  SUB: [\"[sub]\", \"[/sub]\"],\n  SUP: [\"[sup]\", \"[/sup]\"],\n}\n\nconst convertNodeToMarkup = (node, stack) => {\n  const dataset = node.dataset || {}\n\n  if (node.nodeType === Node.TEXT_NODE) {\n    return node.textContent || \"\"\n  }\n\n  if (node.nodeType === Node.ELEMENT_NODE) {\n    if (dataset.quote) {\n      return dataset.quote || \"\"\n    }\n    if (dataset.noquote === \"1\") return \"\"\n  }\n\n  if (\n    node.nodeType === Node.ELEMENT_NODE &&\n    dataset.quote &&\n    dataset.quote.trim()\n  ) {\n    return \"\"\n  }\n\n  if (node.nodeName === \"HR\") {\n    return \"\\n\\n- - -\"\n  }\n\n  if (SIMPLE_NODE_MAPPINGS[node.nodeName]) {\n    const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[node.nodeName]\n    return (\n      prefix +\n      convertNodesToMarkup(node.childNodes, [...stack, node.nodeName]) +\n      suffix\n    )\n  }\n\n  if (node.nodeName === \"A\") {\n    const href = node.href\n    const text = convertNodesToMarkup(node.childNodes, [\n      ...stack,\n      node.nodeName,\n    ])\n    if (text) {\n      return `[${text}](${href})`\n    } else {\n      return `!(${href})`\n    }\n  }\n\n  if (node.nodeName === \"IMG\") {\n    const src = node.src\n    const alt = node.alt\n    if (alt) {\n      return `![${alt}](${src})`\n    } else {\n      return `!(${src})`\n    }\n  }\n\n  if (node.nodeName === \"DIV\" || node.nodeName === \"ASIDE\") {\n    const block = dataset.block && dataset.block.toUpperCase()\n    if (block && SIMPLE_NODE_MAPPINGS[block]) {\n      const [prefix, suffix] = SIMPLE_NODE_MAPPINGS[block]\n      return (\n        prefix +\n        convertNodesToMarkup(node.childNodes, [...stack, block]) +\n        suffix\n      )\n    } else {\n      return convertNodesToMarkup(node.childNodes, stack)\n    }\n  }\n\n  if (node.nodeName === \"BLOCKQUOTE\") {\n    if (dataset.block === \"spoiler\") {\n      const content = convertNodesToMarkup(node.childNodes, [\n        ...stack,\n        \"SPOILER\",\n      ]).trim()\n\n      if (!content) return \"\"\n\n      let markup = \"\\n[spoiler]\\n\"\n      markup += content\n      markup += \"\\n[/spoiler]\"\n      return markup\n    }\n\n    const content = convertNodesToMarkup(node.childNodes, [\n      ...stack,\n      \"QUOTE\",\n    ]).trim()\n\n    if (!content) return \"\"\n\n    const metadata = getQuoteMetadataFromNode(node)\n    let markup = metadata ? `\\n[quote=${metadata}]\\n` : \"\\n\\n[quote]\\n\"\n    markup += content\n    markup += \"\\n[/quote]\"\n    return markup\n  }\n\n  if (node.nodeName === \"PRE\") {\n    const syntax = dataset.syntax || null\n    const code = node.querySelector(\"code\")\n    const content = code ? code.innerText || \"\" : \"\"\n\n    if (!content.trim()) return \"\"\n\n    return \"\\n[code\" + (syntax ? \"=\" + syntax : \"\") + \"]\" + content + \"[/code]\"\n  }\n\n  if (node.nodeName === \"CODE\") {\n    return \"`\" + node.innerText + \"`\"\n  }\n\n  if (node.nodeName === \"P\") {\n    return (\n      \"\\n\" + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n    )\n  }\n\n  if (node.nodeName === \"UL\" || node.nodeName === \"OL\") {\n    const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n    const prefix = level === 0 ? \"\\n\" : \"\"\n    return (\n      prefix + convertNodesToMarkup(node.childNodes, [...stack, node.nodeName])\n    )\n  }\n\n  if (node.nodeName === \"LI\") {\n    let prefix = \"\"\n    const level = stack.filter((item) => item === \"OL\" || item === \"UL\").length\n    for (let i = 1; i < level; i++) {\n      prefix += \"    \"\n    }\n\n    const ordered = stack[stack.length - 1] === \"OL\"\n    if (ordered) {\n      prefix += dataset.index ? dataset.index + \". \" : \"1. \"\n    } else {\n      prefix += \"- \"\n    }\n\n    const content = convertNodesToMarkup(node.childNodes, [\n      ...stack,\n      node.nodeName,\n    ])\n    if (!content.trim()) return \"\"\n\n    return \"\\n\" + prefix + content\n  }\n\n  if (node.nodeName === \"SPAN\") {\n    return convertNodesToMarkup(node.childNodes, stack)\n  }\n\n  return \"\"\n}\n","export function getGlobalState() {\n  return window.misagoReply\n}\n\nexport function setGlobalState(disabled, quote) {\n  window.misagoReply = { disabled, quote }\n}\n\nexport function clearGlobalState() {\n  window.misagoReply = null\n}\n","import moment from \"moment\"\n\nexport function clean(attachments) {\n  return attachments\n    .filter((attachment) => {\n      return attachment.id && !attachment.isRemoved\n    })\n    .map((a) => {\n      return a.id\n    })\n}\n\nexport function hydrate(attachments) {\n  return attachments.map((attachment) => {\n    return Object.assign({}, attachment, {\n      uploaded_on: moment(attachment.uploaded_on),\n    })\n  })\n}\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupAttachmentModal({ attachment }) {\n  return (\n    <div className=\"modal-dialog modal-lg\" role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\"markup editor\", \"Attachment details\")}\n          </h4>\n        </div>\n        <div className=\"modal-body\">\n          {!!attachment.is_image && (\n            <div className=\"markup-editor-attachment-modal-preview\">\n              <a href={attachment.url.index + \"?shva=1\"} target=\"_blank\">\n                <img src={attachment.url.index + \"?shva=1\"} alt=\"\" />\n              </a>\n            </div>\n          )}\n          <div className=\"markup-editor-attachment-modal-filename\">\n            {attachment.filename}\n          </div>\n          <div className=\"row markup-editor-attachment-modal-details\">\n            <div className=\"col-xs-12 col-md-3\">\n              <strong>\n                {attachment.filetype + \", \" + formatFilesize(attachment.size)}\n              </strong>\n              <div className=\"text-muted\">\n                <small>{pgettext(\"markup editor\", \"Type and size\")}</small>\n              </div>\n            </div>\n            <div className=\"col-xs-12 col-md-4\">\n              <strong>\n                <abbr title={attachment.uploaded_on.format(\"LLL\")}>\n                  {attachment.uploaded_on.fromNow()}\n                </abbr>\n              </strong>\n              <div className=\"text-muted\">\n                <small>{pgettext(\"markup editor\", \"Uploaded at\")}</small>\n              </div>\n            </div>\n            <div className=\"col-xs-12 col-md-3\">\n              {attachment.url.uploader ? (\n                <a\n                  href={attachment.url.uploader}\n                  target=\"_blank\"\n                  className=\"item-title\"\n                >\n                  {attachment.uploader_name}\n                </a>\n              ) : (\n                <span className=\"item-title\">{attachment.uploader_name}</span>\n              )}\n              <div className=\"text-muted\">\n                <small>{pgettext(\"markup editor\", \"Uploader\")}</small>\n              </div>\n            </div>\n          </div>\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"modal\", \"Close\")}\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n","const wrapSelection = (selection, update, prefix, suffix, def) => {\n  const text = selection.text || def || \"\"\n  let newValue = selection.prefix\n  newValue += prefix + text + suffix\n  newValue += selection.suffix\n  update(newValue)\n\n  window.setTimeout(() => {\n    focus(selection.textarea)\n\n    const caret = selection.start + prefix.length\n    selection.textarea.setSelectionRange(caret, caret + text.length)\n  }, 250)\n}\n\nconst replaceSelection = (selection, update, text) => {\n  let newValue = selection.prefix\n  newValue += text\n  newValue += selection.suffix\n  update(newValue)\n\n  window.setTimeout(() => {\n    focus(selection.textarea)\n\n    const caret = selection.end + text.length\n    selection.textarea.setSelectionRange(caret, caret)\n  }, 250)\n}\n\nconst getSelection = (textarea) => {\n  if (document.selection) {\n    textarea.focus()\n    const range = document.selection.createRange()\n    const length = range.text.length\n    range.moveStart(\"character\", -textarea.value.length)\n    return createRange(textarea, range.text.length - length, range.text.length)\n  }\n\n  if (textarea.selectionStart || textarea.selectionStart == \"0\") {\n    return createRange(textarea, textarea.selectionStart, textarea.selectionEnd)\n  }\n}\n\nconst createRange = (textarea, start, end) => {\n  return {\n    textarea: textarea,\n    start: start,\n    end: end,\n    text: textarea.value.substring(start, end),\n    prefix: textarea.value.substring(0, start),\n    suffix: textarea.value.substring(end),\n  }\n}\n\nexport function focus(textarea) {\n  const scroll = textarea.scrollTop\n  textarea.focus()\n  textarea.scrollTop = scroll\n}\n\nexport { getSelection, replaceSelection, wrapSelection }\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport MarkupAttachmentModal from \"./MarkupAttachmentModal\"\nimport { getSelection, replaceSelection } from \"./operations\"\n\nconst MarkupEditorAttachment = ({\n  attachment,\n  disabled,\n  element,\n  setState,\n  update,\n}) => (\n  <div className=\"markup-editor-attachments-item\">\n    <div className=\"markup-editor-attachment\">\n      <div className=\"markup-editor-attachment-details\">\n        {attachment.id ? (\n          <a\n            className=\"item-title\"\n            href={attachment.url.index + \"?shva=1\"}\n            target=\"_blank\"\n            onClick={(event) => {\n              event.preventDefault()\n              modal.show(<MarkupAttachmentModal attachment={attachment} />)\n            }}\n          >\n            {attachment.filename}\n          </a>\n        ) : (\n          <strong className=\"item-title\">{attachment.filename}</strong>\n        )}\n        <div className=\"text-muted\">\n          <ul className=\"list-unstyled list-inline\">\n            {!attachment.id && <li>{attachment.progress + \"%\"}</li>}\n            {!!attachment.filetype && <li>{attachment.filetype}</li>}\n            {attachment.size > 0 && <li>{formatFilesize(attachment.size)}</li>}\n          </ul>\n        </div>\n      </div>\n      {!!attachment.id && (\n        <div className=\"markup-editor-attachment-buttons\">\n          <button\n            className=\"btn btn-markup-editor-attachment btn-icon\"\n            title={pgettext(\"markup editor\", \"Insert into message\")}\n            type=\"button\"\n            disabled={disabled}\n            onClick={() => {\n              const markup = getAttachmentMarkup(attachment)\n              const selection = getSelection(element)\n              replaceSelection(selection, update, markup)\n            }}\n          >\n            <span className=\"material-icon\">flip_to_front</span>\n          </button>\n          <button\n            className=\"btn btn-markup-editor-attachment btn-icon\"\n            title={pgettext(\"markup editor\", \"Remove attachment\")}\n            type=\"button\"\n            disabled={disabled}\n            onClick={() => {\n              setState(({ attachments }) => {\n                const confirm = window.confirm(\n                  pgettext(\"markup editor\", \"Remove this attachment?\")\n                )\n\n                if (confirm) {\n                  return {\n                    attachments: attachments.filter(\n                      ({ id }) => id !== attachment.id\n                    ),\n                  }\n                }\n              })\n            }}\n          >\n            <span className=\"material-icon\">close</span>\n          </button>\n        </div>\n      )}\n      {!attachment.id && !!attachment.key && (\n        <div className=\"markup-editor-attachment-buttons\">\n          {attachment.error && (\n            <button\n              className=\"btn btn-markup-editor-attachment btn-icon\"\n              title={pgettext(\"markup editor\", \"See error\")}\n              type=\"button\"\n              onClick={() => {\n                snackbar.error(\n                  interpolate(\n                    pgettext(\"markup editor\", \"%(filename)s: %(error)s\"),\n                    { filename: attachment.filename, error: attachment.error },\n                    true\n                  )\n                )\n              }}\n            >\n              <span className=\"material-icon\">warning</span>\n            </button>\n          )}\n          <button\n            className=\"btn btn-markup-editor-attachment btn-icon\"\n            title={pgettext(\"markup editor\", \"Remove attachment\")}\n            type=\"button\"\n            disabled={disabled}\n            onClick={() => {\n              setState(({ attachments }) => {\n                return {\n                  attachments: attachments.filter(\n                    ({ key }) => key !== attachment.key\n                  ),\n                }\n              })\n            }}\n          >\n            <span className=\"material-icon\">close</span>\n          </button>\n        </div>\n      )}\n    </div>\n  </div>\n)\n\nexport default MarkupEditorAttachment\n\nfunction getAttachmentMarkup(attachment) {\n  let markup = \"[\"\n\n  if (attachment.is_image) {\n    markup += \"![\" + attachment.filename + \"]\"\n    markup += \"(\" + (attachment.url.thumb || attachment.url.index) + \"?shva=1)\"\n  } else {\n    markup += attachment.filename\n  }\n\n  markup += \"](\" + attachment.url.index + \"?shva=1)\"\n  return markup\n}\n","import React from \"react\"\nimport MarkupEditorAttachment from \"./MarkupEditorAttachment\"\n\nconst MarkupEditorAttachments = ({\n  attachments,\n  disabled,\n  element,\n  setState,\n  update,\n}) => (\n  <div className=\"markup-editor-attachments\">\n    <div className=\"markup-editor-attachments-container\">\n      {attachments.map((attachment) => (\n        <MarkupEditorAttachment\n          key={attachment.key || attachment.id}\n          attachment={attachment}\n          disabled={disabled}\n          element={element}\n          setState={setState}\n          update={update}\n        />\n      ))}\n    </div>\n  </div>\n)\n\nexport default MarkupEditorAttachments\n","import React from \"react\"\nimport Button from \"../button\"\n\nconst MarkupEditorFooter = ({\n  canProtect,\n  disabled,\n  empty,\n  preview,\n  isProtected,\n  submitText,\n  showPreview,\n  closePreview,\n  enableProtection,\n  disableProtection,\n}) => (\n  <div className=\"markup-editor-footer\">\n    {!!canProtect && (\n      <Button\n        className=\"btn-default btn-icon hidden-sm hidden-md hidden-lg\"\n        title={\n          isProtected\n            ? pgettext(\"markup editor\", \"Protected\")\n            : pgettext(\"markup editor\", \"Protect\")\n        }\n        type=\"button\"\n        disabled={disabled}\n        onClick={() => {\n          if (isProtected) {\n            disableProtection()\n          } else {\n            enableProtection()\n          }\n        }}\n      >\n        <span className=\"material-icon\">\n          {isProtected ? \"lock\" : \"lock_open\"}\n        </span>\n      </Button>\n    )}\n    {!!canProtect && (\n      <div>\n        <Button\n          className=\"btn-default hidden-xs\"\n          type=\"button\"\n          disabled={disabled}\n          onClick={() => {\n            if (isProtected) {\n              disableProtection()\n            } else {\n              enableProtection()\n            }\n          }}\n        >\n          <span className=\"material-icon\">\n            {isProtected ? \"lock\" : \"lock_open\"}\n          </span>\n          {isProtected\n            ? pgettext(\"markup editor\", \"Protected\")\n            : pgettext(\"markup editor\", \"Protect\")}\n        </Button>\n      </div>\n    )}\n    <div className=\"markup-editor-spacer\" />\n    {preview ? (\n      <Button\n        className=\"btn-default btn-auto\"\n        type=\"button\"\n        onClick={closePreview}\n      >\n        {pgettext(\"markup editor\", \"Edit\")}\n      </Button>\n    ) : (\n      <Button\n        className=\"btn-default btn-auto\"\n        disabled={disabled || empty}\n        type=\"button\"\n        onClick={showPreview}\n      >\n        {pgettext(\"markup editor\", \"Preview\")}\n      </Button>\n    )}\n    <Button className=\"btn-primary btn-auto\" disabled={disabled || empty}>\n      {submitText || pgettext(\"markup editor\", \"Post\")}\n    </Button>\n  </div>\n)\n\nexport default MarkupEditorFooter\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupCodeModal extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      error: null,\n      syntax: \"\",\n      text: props.selection.text,\n    }\n  }\n\n  handleSubmit = (ev) => {\n    ev.preventDefault()\n\n    const { selection, update } = this.props\n    const syntax = this.state.syntax.trim()\n    const text = this.state.text.trim()\n\n    if (text.length === 0) {\n      this.setState({ error: gettext(\"This field is required.\") })\n      return false\n    }\n\n    const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n    replaceSelection(\n      Object.assign({}, selection, { text }),\n      update,\n      prefix + \"```\" + syntax + \"\\n\" + text + \"\\n```\\n\\n\"\n    )\n\n    modal.hide()\n\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-lg\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">{pgettext(\"markup editor\", \"Code\")}</h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"markup_code_syntax\"\n                label={pgettext(\"markup editor\", \"Syntax highlighting\")}\n              >\n                <select\n                  id=\"markup_code_syntax\"\n                  className=\"form-control\"\n                  value={this.state.syntax}\n                  onChange={(event) =>\n                    this.setState({ syntax: event.target.value })\n                  }\n                >\n                  <option value=\"\">\n                    {pgettext(\"markup editor\", \"No syntax highlighting\")}\n                  </option>\n                  {LANGUAGES.map(({ value, name }) => (\n                    <option key={value} value={value}>\n                      {name}\n                    </option>\n                  ))}\n                </select>\n              </FormGroup>\n              <FormGroup\n                for=\"markup_code_text\"\n                label={pgettext(\"markup editor\", \"Code to insert\")}\n                validation={!!this.state.error ? [this.state.error] : undefined}\n              >\n                <textarea\n                  id=\"markup_code_text\"\n                  className=\"form-control\"\n                  rows=\"8\"\n                  value={this.state.text}\n                  onChange={(event) =>\n                    this.setState({ text: event.target.value })\n                  }\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                type=\"button\"\n              >\n                {pgettext(\"markup editor\", \"Cancel\")}\n              </button>\n              <button className=\"btn btn-primary\">\n                {pgettext(\"markup editor\", \"Insert code\")}\n              </button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nconst LANGUAGES = [\n  { value: \"bash\", name: \"Bash\" },\n  { value: \"c\", name: \"C\" },\n  { value: \"c#\", name: \"C#\" },\n  { value: \"c++\", name: \"C++\" },\n  { value: \"css\", name: \"CSS\" },\n  { value: \"diff\", name: \"Diff\" },\n  { value: \"go\", name: \"Go\" },\n  { value: \"graphql\", name: \"GraphQL\" },\n  { value: \"html,\", name: \"HTML\" },\n  { value: \"xml\", name: \"XML\" },\n  { value: \"json\", name: \"JSON\" },\n  { value: \"java\", name: \"Java\" },\n  { value: \"javascript\", name: \"JavaScript\" },\n  { value: \"kotlin\", name: \"Kotlin\" },\n  { value: \"less\", name: \"Less\" },\n  { value: \"lua\", name: \"Lua\" },\n  { value: \"makefile\", name: \"Makefile\" },\n  { value: \"markdown\", name: \"Markdown\" },\n  { value: \"objective-C\", name: \"Objective-C\" },\n  { value: \"php\", name: \"PHP\" },\n  { value: \"perl\", name: \"Perl\" },\n  { value: \"plain\", name: \"Plain\" },\n  { value: \"text\", name: \"text\" },\n  { value: \"python\", name: \"Python\" },\n  { value: \"repl\", name: \"REPL\" },\n  { value: \"r\", name: \"R\" },\n  { value: \"ruby\", name: \"Ruby\" },\n  { value: \"rust\", name: \"Rust\" },\n  { value: \"scss\", name: \"SCSS\" },\n  { value: \"sql\", name: \"SQL\" },\n  { value: \"shell\", name: \"Shell Session\" },\n  { value: \"swift\", name: \"Swift\" },\n  { value: \"toml\", name: \"TOML\" },\n  { value: \"ini\", name: \"INI\" },\n  { value: \"typescript\", name: \"TypeScript\" },\n  { value: \"visualbasic\", name: \"Visual Basic .NET\" },\n  { value: \"webassembly\", name: \"WebAssembly\" },\n  { value: \"yaml\", name: \"YAML\" },\n]\n\nexport default MarkupCodeModal\n","import React from \"react\"\nimport formatFilesize from \"../../utils/file-size\"\n\nexport default function MarkupFormattingHelpModal() {\n  return (\n    <div className=\"modal-dialog modal-lg\" role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\"markup help\", \"Formatting help\")}\n          </h4>\n        </div>\n        <div className=\"modal-body formatting-help\">\n          <h4>{pgettext(\"markup help\", \"Emphasis text\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"_This text will have emphasis_\")}\n            result={\n              <p>\n                <em>\n                  {pgettext(\"markup help\", \"This text will have emphasis\")}\n                </em>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Bold text\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"**This text will be bold**\")}\n            result={\n              <p>\n                <strong>\n                  {pgettext(\"markup help\", \"This text will be bold\")}\n                </strong>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Removed text\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"~~This text will be removed~~\")}\n            result={\n              <p>\n                <del>\n                  {pgettext(\"markup help\", \"This text will be removed\")}\n                </del>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Bold text (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"[b]This text will be bold[/b]\")}\n            result={\n              <p>\n                <b>{pgettext(\"markup help\", \"This text will be bold\")}</b>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Underlined text (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\n              \"markup help\",\n              \"[u]This text will be underlined[/u]\"\n            )}\n            result={\n              <p>\n                <u>{pgettext(\"markup help\", \"This text will be underlined\")}</u>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Italics text (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\n              \"markup help\",\n              \"[i]This text will be in italics[/i]\"\n            )}\n            result={\n              <p>\n                <i>{pgettext(\"markup help\", \"This text will be in italics\")}</i>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Link\")}</h4>\n          <ExampleFormatting\n            markup=\"<http://example.com>\"\n            result={\n              <p>\n                <a href=\"#\">example.com</a>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Link with text\")}</h4>\n          <ExampleFormatting\n            markup={\n              \"[\" +\n              pgettext(\"markup help\", \"Link text\") +\n              \"](http://example.com)\"\n            }\n            result={\n              <p>\n                <a href=\"#\">{pgettext(\"markup help\", \"Link text\")}</a>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Link (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup=\"[url]http://example.com[/url]\"\n            result={\n              <p>\n                <a href=\"#\">example.com</a>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Link with text (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={\n              \"[url=http://example.com]\" +\n              pgettext(\"markup help\", \"Link text\") +\n              \"[/url]\"\n            }\n            result={\n              <p>\n                <a href=\"#\">{pgettext(\"markup help\", \"Link text\")}</a>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Image\")}</h4>\n          <ExampleFormatting\n            markup=\"!(http://dummyimage.com/38/38)\"\n            result={\n              <p>\n                <img alt=\"\" src=\"http://dummyimage.com/38/38\" />\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Image with alternate text\")}</h4>\n          <ExampleFormatting\n            markup={\n              \"![\" +\n              pgettext(\"markup help\", \"Image text\") +\n              \"](http://dummyimage.com/38/38)\"\n            }\n            result={\n              <p>\n                <img\n                  alt={pgettext(\"markup help\", \"Image text\")}\n                  src=\"http://dummyimage.com/38/38\"\n                />\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Image (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup=\"[img]http://dummyimage.com/38/38[/img]\"\n            result={\n              <p>\n                <img alt=\"\" src=\"http://dummyimage.com/38/38\" />\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Mention user by their name\")}</h4>\n          <ExampleFormatting\n            markup=\"@username\"\n            result={\n              <p>\n                <a href=\"#\">@username</a>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Heading 1\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"# First level heading\")}\n            result={<h1>{pgettext(\"markup help\", \"First level heading\")}</h1>}\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Heading 2\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"## Second level heading\")}\n            result={<h2>{pgettext(\"markup help\", \"Second level heading\")}</h2>}\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Heading 3\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"### Third level heading\")}\n            result={<h3>{pgettext(\"markup help\", \"Third level heading\")}</h3>}\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Heading 4\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"#### Fourth level heading\")}\n            result={<h4>{pgettext(\"markup help\", \"Fourth level heading\")}</h4>}\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Heading 5\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"##### Fifth level heading\")}\n            result={<h5>{pgettext(\"markup help\", \"Fifth level heading\")}</h5>}\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Unordered list\")}</h4>\n          <ExampleFormatting\n            markup={\"- Lorem ipsum\\n- Dolor met\\n- Vulputate lectus\"}\n            result={\n              <ul>\n                <li>Lorem ipsum</li>\n                <li>Dolor met</li>\n                <li>Vulputate lectus</li>\n              </ul>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Ordered list\")}</h4>\n          <ExampleFormatting\n            markup={\"1. Lorem ipsum\\n2. Dolor met\\n3. Vulputate lectus\"}\n            result={\n              <ol>\n                <li>Lorem ipsum</li>\n                <li>Dolor met</li>\n                <li>Vulputate lectus</li>\n              </ol>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Quote text\")}</h4>\n          <ExampleFormatting\n            markup={\"> \" + pgettext(\"markup help\", \"Quoted text\")}\n            result={\n              <blockquote>\n                <p>{pgettext(\"markup help\", \"Quoted text\")}</p>\n              </blockquote>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Quote text (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={\n              \"[quote]\\n\" +\n              pgettext(\"markup help\", \"Quoted text\") +\n              \"\\n[/quote]\"\n            }\n            result={\n              <aside className=\"quote-block\">\n                <div className=\"quote-heading\">\n                  {gettext(\"Quoted message:\")}\n                </div>\n                <blockquote className=\"quote-body\">\n                  <p>{pgettext(\"markup help\", \"Quoted text\")}</p>\n                </blockquote>\n              </aside>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Quote text with author (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={\n              '[quote=\"' +\n              pgettext(\"markup help\", \"Quote author\") +\n              '\"]\\n' +\n              pgettext(\"markup help\", \"Quoted text\") +\n              \"\\n[/quote]\"\n            }\n            result={\n              <aside className=\"quote-block\">\n                <div className=\"quote-heading\">\n                  {pgettext(\"markup help\", \"Quote author has written:\")}\n                </div>\n                <blockquote className=\"quote-body\">\n                  <p>{pgettext(\"markup help\", \"Quoted text\")}</p>\n                </blockquote>\n              </aside>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Spoiler\")}</h4>\n          <ExampleFormatting\n            markup={\n              \"[spoiler]\\n\" +\n              pgettext(\"markup help\", \"Secret text\") +\n              \"\\n[/spoiler]\"\n            }\n            result={\n              <ExampleFormattingSpoiler>\n                {pgettext(\"markup help\", \"Secret text\")}\n              </ExampleFormattingSpoiler>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Inline code\")}</h4>\n          <ExampleFormatting\n            markup={pgettext(\"markup help\", \"`Inline code`\")}\n            result={\n              <p>\n                <code>{pgettext(\"markup help\", \"Inline code\")}</code>\n              </p>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Code block\")}</h4>\n          <ExampleFormatting\n            markup={\"```\\nalert\" + '(\"Hello world!\");' + \"\\n```\"}\n            result={\n              <pre>\n                <code className=\"hljs\">alert(\"Hello world!\");</code>\n              </pre>\n            }\n          />\n\n          <hr />\n\n          <h4>\n            {pgettext(\"markup help\", \"Code block with syntax highlighting\")}\n          </h4>\n          <ExampleFormatting\n            markup={\"```python\\nprint\" + '(\"Hello world!\");' + \"\\n```\"}\n            result={\n              <pre>\n                <code className=\"hljs language-python\">\n                  <span className=\"hljs-built_in\">print</span>(\"Hello world!\");\n                </code>\n              </pre>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Code block (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={\"[code]\\nalert\" + '(\"Hello world!\");' + \"\\n[/code]\"}\n            result={\n              <pre>\n                <code className=\"hljs\">alert(\"Hello world!\");</code>\n              </pre>\n            }\n          />\n\n          <hr />\n\n          <h4>\n            {pgettext(\n              \"markup help\",\n              \"Code block with syntax highlighting (BBCode)\"\n            )}\n          </h4>\n          <ExampleFormatting\n            markup={\n              '[code=\"python\"]\\nprint' + '(\"Hello world!\");' + \"\\n[/code]\"\n            }\n            result={\n              <pre>\n                <code className=\"hljs language-python\">\n                  <span className=\"hljs-built_in\">print</span>(\"Hello world!\");\n                </code>\n              </pre>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Horizontal rule\")}</h4>\n          <ExampleFormatting\n            markup={\"Lorem ipsum\\n- - -\\nDolor met\"}\n            result={\n              <div>\n                <p>Lorem ipsum</p>\n                <hr />\n                <p>Dolor met</p>\n              </div>\n            }\n          />\n\n          <hr />\n\n          <h4>{pgettext(\"markup help\", \"Horizontal rule (BBCode)\")}</h4>\n          <ExampleFormatting\n            markup={\"Lorem ipsum\\n[hr]\\nDolor met\"}\n            result={\n              <div>\n                <p>Lorem ipsum</p>\n                <hr />\n                <p>Dolor met</p>\n              </div>\n            }\n          />\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"modal\", \"Close\")}\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nfunction ExampleFormatting({ markup, result }) {\n  return (\n    <div className=\"formatting-help-item\">\n      <div className=\"formatting-help-item-markup\">\n        <pre>\n          <code>{markup}</code>\n        </pre>\n      </div>\n      <div className=\"formatting-help-item-preview\">\n        <article className=\"misago-markup\">{result}</article>\n      </div>\n    </div>\n  )\n}\n\nclass ExampleFormattingSpoiler extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      reveal: false,\n    }\n  }\n\n  render() {\n    return (\n      <aside\n        className={\n          this.state.reveal ? \"spoiler-block revealed\" : \"spoiler-block\"\n        }\n      >\n        <blockquote className=\"spoiler-body\">\n          <p>{this.props.children}</p>\n        </blockquote>\n        {!this.state.reveal && (\n          <div className=\"spoiler-overlay\">\n            <button\n              className=\"spoiler-reveal\"\n              type=\"button\"\n              onClick={() => {\n                this.setState({ reveal: true })\n              }}\n            >\n              {gettext(\"Reveal spoiler\")}\n            </button>\n          </div>\n        )}\n      </aside>\n    )\n  }\n}\n","const URL_PATTERN = new RegExp(\"^(((ftps?)|(https?))://)\", \"i\")\n\nexport default function isUrl(str) {\n  return URL_PATTERN.test(str.trim())\n}\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupImageModal extends React.Component {\n  constructor(props) {\n    super(props)\n\n    const text = props.selection.text.trim()\n    const textUrl = isUrl(text)\n\n    this.state = {\n      error: null,\n      text: textUrl ? \"\" : text,\n      url: textUrl ? text : \"\",\n    }\n  }\n\n  handleSubmit = (ev) => {\n    ev.preventDefault()\n\n    const { selection, update } = this.props\n    const text = this.state.text.trim()\n    const url = this.state.url.trim()\n\n    if (url.length === 0) {\n      this.setState({ error: gettext(\"This field is required.\") })\n      return false\n    }\n\n    if (text.length > 0) {\n      replaceSelection(selection, update, \"![\" + text + \"](\" + url + \")\")\n    } else {\n      replaceSelection(selection, update, \"!(\" + url + \")\")\n    }\n\n    modal.hide()\n\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"markup editor\", \"Image\")}\n            </h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"markup_image_text\"\n                label={pgettext(\"markup editor\", \"Image description\")}\n                helpText={pgettext(\n                  \"markup editor\",\n                  \"Optional but recommended . Will be displayed instead of image when it fails to load.\"\n                )}\n              >\n                <input\n                  id=\"markup_image_text\"\n                  className=\"form-control\"\n                  type=\"text\"\n                  value={this.state.text}\n                  onChange={(event) =>\n                    this.setState({ text: event.target.value })\n                  }\n                />\n              </FormGroup>\n              <FormGroup\n                for=\"markup_image_url\"\n                label={pgettext(\"markup editor\", \"Image URL\")}\n                validation={!!this.state.error ? [this.state.error] : undefined}\n              >\n                <input\n                  id=\"markup_image_url\"\n                  className=\"form-control\"\n                  type=\"text\"\n                  value={this.state.url}\n                  placeholder=\"http://domain.com/image.png\"\n                  onChange={(event) =>\n                    this.setState({ url: event.target.value })\n                  }\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                type=\"button\"\n              >\n                {pgettext(\"markup editor\", \"Cancel\")}\n              </button>\n              <button className=\"btn btn-primary\">\n                {pgettext(\"markup editor\", \"Insert image\")}\n              </button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default MarkupImageModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport isUrl from \"./isUrl\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupLinkModal extends React.Component {\n  constructor(props) {\n    super(props)\n\n    const text = props.selection.text.trim()\n    const textUrl = isUrl(text)\n\n    this.state = {\n      error: null,\n      text: textUrl ? \"\" : text,\n      url: textUrl ? text : \"\",\n    }\n  }\n\n  handleSubmit = (ev) => {\n    ev.preventDefault()\n\n    const { selection, update } = this.props\n    const text = this.state.text.trim()\n    const url = this.state.url.trim()\n\n    if (url.length === 0) {\n      this.setState({ error: gettext(\"This field is required.\") })\n      return false\n    }\n\n    if (text.length > 0) {\n      replaceSelection(selection, update, \"[\" + text + \"](\" + url + \")\")\n    } else {\n      replaceSelection(selection, update, \"<\" + url + \">\")\n    }\n\n    modal.hide()\n\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">{pgettext(\"markup editor\", \"Link\")}</h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"markup_link_url\"\n                label={pgettext(\"markup editor\", \"Link text\")}\n                helpText={pgettext(\n                  \"markup editor\",\n                  \"Optional. Will be displayed instead of link's address.\"\n                )}\n              >\n                <input\n                  id=\"markup_link_text\"\n                  className=\"form-control\"\n                  type=\"text\"\n                  value={this.state.text}\n                  onChange={(event) =>\n                    this.setState({ text: event.target.value })\n                  }\n                />\n              </FormGroup>\n              <FormGroup\n                for=\"markup_link_url\"\n                label={pgettext(\"markup editor\", \"Link address\")}\n                validation={!!this.state.error ? [this.state.error] : undefined}\n              >\n                <input\n                  id=\"markup_link_url\"\n                  className=\"form-control\"\n                  type=\"text\"\n                  value={this.state.url}\n                  onChange={(event) =>\n                    this.setState({ url: event.target.value })\n                  }\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                type=\"button\"\n              >\n                {pgettext(\"markup editor\", \"Cancel\")}\n              </button>\n              <button className=\"btn btn-primary\">\n                {pgettext(\"markup editor\", \"Insert link\")}\n              </button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default MarkupLinkModal\n","import React from \"react\"\nimport modal from \"../../services/modal\"\nimport FormGroup from \"../form-group\"\nimport { replaceSelection } from \"./operations\"\n\nclass MarkupQuoteModal extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      error: null,\n      author: \"\",\n      text: props.selection.text,\n    }\n  }\n\n  handleSubmit = (ev) => {\n    ev.preventDefault()\n\n    const { selection, update } = this.props\n    const author = this.state.author.trim()\n    const text = this.state.text.trim()\n\n    if (text.length === 0) {\n      this.setState({ error: gettext(\"This field is required.\") })\n      return false\n    }\n\n    const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n    if (author) {\n      replaceSelection(\n        selection,\n        update,\n        prefix + '[quote=\"' + author + '\"]\\n' + text + \"\\n[/quote]\\n\\n\"\n      )\n    } else {\n      replaceSelection(\n        selection,\n        update,\n        prefix + \"[quote]\\n\" + text + \"\\n[/quote]\\n\\n\"\n      )\n    }\n\n    modal.hide()\n\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-lg\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"markup editor\", \"Quote\")}\n            </h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"markup_quote_author\"\n                label={pgettext(\"markup editor\", \"Quote's author or source\")}\n                helpText={pgettext(\n                  \"markup editor\",\n                  'Optional. If it\\'s username, put \"@\" before it (\"@JohnDoe\").'\n                )}\n              >\n                <input\n                  id=\"markup_quote_author\"\n                  className=\"form-control\"\n                  type=\"text\"\n                  value={this.state.author}\n                  onChange={(event) =>\n                    this.setState({ author: event.target.value })\n                  }\n                />\n              </FormGroup>\n              <FormGroup\n                for=\"markup_quote_text\"\n                label={pgettext(\"markup editor\", \"Quoted text\")}\n                validation={!!this.state.error ? [this.state.error] : undefined}\n              >\n                <textarea\n                  id=\"markup_quote_text\"\n                  className=\"form-control\"\n                  rows=\"8\"\n                  value={this.state.text}\n                  onChange={(event) =>\n                    this.setState({ text: event.target.value })\n                  }\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                type=\"button\"\n              >\n                {pgettext(\"markup editor\", \"Cancel\")}\n              </button>\n              <button className=\"btn btn-primary\">\n                {pgettext(\"markup editor\", \"Insert quote\")}\n              </button>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default MarkupQuoteModal\n","import React from \"react\"\n\nconst MarkupEditorButton = ({ disabled, icon, title, onClick }) => (\n  <button\n    className=\"btn btn-markup-editor\"\n    title={title}\n    type=\"button\"\n    disabled={disabled}\n    onClick={onClick}\n  >\n    <span className=\"material-icon\">{icon}</span>\n  </button>\n)\n\nexport default MarkupEditorButton\n","import moment from \"moment\"\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport formatFilesize from \"../../utils/file-size\"\nimport getRandomString from \"../../utils/getRandomString\"\n\nconst ID_LEN = 32\n\nconst uploadFile = (file, setState) => {\n  const maxSize = misago.get(\"user\").acl.max_attachment_size * 1024\n\n  if (file.size > maxSize) {\n    snackbar.error(\n      interpolate(\n        pgettext(\n          \"markup editor\",\n          \"File %(filename)s is bigger than %(limit)s.\"\n        ),\n        { filename: file.name, limit: formatFilesize(maxSize) },\n        true\n      )\n    )\n\n    return\n  }\n\n  let upload = {\n    id: null,\n    key: getRandomString(ID_LEN),\n    error: null,\n    uploaded_on: null,\n    progress: 0,\n    filename: file.name,\n    filetype: null,\n    is_image: false,\n    size: file.size,\n    url: null,\n    uploader_name: null,\n  }\n\n  setState(({ attachments }) => {\n    return { attachments: [upload].concat(attachments) }\n  })\n\n  const refreshState = () => {\n    setState(({ attachments }) => {\n      return { attachments: attachments.concat() }\n    })\n  }\n\n  const data = new FormData()\n  data.append(\"upload\", file)\n\n  ajax\n    .upload(misago.get(\"ATTACHMENTS_API\"), data, (progress) => {\n      upload.progress = progress\n      refreshState()\n    })\n    .then(\n      (data) => {\n        Object.assign(upload, data, { uploaded_on: moment(data.uploaded_on) })\n        refreshState()\n      },\n      (rejection) => {\n        if (rejection.status === 400 || rejection.status === 413) {\n          upload.error = rejection.detail\n          snackbar.error(rejection.detail)\n          refreshState()\n        } else {\n          snackbar.apiError(rejection)\n        }\n      }\n    )\n}\n\nexport default uploadFile\n","import React from \"react\"\nimport misago from \"../../\"\nimport modal from \"../../services/modal\"\nimport MarkupCodeModal from \"./MarkupCodeModal\"\nimport MarkupFormattingHelpModal from \"./MarkupFormattingHelpModal\"\nimport MarkupImageModal from \"./MarkupImageModal\"\nimport MarkupLinkModal from \"./MarkupLinkModal\"\nimport MarkupQuoteModal from \"./MarkupQuoteModal\"\nimport MarkupEditorButton from \"./MarkupEditorButton\"\nimport { getSelection, replaceSelection, wrapSelection } from \"./operations\"\nimport uploadFile from \"./uploadFile\"\n\nconst MarkupEditorToolbar = ({\n  disabled,\n  element,\n  update,\n  updateAttachments,\n}) => {\n  const actions = [\n    {\n      name: pgettext(\"markup editor\", \"Strong\"),\n      icon: \"format_bold\",\n      onClick: () => {\n        wrapSelection(\n          getSelection(element),\n          update,\n          \"**\",\n          \"**\",\n          pgettext(\"example markup\", \"Strong text\")\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Emphasis\"),\n      icon: \"format_italic\",\n      onClick: () => {\n        wrapSelection(\n          getSelection(element),\n          update,\n          \"*\",\n          \"*\",\n          pgettext(\"example markup\", \"Text with emphasis\")\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Strikethrough\"),\n      icon: \"format_strikethrough\",\n      onClick: () => {\n        wrapSelection(\n          getSelection(element),\n          update,\n          \"~~\",\n          \"~~\",\n          pgettext(\"example markup\", \"Text with strikethrough\")\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Horizontal ruler\"),\n      icon: \"remove\",\n      onClick: () => {\n        replaceSelection(getSelection(element), update, \"\\n\\n- - -\\n\\n\")\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Link\"),\n      icon: \"insert_link\",\n      onClick: () => {\n        const selection = getSelection(element)\n        modal.show(\n          <MarkupLinkModal\n            selection={selection}\n            element={element}\n            update={update}\n          />\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Image\"),\n      icon: \"insert_photo\",\n      onClick: () => {\n        const selection = getSelection(element)\n        modal.show(\n          <MarkupImageModal\n            selection={selection}\n            element={element}\n            update={update}\n          />\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Quote\"),\n      icon: \"format_quote\",\n      onClick: () => {\n        const selection = getSelection(element)\n        modal.show(\n          <MarkupQuoteModal\n            selection={selection}\n            element={element}\n            update={update}\n          />\n        )\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Spoiler\"),\n      icon: \"visibility_off\",\n      onClick: () => {\n        insertSpoiler(element, update)\n      },\n    },\n    {\n      name: pgettext(\"markup editor\", \"Code\"),\n      icon: \"code\",\n      onClick: () => {\n        const selection = getSelection(element)\n        modal.show(\n          <MarkupCodeModal\n            selection={selection}\n            element={element}\n            update={update}\n          />\n        )\n      },\n    },\n  ]\n\n  if (misago.get(\"user\").acl.max_attachment_size) {\n    actions.push({\n      name: pgettext(\"markup editor\", \"Upload file\"),\n      icon: \"file_upload\",\n      onClick: () => uploadFiles(updateAttachments),\n    })\n  }\n\n  return (\n    <div className=\"markup-editor-toolbar\">\n      <div className=\"markup-editor-toolbar-left\">\n        {actions.map(({ name, icon, onClick }) => (\n          <MarkupEditorButton\n            key={icon}\n            title={name}\n            icon={icon}\n            disabled={disabled || !element}\n            onClick={onClick}\n          />\n        ))}\n      </div>\n      <div className=\"markup-editor-toolbar-right\">\n        <div className=\"markup-editor-controls-dropdown\">\n          <button\n            type=\"button\"\n            className=\"btn btn-markup-editor dropdown-toggle\"\n            data-toggle=\"dropdown\"\n            aria-haspopup=\"true\"\n            aria-expanded=\"false\"\n            disabled={disabled || !element}\n          >\n            <span className=\"material-icon\">more_vert</span>\n          </button>\n          <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n            {actions.map(({ name, icon, onClick }) => (\n              <li key={icon}>\n                <button\n                  type=\"button\"\n                  className=\"btn-link\"\n                  disabled={disabled || !element}\n                  onClick={onClick}\n                >\n                  <span className=\"material-icon\">{icon}</span>\n                  {name}\n                </button>\n              </li>\n            ))}\n          </ul>\n        </div>\n        <MarkupEditorButton\n          title={pgettext(\"markup editor\", \"Open formatting help\")}\n          icon=\"help_outline\"\n          onClick={() => {\n            modal.show(<MarkupFormattingHelpModal />)\n          }}\n        />\n      </div>\n    </div>\n  )\n}\n\nconst insertSpoiler = (element, update) => {\n  const selection = getSelection(element)\n  const prefix = selection.prefix.trim().length ? \"\\n\\n\" : \"\"\n\n  wrapSelection(\n    selection,\n    update,\n    prefix + \"[spoiler]\\n\",\n    \"\\n[/spoiler]\\n\\n\",\n    pgettext(\"markup editor\", \"Spoiler text\")\n  )\n}\n\nconst uploadFiles = (setState) => {\n  const input = document.createElement(\"input\")\n  input.type = \"file\"\n  input.multiple = \"multiple\"\n\n  input.addEventListener(\"change\", function () {\n    for (let i = 0; i < input.files.length; i++) {\n      uploadFile(input.files[i], setState)\n    }\n  })\n\n  input.click()\n}\n\nexport default MarkupEditorToolbar\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nimport misago from \"../../\"\nimport ajax from \"../../services/ajax\"\nimport snackbar from \"../../services/snackbar\"\nimport MisagoMarkup from \"../misago-markup\"\nimport MarkupEditorAttachments from \"./MarkupEditorAttachments\"\nimport MarkupEditorFooter from \"./MarkupEditorFooter\"\nimport MarkupEditorToolbar from \"./MarkupEditorToolbar\"\nimport uploadFile from \"./uploadFile\"\n\nclass MarkupEditor extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      element: null,\n      focused: false,\n      loading: false,\n      preview: false,\n      parsed: null,\n    }\n  }\n\n  showPreview = () => {\n    if (this.state.loading) return\n\n    this.setState({ loading: true, preview: true, element: null })\n\n    ajax.post(misago.get(\"PARSE_MARKUP_API\"), { post: this.props.value }).then(\n      (data) => {\n        this.setState({ loading: false, parsed: data.parsed })\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail)\n        } else {\n          snackbar.apiError(rejection)\n        }\n\n        this.setState({ loading: false, preview: false })\n      }\n    )\n  }\n\n  closePreview = () => {\n    this.setState({ loading: false, preview: false })\n  }\n\n  onDrop = (event) => {\n    event.preventDefault()\n    event.stopPropagation()\n\n    if (!event.dataTransfer.files) return\n\n    const { onAttachmentsChange: setState } = this.props\n\n    if (misago.get(\"user\").acl.max_attachment_size) {\n      for (let i = 0; i < event.dataTransfer.files.length; i++) {\n        const file = event.dataTransfer.files[i]\n        uploadFile(file, setState)\n      }\n    }\n  }\n\n  onPaste = (event) => {\n    const { onAttachmentsChange: setState } = this.props\n\n    const files = []\n    for (let i = 0; i < event.clipboardData.items.length; i++) {\n      const item = event.clipboardData.items[i]\n      if (item.kind === \"file\") {\n        files.push(item.getAsFile())\n      }\n    }\n\n    if (files.length) {\n      event.preventDefault()\n      event.stopPropagation()\n\n      if (misago.get(\"user\").acl.max_attachment_size) {\n        for (let i = 0; i < files.length; i++) {\n          uploadFile(files[i], setState)\n        }\n      }\n    }\n  }\n\n  render = () => (\n    <div\n      className={classnames(\"markup-editor\", {\n        \"markup-editor-focused\": this.state.focused && !this.state.preview,\n      })}\n    >\n      <MarkupEditorToolbar\n        disabled={this.props.disabled || this.state.preview}\n        element={this.state.element}\n        update={(value) => this.props.onChange({ target: { value } })}\n        updateAttachments={this.props.onAttachmentsChange}\n      />\n      {this.state.preview ? (\n        <div className=\"markup-editor-preview\">\n          {this.state.loading ? (\n            <div className=\"markup-editor-preview-loading\">\n              <div className=\"ui-preview\">\n                <span className=\"ui-preview-text\" style={{ width: \"240px\" }} />\n              </div>\n            </div>\n          ) : (\n            <MisagoMarkup\n              className=\"markup-editor-preview-contents\"\n              markup={this.state.parsed}\n            />\n          )}\n        </div>\n      ) : (\n        <textarea\n          className=\"markup-editor-textarea form-control\"\n          placeholder={this.props.placeholder}\n          value={this.props.value}\n          disabled={this.props.disabled || this.state.loading}\n          rows={6}\n          ref={(element) => {\n            if (element && this.state.element !== element) {\n              this.setState({ element })\n              setMentions(this.props, element)\n            }\n          }}\n          onChange={this.props.onChange}\n          onDrop={this.onDrop}\n          onFocus={() => this.setState({ focused: true })}\n          onPaste={this.onPaste}\n          onBlur={() => this.setState({ focused: false })}\n        />\n      )}\n      {this.props.attachments.length > 0 && (\n        <MarkupEditorAttachments\n          attachments={this.props.attachments}\n          disabled={this.props.disabled || this.state.preview}\n          element={this.state.element}\n          setState={this.props.onAttachmentsChange}\n          update={(value) => this.props.onChange({ target: { value } })}\n        />\n      )}\n      <MarkupEditorFooter\n        preview={this.state.preview}\n        canProtect={this.props.canProtect}\n        isProtected={this.props.isProtected}\n        disabled={this.props.disabled}\n        empty={\n          this.props.value.trim().length <\n            misago.get(\"SETTINGS\").post_length_min || this.state.loading\n        }\n        enableProtection={this.props.enableProtection}\n        disableProtection={this.props.disableProtection}\n        showPreview={this.showPreview}\n        closePreview={this.closePreview}\n        submitText={this.props.submitText}\n      />\n    </div>\n  )\n}\n\nfunction setMentions(props, element) {\n  $(element).atwho({\n    at: \"@\",\n    displayTpl: '<li><img src=\"${avatar}\" alt=\"\">${username}</li>',\n    insertTpl: \"@${username}\",\n    searchKey: \"username\",\n    callbacks: {\n      remoteFilter: function (query, callback) {\n        $.getJSON(misago.get(\"MENTION_API\"), { q: query }, callback)\n      },\n    },\n  })\n\n  $(element).on(\"inserted.atwho\", (event, _storage, source, controller) => {\n    const { query } = controller\n    const username = source.target.innerText.trim()\n    const prefix = event.target.value.substr(0, query.headPos)\n    const suffix = event.target.value.substr(query.endPos)\n\n    event.target.value = prefix + username + suffix\n    props.onChange(event)\n\n    const caret = query.headPos + username.length\n    event.target.setSelectionRange(caret, caret)\n    event.target.focus()\n  })\n}\n\nexport default MarkupEditor\n","import MarkupEditor from \"./MarkupEditor\"\n\nexport default MarkupEditor\n","import React from \"react\"\nimport classnames from \"classnames\"\n\nconst CLASS_ACTIVE = \"posting-active\"\nconst CLASS_DEFAULT = \"posting-default\"\nconst CLASS_MINIMIZED = \"posting-minimized\"\nconst CLASS_FULLSCREEN = \"posting-fullscreen\"\n\nclass PostingDialog extends React.Component {\n  componentDidMount() {\n    document.body.classList.add(CLASS_ACTIVE, CLASS_DEFAULT)\n  }\n\n  componentWillUnmount() {\n    document.body.classList.remove(\n      CLASS_ACTIVE,\n      CLASS_DEFAULT,\n      CLASS_MINIMIZED,\n      CLASS_FULLSCREEN\n    )\n  }\n\n  componentWillReceiveProps({ fullscreen, minimized }) {\n    if (minimized) {\n      document.body.classList.remove(CLASS_DEFAULT, CLASS_FULLSCREEN)\n      document.body.classList.add(CLASS_MINIMIZED)\n    } else {\n      if (fullscreen) {\n        document.body.classList.remove(CLASS_DEFAULT, CLASS_MINIMIZED)\n        document.body.classList.add(CLASS_FULLSCREEN)\n      } else {\n        document.body.classList.remove(CLASS_FULLSCREEN, CLASS_MINIMIZED)\n        document.body.classList.add(CLASS_DEFAULT)\n      }\n    }\n  }\n\n  render() {\n    const { children, fullscreen, minimized } = this.props\n\n    return (\n      <div\n        className={classnames(\"posting-dialog\", {\n          \"posting-dialog-minimized\": minimized,\n          \"posting-dialog-fullscreen\": fullscreen && !minimized,\n        })}\n      >\n        <div className=\"posting-dialog-container\">{children}</div>\n      </div>\n    )\n  }\n}\n\nexport default PostingDialog\n","import React from \"react\"\n\nconst PostingDialogBody = ({ children }) => (\n  <div className=\"posting-dialog-body\">{children}</div>\n)\n\nexport default PostingDialogBody\n","import React from \"react\"\n\nconst PostingDialogError = ({ close, message }) => (\n  <div className=\"posting-dialog-error\">\n    <div className=\"posting-dialog-error-icon\">\n      <span className=\"material-icon\">error_outlined</span>\n    </div>\n    <div className=\"posting-dialog-error-detail\">\n      <p>{message}</p>\n      <button type=\"button\" className=\"btn btn-default\" onClick={close}>\n        {pgettext(\"modal\", \"Close\")}\n      </button>\n    </div>\n  </div>\n)\n\nexport default PostingDialogError\n","import React from \"react\"\n\nconst PostingDialogHeader = ({\n  children,\n  close,\n  fullscreen,\n  minimize,\n  minimized,\n  fullscreenEnter,\n  fullscreenExit,\n  open,\n}) => (\n  <div className=\"posting-dialog-header\">\n    <div className=\"posting-dialog-caption\">{children}</div>\n    {minimized ? (\n      <button\n        className=\"btn btn-posting-dialog\"\n        title={pgettext(\"dialog\", \"Open\")}\n        type=\"button\"\n        onClick={open}\n      >\n        <span className=\"material-icon\">expand_less</span>\n      </button>\n    ) : (\n      <button\n        className=\"btn btn-posting-dialog\"\n        title={pgettext(\"dialog\", \"Minimize\")}\n        type=\"button\"\n        onClick={minimize}\n      >\n        <span className=\"material-icon\">expand_more</span>\n      </button>\n    )}\n    {fullscreen ? (\n      <button\n        className=\"btn btn-posting-dialog hidden-xs\"\n        title={pgettext(\"dialog\", \"Exit the fullscreen mode\")}\n        type=\"button\"\n        onClick={fullscreenExit}\n      >\n        <span className=\"material-icon\">fullscreen_exit</span>\n      </button>\n    ) : (\n      <button\n        className=\"btn btn-posting-dialog hidden-xs\"\n        title={pgettext(\"dialog\", \"Enter the fullscreen mode\")}\n        type=\"button\"\n        onClick={fullscreenEnter}\n      >\n        <span className=\"material-icon\">fullscreen</span>\n      </button>\n    )}\n    <button\n      className=\"btn btn-posting-dialog\"\n      title={pgettext(\"dialog\", \"Cancel\")}\n      type=\"button\"\n      onClick={close}\n    >\n      <span className=\"material-icon\">close</span>\n    </button>\n  </div>\n)\n\nexport default PostingDialogHeader\n","import React from \"react\"\n\nexport default function PostingThreadOptions({\n  isClosed,\n  isHidden,\n  isPinned,\n  disabled,\n  options,\n  close,\n  open,\n  hide,\n  unhide,\n  pinGlobally,\n  pinLocally,\n  unpin,\n}) {\n  const icons = getIcons(isClosed, isHidden, isPinned)\n\n  return (\n    <div className=\"dropdown\">\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"post thread\", \"Options\")}\n        aria-expanded=\"true\"\n        aria-haspopup=\"true\"\n        data-toggle=\"dropdown\"\n        type=\"button\"\n        disabled={disabled}\n      >\n        {icons.length > 0 ? (\n          <span className=\"btn-icons-family\">\n            {icons.map((icon) => (\n              <span key={icon} className=\"material-icon\">\n                {icon}\n              </span>\n            ))}\n          </span>\n        ) : (\n          <span className=\"material-icon\">more_horiz</span>\n        )}\n      </button>\n      <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n        {options.pin === 2 && isPinned !== 2 && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={pinGlobally}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">bookmark</span>\n              {pgettext(\"post thread\", \"Pinned globally\")}\n            </button>\n          </li>\n        )}\n        {options.pin >= isPinned && isPinned !== 1 && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={pinLocally}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">bookmark_outline</span>\n              {pgettext(\"post thread\", \"Pinned in category\")}\n            </button>\n          </li>\n        )}\n        {options.pin >= isPinned && isPinned !== 0 && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={unpin}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">radio_button_unchecked</span>\n              {pgettext(\"post thread\", \"Not pinned\")}\n            </button>\n          </li>\n        )}\n        {options.close && !!isClosed && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={open}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">lock_outline</span>\n              {pgettext(\"post thread\", \"Open\")}\n            </button>\n          </li>\n        )}\n        {options.close && !isClosed && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={close}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">lock</span>\n              {pgettext(\"post thread\", \"Closed\")}\n            </button>\n          </li>\n        )}\n        {options.hide && !!isHidden && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={unhide}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">visibility</span>\n              {pgettext(\"post thread\", \"Visible\")}\n            </button>\n          </li>\n        )}\n        {options.hide && !isHidden && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={hide}\n              type=\"button\"\n              disabled={disabled}\n            >\n              <span className=\"material-icon\">visibility_off</span>\n              {pgettext(\"post thread\", \"Hidden\")}\n            </button>\n          </li>\n        )}\n      </ul>\n    </div>\n  )\n}\n\nfunction getIcons(closed, hidden, pinned) {\n  const icons = []\n  if (pinned === 2) icons.push(\"bookmark\")\n  if (pinned === 1) icons.push(\"bookmark_outline\")\n  if (closed) icons.push(\"lock\")\n  if (hidden) icons.push(\"visibility_off\")\n  return icons\n}\n","import React from \"react\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport PostingThreadOptions from \"./PostingThreadOptions\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n      isLoading: false,\n\n      error: null,\n\n      minimized: false,\n      fullscreen: false,\n\n      options: null,\n\n      title: \"\",\n      category: props.category || null,\n      categories: [],\n      post: \"\",\n      attachments: [],\n      close: false,\n      hide: false,\n      pin: 0,\n\n      validators: {\n        title: getTitleValidators(),\n        post: getPostValidators(),\n      },\n      errors: {},\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n  }\n\n  loadSuccess = (data) => {\n    let category = null\n    let options = null\n\n    // hydrate categories, extract posting options\n    const categories = data.map((item) => {\n      // pick first category that allows posting and if it may, override it with initial one\n      if (\n        item.post !== false &&\n        (!category || item.id == this.state.category)\n      ) {\n        category = item.id\n        options = item.post\n      }\n\n      return Object.assign(item, {\n        disabled: item.post === false,\n        label: item.name,\n        value: item.id,\n      })\n    })\n\n    this.setState({\n      isReady: true,\n      options,\n\n      categories,\n      category,\n    })\n  }\n\n  loadError = (rejection) => {\n    this.setState({\n      error: rejection.detail,\n    })\n  }\n\n  onCancel = () => {\n    const formEmpty = !!(\n      this.state.post.length === 0 &&\n      this.state.title.length === 0 &&\n      this.state.attachments.length === 0\n    )\n\n    if (formEmpty) {\n      this.minimize()\n      return posting.close()\n    }\n\n    const cancel = window.confirm(\n      pgettext(\"post thread\", \"Are you sure you want to discard thread?\")\n    )\n    if (cancel) {\n      this.minimize()\n      posting.close()\n    }\n  }\n\n  onTitleChange = (event) => {\n    this.changeValue(\"title\", event.target.value)\n  }\n\n  onCategoryChange = (event) => {\n    const category = this.state.categories.find((item) => {\n      return event.target.value == item.value\n    })\n\n    // if selected pin is greater than allowed, reduce it\n    let pin = this.state.pin\n    if (category.post.pin && category.post.pin < pin) {\n      pin = category.post.pin\n    }\n\n    this.setState({\n      category: category.id,\n      categoryOptions: category.post,\n\n      pin,\n    })\n  }\n\n  onPostChange = (event) => {\n    this.changeValue(\"post\", event.target.value)\n  }\n\n  onAttachmentsChange = (attachments) => {\n    this.setState(attachments)\n  }\n\n  onClose = () => {\n    this.changeValue(\"close\", true)\n  }\n\n  onOpen = () => {\n    this.changeValue(\"close\", false)\n  }\n\n  onPinGlobally = () => {\n    this.changeValue(\"pin\", 2)\n  }\n\n  onPinLocally = () => {\n    this.changeValue(\"pin\", 1)\n  }\n\n  onUnpin = () => {\n    this.changeValue(\"pin\", 0)\n  }\n\n  onHide = () => {\n    this.changeValue(\"hide\", true)\n  }\n\n  onUnhide = () => {\n    this.changeValue(\"hide\", false)\n  }\n\n  close = () => {\n    this.minimize()\n    posting.close()\n  }\n\n  minimize = () => {\n    this.setState({ fullscreen: false, minimized: true })\n  }\n\n  open = () => {\n    this.setState({ minimized: false })\n    if (this.state.fullscreen) {\n    }\n  }\n\n  fullscreenEnter = () => {\n    this.setState({ fullscreen: true, minimized: false })\n  }\n\n  fullscreenExit = () => {\n    this.setState({ fullscreen: false, minimized: false })\n  }\n\n  clean() {\n    if (!this.state.title.trim().length) {\n      snackbar.error(\n        pgettext(\"posting form\", \"You have to enter thread title.\")\n      )\n      return false\n    }\n\n    if (!this.state.post.trim().length) {\n      snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n      return false\n    }\n\n    const errors = this.validate()\n\n    if (errors.title) {\n      snackbar.error(errors.title[0])\n      return false\n    }\n\n    if (errors.post) {\n      snackbar.error(errors.post[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.submit, {\n      title: this.state.title,\n      category: this.state.category,\n      post: this.state.post,\n      attachments: attachments.clean(this.state.attachments),\n      close: this.state.close,\n      hide: this.state.hide,\n      pin: this.state.pin,\n    })\n  }\n\n  handleSuccess(success) {\n    this.setState({ isLoading: true })\n    this.close()\n\n    snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n    window.location = success.url\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      const errors = [].concat(\n        rejection.non_field_errors || [],\n        rejection.category || [],\n        rejection.title || [],\n        rejection.post || [],\n        rejection.attachments || []\n      )\n\n      snackbar.error(errors[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    const dialogProps = {\n      minimized: this.state.minimized,\n      minimize: this.minimize,\n      open: this.open,\n\n      fullscreen: this.state.fullscreen,\n      fullscreenEnter: this.fullscreenEnter,\n      fullscreenExit: this.fullscreenExit,\n\n      close: this.onCancel,\n    }\n\n    if (this.state.error) {\n      return (\n        <PostingDialogStart {...dialogProps}>\n          <PostingDialogError message={this.state.error} close={this.close} />\n        </PostingDialogStart>\n      )\n    }\n\n    if (!this.state.isReady) {\n      return (\n        <PostingDialogStart {...dialogProps}>\n          <div className=\"posting-loading ui-preview\">\n            <Toolbar className=\"posting-dialog-toolbar\">\n              <ToolbarSection className=\"posting-dialog-thread-title\" auto>\n                <ToolbarItem auto>\n                  <input className=\"form-control\" disabled={true} type=\"text\" />\n                </ToolbarItem>\n              </ToolbarSection>\n              <ToolbarSection className=\"posting-dialog-category-select\" auto>\n                <ToolbarItem>\n                  <input className=\"form-control\" disabled={true} type=\"text\" />\n                </ToolbarItem>\n              </ToolbarSection>\n            </Toolbar>\n            <MarkupEditor\n              attachments={[]}\n              value={\"\"}\n              submitText={pgettext(\"post thread submit\", \"Start thread\")}\n              disabled={true}\n              onAttachmentsChange={() => {}}\n              onChange={() => {}}\n            />\n          </div>\n        </PostingDialogStart>\n      )\n    }\n\n    const showOptions = !!(\n      this.state.options.close ||\n      this.state.options.hide ||\n      this.state.options.pin\n    )\n\n    return (\n      <PostingDialogStart {...dialogProps}>\n        <form className=\"posting-dialog-form\" onSubmit={this.handleSubmit}>\n          <Toolbar className=\"posting-dialog-toolbar\">\n            <ToolbarSection className=\"posting-dialog-thread-title\" auto>\n              <ToolbarItem auto>\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  onChange={this.onTitleChange}\n                  placeholder={pgettext(\"post thread\", \"Thread title\")}\n                  type=\"text\"\n                  value={this.state.title}\n                />\n              </ToolbarItem>\n            </ToolbarSection>\n            <ToolbarSection className=\"posting-dialog-category-select\" auto>\n              <ToolbarItem>\n                <CategorySelect\n                  choices={this.state.categories}\n                  disabled={this.state.isLoading}\n                  onChange={this.onCategoryChange}\n                  value={this.state.category}\n                />\n              </ToolbarItem>\n              {showOptions && (\n                <ToolbarItem shrink>\n                  <PostingThreadOptions\n                    isClosed={this.state.close}\n                    isHidden={this.state.hide}\n                    isPinned={this.state.pin}\n                    disabled={this.state.isLoading}\n                    options={this.state.options}\n                    close={this.onClose}\n                    open={this.onOpen}\n                    hide={this.onHide}\n                    unhide={this.onUnhide}\n                    pinGlobally={this.onPinGlobally}\n                    pinLocally={this.onPinLocally}\n                    unpin={this.onUnpin}\n                  />\n                </ToolbarItem>\n              )}\n            </ToolbarSection>\n          </Toolbar>\n          <MarkupEditor\n            attachments={this.state.attachments}\n            value={this.state.post}\n            submitText={pgettext(\"post thread submit\", \"Start thread\")}\n            disabled={this.state.isLoading}\n            onAttachmentsChange={this.onAttachmentsChange}\n            onChange={this.onPostChange}\n          />\n        </form>\n      </PostingDialogStart>\n    )\n  }\n}\n\nconst PostingDialogStart = ({\n  children,\n  close,\n  minimized,\n  minimize,\n  open,\n  fullscreen,\n  fullscreenEnter,\n  fullscreenExit,\n}) => (\n  <PostingDialog fullscreen={fullscreen} minimized={minimized}>\n    <PostingDialogHeader\n      fullscreen={fullscreen}\n      fullscreenEnter={fullscreenEnter}\n      fullscreenExit={fullscreenExit}\n      minimized={minimized}\n      minimize={minimize}\n      open={open}\n      close={close}\n    >\n      {pgettext(\"post thread\", \"Start new thread\")}\n    </PostingDialogHeader>\n    <PostingDialogBody>{children}</PostingDialogBody>\n  </PostingDialog>\n)\n","export default function (usernames) {\n  const normalisedNames = usernames\n    .split(\",\")\n    .map((i) => i.trim().toLowerCase())\n  const removedBlanks = normalisedNames.filter((i) => i.length > 0)\n  const removedDuplicates = removedBlanks.filter((name, pos) => {\n    return removedBlanks.indexOf(name) == pos\n  })\n\n  return removedDuplicates\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport cleanUsernames from \"./utils/usernames\"\nimport { getPostValidators, getTitleValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    const to = (props.to || []).map((user) => user.username).join(\", \")\n\n    this.state = {\n      isLoading: false,\n\n      error: null,\n\n      minimized: false,\n      fullscreen: false,\n\n      to: to,\n      title: \"\",\n      post: \"\",\n      attachments: [],\n\n      validators: {\n        title: getTitleValidators(),\n        post: getPostValidators(),\n      },\n      errors: {},\n    }\n  }\n\n  onCancel = () => {\n    const formEmpty = !!(\n      this.state.post.length === 0 &&\n      this.state.title.length === 0 &&\n      this.state.to.length === 0 &&\n      this.state.attachments.length === 0\n    )\n\n    if (formEmpty) {\n      return this.close()\n    }\n\n    const cancel = window.confirm(\n      pgettext(\n        \"post thread\",\n        \"Are you sure you want to discard private thread?\"\n      )\n    )\n    if (cancel) {\n      this.close()\n    }\n  }\n\n  onToChange = (event) => {\n    this.changeValue(\"to\", event.target.value)\n  }\n\n  onTitleChange = (event) => {\n    this.changeValue(\"title\", event.target.value)\n  }\n\n  onPostChange = (event) => {\n    this.changeValue(\"post\", event.target.value)\n  }\n\n  onAttachmentsChange = (attachments) => {\n    this.setState(attachments)\n  }\n\n  clean() {\n    if (!cleanUsernames(this.state.to).length) {\n      snackbar.error(\n        pgettext(\"posting form\", \"You have to enter at least one recipient.\")\n      )\n      return false\n    }\n\n    if (!this.state.title.trim().length) {\n      snackbar.error(\n        pgettext(\"posting form\", \"You have to enter thread title.\")\n      )\n      return false\n    }\n\n    if (!this.state.post.trim().length) {\n      snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n      return false\n    }\n\n    const errors = this.validate()\n\n    if (errors.title) {\n      snackbar.error(errors.title[0])\n      return false\n    }\n\n    if (errors.post) {\n      snackbar.error(errors.post[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.submit, {\n      to: cleanUsernames(this.state.to),\n      title: this.state.title,\n      post: this.state.post,\n      attachments: attachments.clean(this.state.attachments),\n    })\n  }\n\n  handleSuccess(success) {\n    this.setState({ isLoading: true })\n    this.close()\n\n    snackbar.success(pgettext(\"post thread\", \"Your thread has been posted.\"))\n    window.location = success.url\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      const errors = [].concat(\n        rejection.non_field_errors || [],\n        rejection.to || [],\n        rejection.title || [],\n        rejection.post || [],\n        rejection.attachments || []\n      )\n\n      snackbar.error(errors[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  close = () => {\n    this.minimize()\n    posting.close()\n  }\n\n  minimize = () => {\n    this.setState({ fullscreen: false, minimized: true })\n  }\n\n  open = () => {\n    this.setState({ minimized: false })\n    if (this.state.fullscreen) {\n    }\n  }\n\n  fullscreenEnter = () => {\n    this.setState({ fullscreen: true, minimized: false })\n  }\n\n  fullscreenExit = () => {\n    this.setState({ fullscreen: false, minimized: false })\n  }\n\n  render() {\n    const dialogProps = {\n      minimized: this.state.minimized,\n      minimize: this.minimize,\n      open: this.open,\n\n      fullscreen: this.state.fullscreen,\n      fullscreenEnter: this.fullscreenEnter,\n      fullscreenExit: this.fullscreenExit,\n\n      close: this.onCancel,\n    }\n\n    return (\n      <PostingDialogStartPrivate {...dialogProps}>\n        <form className=\"posting-dialog-form\" onSubmit={this.handleSubmit}>\n          <Toolbar className=\"posting-dialog-toolbar\">\n            <ToolbarSection className=\"posting-dialog-thread-recipients\" auto>\n              <ToolbarItem auto>\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  onChange={this.onToChange}\n                  placeholder={pgettext(\n                    \"post thread\",\n                    \"Recipients, eg.: Danny, Lisa, Alice\"\n                  )}\n                  type=\"text\"\n                  value={this.state.to}\n                />\n              </ToolbarItem>\n            </ToolbarSection>\n            <ToolbarSection className=\"posting-dialog-thread-title\" auto>\n              <ToolbarItem auto>\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  onChange={this.onTitleChange}\n                  placeholder={pgettext(\"post thread\", \"Thread title\")}\n                  type=\"text\"\n                  value={this.state.title}\n                />\n              </ToolbarItem>\n            </ToolbarSection>\n          </Toolbar>\n          <MarkupEditor\n            attachments={this.state.attachments}\n            value={this.state.post}\n            submitText={pgettext(\"post thread submit\", \"Start thread\")}\n            disabled={this.state.isLoading}\n            onAttachmentsChange={this.onAttachmentsChange}\n            onChange={this.onPostChange}\n          />\n        </form>\n      </PostingDialogStartPrivate>\n    )\n  }\n}\n\nconst PostingDialogStartPrivate = ({\n  children,\n  close,\n  minimized,\n  minimize,\n  open,\n  fullscreen,\n  fullscreenEnter,\n  fullscreenExit,\n}) => (\n  <PostingDialog fullscreen={fullscreen} minimized={minimized}>\n    <PostingDialogHeader\n      fullscreen={fullscreen}\n      fullscreenEnter={fullscreenEnter}\n      fullscreenExit={fullscreenExit}\n      minimized={minimized}\n      minimize={minimize}\n      open={open}\n      close={close}\n    >\n      {pgettext(\"post thread\", \"Start private thread\")}\n    </PostingDialogHeader>\n    <PostingDialogBody>{children}</PostingDialogBody>\n  </PostingDialog>\n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n      isLoading: false,\n\n      error: null,\n\n      minimized: false,\n      fullscreen: false,\n\n      post: this.props.default || \"\",\n      attachments: [],\n\n      validators: {\n        post: getPostValidators(),\n      },\n      errors: {},\n    }\n\n    this.quoteText = \"\"\n  }\n\n  componentDidMount() {\n    ajax\n      .get(this.props.config, this.props.context || null)\n      .then(this.loadSuccess, this.loadError)\n\n    setGlobalState(false, this.onQuote)\n  }\n\n  componentWillUnmount() {\n    clearGlobalState()\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const context = this.props.context\n    const newContext = nextProps.context\n\n    // User clicked \"reply\" instead of \"quote\"\n    if (context && newContext && !newContext.reply) return\n\n    ajax\n      .get(nextProps.config, nextProps.context || null)\n      .then(this.appendData, snackbar.apiError)\n  }\n\n  loadSuccess = (data) => {\n    this.setState({\n      isReady: true,\n\n      post: data.post\n        ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n        : this.state.post,\n    })\n\n    this.quoteText = data.post\n      ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\"\n      : this.state.post\n  }\n\n  loadError = (rejection) => {\n    this.setState({\n      error: rejection.detail,\n    })\n  }\n\n  appendData = (data) => {\n    const newPost = data.post\n      ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n      : \"\"\n\n    this.setState((prevState, props) => {\n      if (prevState.post.length > 0) {\n        return {\n          post: prevState.post.trim() + \"\\n\\n\" + newPost,\n        }\n      }\n\n      return {\n        post: newPost,\n      }\n    })\n\n    this.open()\n  }\n\n  onCancel = () => {\n    // If only the quote text is on editor user didn't add anything\n    // so no changes to discard\n    const onlyQuoteTextInEditor = this.state.post === this.quoteText\n\n    if (onlyQuoteTextInEditor && this.state.attachments.length === 0) {\n      return this.close()\n    }\n\n    const cancel = window.confirm(\n      pgettext(\"post reply\", \"Are you sure you want to discard your reply?\")\n    )\n    if (cancel) {\n      this.close()\n    }\n  }\n\n  onPostChange = (event) => {\n    this.changeValue(\"post\", event.target.value)\n  }\n\n  onAttachmentsChange = (attachments) => {\n    this.setState(attachments)\n  }\n\n  onQuote = (quote) => {\n    this.setState(({ post }) => {\n      if (post.length > 0) {\n        return { post: post.trim() + \"\\n\\n\" + quote }\n      }\n\n      return { post: quote }\n    })\n\n    this.open()\n  }\n\n  clean() {\n    if (!this.state.post.trim().length) {\n      snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n      return false\n    }\n\n    const errors = this.validate()\n\n    if (errors.post) {\n      snackbar.error(errors.post[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    setGlobalState(true, this.onQuote)\n\n    return ajax.post(this.props.submit, {\n      post: this.state.post,\n      attachments: attachments.clean(this.state.attachments),\n    })\n  }\n\n  handleSuccess(success) {\n    this.setState({ isLoading: true })\n    this.close()\n\n    setGlobalState(false, this.onQuote)\n\n    snackbar.success(pgettext(\"post reply\", \"Your reply has been posted.\"))\n    window.location = success.url.index\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      const errors = [].concat(\n        rejection.non_field_errors || [],\n        rejection.post || [],\n        rejection.attachments || []\n      )\n\n      snackbar.error(errors[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n\n    setGlobalState(false, this.onQuote)\n  }\n\n  close = () => {\n    this.minimize()\n    posting.close()\n  }\n\n  minimize = () => {\n    this.setState({ fullscreen: false, minimized: true })\n  }\n\n  open = () => {\n    this.setState({ minimized: false })\n    if (this.state.fullscreen) {\n    }\n  }\n\n  fullscreenEnter = () => {\n    this.setState({ fullscreen: true, minimized: false })\n  }\n\n  fullscreenExit = () => {\n    this.setState({ fullscreen: false, minimized: false })\n  }\n\n  render() {\n    const dialogProps = {\n      thread: this.props.thread,\n\n      minimized: this.state.minimized,\n      minimize: this.minimize,\n      open: this.open,\n\n      fullscreen: this.state.fullscreen,\n      fullscreenEnter: this.fullscreenEnter,\n      fullscreenExit: this.fullscreenExit,\n\n      close: this.onCancel,\n    }\n\n    if (this.state.error) {\n      return (\n        <PostingDialogReply {...dialogProps}>\n          <PostingDialogError message={this.state.error} close={this.close} />\n        </PostingDialogReply>\n      )\n    }\n\n    if (!this.state.isReady) {\n      return (\n        <PostingDialogReply {...dialogProps}>\n          <div className=\"posting-loading ui-preview\">\n            <MarkupEditor\n              attachments={[]}\n              value={\"\"}\n              submitText={pgettext(\"post reply submit\", \"Post reply\")}\n              disabled={true}\n              onAttachmentsChange={() => {}}\n              onChange={() => {}}\n            />\n          </div>\n        </PostingDialogReply>\n      )\n    }\n\n    return (\n      <PostingDialogReply {...dialogProps}>\n        <form\n          className=\"posting-dialog-form\"\n          method=\"POST\"\n          onSubmit={this.handleSubmit}\n        >\n          <MarkupEditor\n            attachments={this.state.attachments}\n            value={this.state.post}\n            submitText={pgettext(\"post reply submit\", \"Post reply\")}\n            disabled={this.state.isLoading}\n            onAttachmentsChange={this.onAttachmentsChange}\n            onChange={this.onPostChange}\n          />\n        </form>\n      </PostingDialogReply>\n    )\n  }\n}\n\nconst PostingDialogReply = ({\n  children,\n  close,\n  minimized,\n  minimize,\n  open,\n  fullscreen,\n  fullscreenEnter,\n  fullscreenExit,\n  thread,\n}) => (\n  <PostingDialog fullscreen={fullscreen} minimized={minimized}>\n    <PostingDialogHeader\n      fullscreen={fullscreen}\n      fullscreenEnter={fullscreenEnter}\n      fullscreenExit={fullscreenExit}\n      minimized={minimized}\n      minimize={minimize}\n      open={open}\n      close={close}\n    >\n      {interpolate(\n        pgettext(\"post reply\", \"Reply to: %(thread)s\"),\n        { thread: thread.title },\n        true\n      )}\n    </PostingDialogHeader>\n    <PostingDialogBody>{children}</PostingDialogBody>\n  </PostingDialog>\n)\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport * as attachments from \"./utils/attachments\"\nimport { getPostValidators } from \"./utils/validators\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport MarkupEditor from \"../MarkupEditor\"\nimport PostingDialog from \"./PostingDialog\"\nimport PostingDialogBody from \"./PostingDialogBody\"\nimport PostingDialogError from \"./PostingDialogError\"\nimport PostingDialogHeader from \"./PostingDialogHeader\"\nimport { clearGlobalState, setGlobalState } from \"./globalState\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n      isLoading: false,\n\n      error: false,\n\n      minimized: false,\n      fullscreen: false,\n\n      post: \"\",\n      attachments: [],\n      protect: false,\n\n      canProtect: false,\n\n      validators: {\n        post: getPostValidators(),\n      },\n      errors: {},\n    }\n\n    this.originalPost = \"\"\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.config).then(this.loadSuccess, this.loadError)\n\n    setGlobalState(false, this.onQuote)\n  }\n\n  componentWillUnmount() {\n    clearGlobalState()\n  }\n\n  componentWillReceiveProps(nextProps) {\n    const context = this.props.context\n    const newContext = nextProps.context\n\n    if (context && newContext && context.reply === newContext.reply) return\n\n    ajax\n      .get(nextProps.config, nextProps.context || null)\n      .then(this.appendData, snackbar.apiError)\n  }\n\n  loadSuccess = (data) => {\n    this.originalPost = data.post\n\n    this.setState({\n      isReady: true,\n\n      post: data.post,\n      attachments: attachments.hydrate(data.attachments),\n      protect: data.is_protected,\n\n      canProtect: data.can_protect,\n    })\n  }\n\n  loadError = (rejection) => {\n    this.setState({\n      error: rejection.detail,\n    })\n  }\n\n  appendData = (data) => {\n    const newPost = data.post\n      ? '[quote=\"@' + data.poster + '\"]\\n' + data.post + \"\\n[/quote]\\n\\n\"\n      : \"\"\n\n    this.setState((prevState, props) => {\n      if (prevState.post.length > 0) {\n        return {\n          post: prevState.post.trim() + \"\\n\\n\" + newPost,\n        }\n      }\n\n      return {\n        post: newPost,\n      }\n    })\n\n    this.open()\n  }\n\n  onCancel = () => {\n    const originalPostSameAsCurrentPost =\n      this.state.originalPost === this.state.post\n    const noAttachementsAdded = this.state.attachments.length === 0\n\n    if (originalPostSameAsCurrentPost && noAttachementsAdded) {\n      return this.close()\n    }\n\n    const cancel = window.confirm(\n      pgettext(\"edit reply\", \"Are you sure you want to discard changes?\")\n    )\n    if (cancel) {\n      this.close()\n    }\n  }\n\n  onProtect = () => {\n    this.setState({\n      protect: true,\n    })\n  }\n\n  onUnprotect = () => {\n    this.setState({\n      protect: false,\n    })\n  }\n\n  onPostChange = (event) => {\n    this.changeValue(\"post\", event.target.value)\n  }\n\n  onAttachmentsChange = (attachments) => {\n    this.setState(attachments)\n  }\n\n  onQuote = (quote) => {\n    this.setState(({ post }) => {\n      if (post.length > 0) {\n        return { post: post.trim() + \"\\n\\n\" + quote }\n      }\n\n      return { post: quote }\n    })\n\n    this.open()\n  }\n\n  clean() {\n    if (!this.state.post.trim().length) {\n      snackbar.error(pgettext(\"posting form\", \"You have to enter a message.\"))\n      return false\n    }\n\n    const errors = this.validate()\n\n    if (errors.post) {\n      snackbar.error(errors.post[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    setGlobalState(true, this.onQuote)\n\n    return ajax.put(this.props.submit, {\n      post: this.state.post,\n      attachments: attachments.clean(this.state.attachments),\n      protect: this.state.protect,\n    })\n  }\n\n  handleSuccess(success) {\n    this.setState({ isLoading: true })\n    this.close()\n\n    setGlobalState(false, this.onQuote)\n\n    snackbar.success(pgettext(\"edit reply\", \"Reply has been edited.\"))\n    window.location = success.url.index\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      const errors = [].concat(\n        rejection.non_field_errors || [],\n        rejection.category || [],\n        rejection.title || [],\n        rejection.post || [],\n        rejection.attachments || []\n      )\n\n      snackbar.error(errors[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n\n    setGlobalState(false, this.onQuote)\n  }\n\n  close = () => {\n    this.minimize()\n    posting.close()\n  }\n\n  minimize = () => {\n    this.setState({ fullscreen: false, minimized: true })\n  }\n\n  open = () => {\n    this.setState({ minimized: false })\n    if (this.state.fullscreen) {\n    }\n  }\n\n  fullscreenEnter = () => {\n    this.setState({ fullscreen: true, minimized: false })\n  }\n\n  fullscreenExit = () => {\n    this.setState({ fullscreen: false, minimized: false })\n  }\n\n  render() {\n    const dialogProps = {\n      post: this.props.post,\n\n      minimized: this.state.minimized,\n      minimize: this.minimize,\n      open: this.open,\n\n      fullscreen: this.state.fullscreen,\n      fullscreenEnter: this.fullscreenEnter,\n      fullscreenExit: this.fullscreenExit,\n\n      close: this.onCancel,\n    }\n\n    if (this.state.error) {\n      return (\n        <PostingDialogEditReply {...dialogProps}>\n          <PostingDialogError message={this.state.error} close={this.close} />\n        </PostingDialogEditReply>\n      )\n    }\n\n    if (!this.state.isReady) {\n      return (\n        <PostingDialogEditReply {...dialogProps}>\n          <div className=\"posting-loading ui-preview\">\n            <MarkupEditor\n              attachments={[]}\n              value={\"\"}\n              submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n              disabled={true}\n              onAttachmentsChange={() => {}}\n              onChange={() => {}}\n            />\n          </div>\n        </PostingDialogEditReply>\n      )\n    }\n\n    return (\n      <PostingDialogEditReply {...dialogProps}>\n        <form\n          className=\"posting-dialog-form\"\n          method=\"POST\"\n          onSubmit={this.handleSubmit}\n        >\n          <MarkupEditor\n            attachments={this.state.attachments}\n            canProtect={this.state.canProtect}\n            isProtected={this.state.protect}\n            enableProtection={() => this.setState({ protect: true })}\n            disableProtection={() => this.setState({ protect: false })}\n            value={this.state.post}\n            submitText={pgettext(\"edit reply submit\", \"Edit reply\")}\n            disabled={this.state.isLoading}\n            onAttachmentsChange={this.onAttachmentsChange}\n            onChange={this.onPostChange}\n          />\n        </form>\n      </PostingDialogEditReply>\n    )\n  }\n}\n\nconst PostingDialogEditReply = ({\n  children,\n  close,\n  minimized,\n  minimize,\n  open,\n  fullscreen,\n  fullscreenEnter,\n  fullscreenExit,\n  post,\n}) => (\n  <PostingDialog fullscreen={fullscreen} minimized={minimized}>\n    <PostingDialogHeader\n      fullscreen={fullscreen}\n      fullscreenEnter={fullscreenEnter}\n      fullscreenExit={fullscreenExit}\n      minimized={minimized}\n      minimize={minimize}\n      open={open}\n      close={close}\n    >\n      {interpolate(\n        pgettext(\"edit reply\", \"Edit reply by %(poster)s from %(date)s\"),\n        {\n          poster: post.poster ? post.poster.username : post.poster_name,\n          date: post.posted_on.fromNow(),\n        },\n        true\n      )}\n    </PostingDialogHeader>\n    <PostingDialogBody>{children}</PostingDialogBody>\n  </PostingDialog>\n)\n","import React from \"react\"\nimport PostingQuoteSelection from \"./PostingQuoteSelection\"\nimport getQuoteMarkup from \"./getQuoteMarkup\"\nimport { clearGlobalState, getGlobalState, setGlobalState } from \"./globalState\"\nimport Start from \"./start\"\nimport StartPrivate from \"./start-private\"\nimport Reply from \"./reply\"\nimport Edit from \"./edit\"\n\nexport default function (props) {\n  switch (props.mode) {\n    case \"START\":\n      return <Start {...props} />\n\n    case \"START_PRIVATE\":\n      return <StartPrivate {...props} />\n\n    case \"REPLY\":\n      return <Reply {...props} />\n\n    case \"EDIT\":\n      return <Edit {...props} />\n\n    default:\n      return null\n  }\n}\n\nexport {\n  PostingQuoteSelection,\n  clearGlobalState,\n  getGlobalState,\n  getQuoteMarkup,\n  setGlobalState,\n}\n","import { maxLength, minLength } from \"misago/utils/validators\"\nimport misago from \"misago\"\n\nexport function getTitleValidators() {\n  return [getTitleLengthMin(), getTitleLengthMax()]\n}\n\nexport function getPostValidators() {\n  if (misago.get(\"SETTINGS\").post_length_max) {\n    return [validatePostLengthMin(), validatePostLengthMax()]\n  } else {\n    return [validatePostLengthMin()]\n  }\n}\n\nexport function getTitleLengthMin() {\n  return minLength(\n    misago.get(\"SETTINGS\").thread_title_length_min,\n    (limitValue, length) => {\n      const message = npgettext(\n        \"thread title length validator\",\n        \"Thread title should be at least %(limit_value)s character long (it has %(show_value)s).\",\n        \"Thread title should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n        limitValue\n      )\n\n      return interpolate(\n        message,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  )\n}\n\nexport function getTitleLengthMax() {\n  return maxLength(\n    misago.get(\"SETTINGS\").thread_title_length_max,\n    (limitValue, length) => {\n      const message = npgettext(\n        \"thread title length validator\",\n        \"Thread title cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n        \"Thread title cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n        limitValue\n      )\n\n      return interpolate(\n        message,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  )\n}\n\nexport function validatePostLengthMin() {\n  return minLength(\n    misago.get(\"SETTINGS\").post_length_min,\n    (limitValue, length) => {\n      const message = npgettext(\n        \"post length validator\",\n        \"Posted message should be at least %(limit_value)s character long (it has %(show_value)s).\",\n        \"Posted message should be at least %(limit_value)s characters long (it has %(show_value)s).\",\n        limitValue\n      )\n\n      return interpolate(\n        message,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  )\n}\n\nexport function validatePostLengthMax() {\n  return maxLength(\n    misago.get(\"SETTINGS\").post_length_max || 1000000,\n    (limitValue, length) => {\n      const message = npgettext(\n        \"post length validator\",\n        \"Posted message cannot be longer than %(limit_value)s character (it has %(show_value)s).\",\n        \"Posted message cannot be longer than %(limit_value)s characters (it has %(show_value)s).\",\n        limitValue\n      )\n\n      return interpolate(\n        message,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getChoice() {\n    let choice = null\n    this.props.choices.map((item) => {\n      if (item.value === this.props.value) {\n        choice = item\n      }\n    })\n    return choice\n  }\n\n  getIcon() {\n    return this.getChoice().icon\n  }\n\n  getLabel() {\n    return this.getChoice().label\n  }\n\n  change = (value) => {\n    return () => {\n      this.props.onChange({\n        target: {\n          value: value,\n        },\n      })\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"btn-group btn-select-group\">\n        <button\n          type=\"button\"\n          className=\"btn btn-select dropdown-toggle\"\n          id={this.props.id || null}\n          data-toggle=\"dropdown\"\n          aria-haspopup=\"true\"\n          aria-expanded=\"false\"\n          aria-describedby={this.props[\"aria-describedby\"] || null}\n          disabled={this.props.disabled || false}\n        >\n          <Icon icon={this.getIcon()} />\n          {this.getLabel()}\n        </button>\n        <ul className=\"dropdown-menu\">\n          {this.props.choices.map((item, i) => {\n            return (\n              <li key={i}>\n                <button\n                  type=\"button\"\n                  className=\"btn-link\"\n                  onClick={this.change(item.value)}\n                >\n                  <Icon icon={item.icon} />\n                  {item.label}\n                </button>\n              </li>\n            )\n          })}\n        </ul>\n      </div>\n    )\n  }\n}\n\nexport function Icon({ icon }) {\n  if (!icon) return null\n\n  return <span className=\"material-icon\">{icon}</span>\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport StartSocialAuth from \"misago/components/StartSocialAuth\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      showActivation: false,\n\n      username: \"\",\n      password: \"\",\n\n      validators: {\n        username: [],\n        password: [],\n      },\n    }\n  }\n\n  clean() {\n    if (!this.isValid()) {\n      snackbar.error(pgettext(\"sign in modal\", \"Fill out both fields.\"))\n      return false\n    } else {\n      return true\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"AUTH_API\"), {\n      username: this.state.username,\n      password: this.state.password,\n    })\n  }\n\n  handleSuccess() {\n    let form = $(\"#hidden-login-form\")\n\n    form.append('<input type=\"text\" name=\"username\" />')\n    form.append('<input type=\"password\" name=\"password\" />')\n\n    // fill out form with user credentials and submit it, this will tell\n    // Misago to redirect user back to right page, and will trigger browser's\n    // key ring feature\n    form.find('input[type=\"hidden\"]').val(ajax.getCsrfToken())\n    form.find('input[name=\"redirect_to\"]').val(window.location.pathname)\n    form.find('input[name=\"username\"]').val(this.state.username)\n    form.find('input[name=\"password\"]').val(this.state.password)\n    form.submit()\n\n    // keep form loading\n    this.setState({\n      isLoading: true,\n    })\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      if (rejection.code === \"inactive_admin\") {\n        snackbar.info(rejection.detail)\n      } else if (rejection.code === \"inactive_user\") {\n        snackbar.info(rejection.detail)\n        this.setState({\n          showActivation: true,\n        })\n      } else if (rejection.code === \"banned\") {\n        showBannedPage(rejection.detail)\n        modal.hide()\n      } else {\n        snackbar.error(rejection.detail)\n      }\n    } else if (rejection.status === 403 && rejection.ban) {\n      showBannedPage(rejection.ban)\n      modal.hide()\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  getActivationButton() {\n    if (!this.state.showActivation) return null\n\n    return (\n      <a\n        className=\"btn btn-success btn-block\"\n        href={misago.get(\"REQUEST_ACTIVATION_URL\")}\n      >\n        {pgettext(\"sign in modal btn\", \"Activate account\")}\n      </a>\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-sm modal-sign-in\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"sign in modal title\", \"Sign in\")}\n            </h4>\n          </div>\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-body\">\n              <StartSocialAuth\n                buttonLabel={pgettext(\"sign in modal\", \"Sign in with %(site)s\")}\n                formLabel={pgettext(\n                  \"sign in modal\",\n                  \"Or use your forum account:\"\n                )}\n                labelClassName=\"text-center\"\n              />\n\n              <div className=\"form-group\">\n                <div className=\"control-input\">\n                  <input\n                    className=\"form-control input-lg\"\n                    disabled={this.state.isLoading}\n                    id=\"id_username\"\n                    onChange={this.bindInput(\"username\")}\n                    placeholder={pgettext(\n                      \"sign in modal field\",\n                      \"Username or e-mail\"\n                    )}\n                    type=\"text\"\n                    value={this.state.username}\n                  />\n                </div>\n              </div>\n\n              <div className=\"form-group\">\n                <div className=\"control-input\">\n                  <input\n                    className=\"form-control input-lg\"\n                    disabled={this.state.isLoading}\n                    id=\"id_password\"\n                    onChange={this.bindInput(\"password\")}\n                    placeholder={pgettext(\"sign in modal field\", \"Password\")}\n                    type=\"password\"\n                    value={this.state.password}\n                  />\n                </div>\n              </div>\n            </div>\n            <div className=\"modal-footer\">\n              {this.getActivationButton()}\n              <Button\n                className=\"btn-primary btn-block\"\n                loading={this.state.isLoading}\n              >\n                {pgettext(\"sign in modal btn\", \"Sign in\")}\n              </Button>\n              <a\n                className=\"btn btn-default btn-block\"\n                href={misago.get(\"FORGOTTEN_PASSWORD_URL\")}\n              >\n                {pgettext(\"sign in modal btn\", \"Forgot password?\")}\n              </a>\n            </div>\n          </form>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getClass() {\n    return getStatusClassName(this.props.status)\n  }\n\n  render() {\n    return <span className={this.getClass()}>{this.props.children}</span>\n  }\n}\n\nexport class StatusIcon extends React.Component {\n  getIcon() {\n    if (this.props.status.is_banned) {\n      return \"remove_circle_outline\"\n    } else if (this.props.status.is_hidden) {\n      return \"help_outline\"\n    } else if (this.props.status.is_online_hidden) {\n      return \"label\"\n    } else if (this.props.status.is_offline_hidden) {\n      return \"label_outline\"\n    } else if (this.props.status.is_online) {\n      return \"lens\"\n    } else if (this.props.status.is_offline) {\n      return \"panorama_fish_eye\"\n    }\n  }\n\n  render() {\n    return <span className=\"material-icon status-icon\">{this.getIcon()}</span>\n  }\n}\n\nexport class StatusLabel extends React.Component {\n  getHelp() {\n    return getStatusDescription(this.props.user, this.props.status)\n  }\n\n  getLabel() {\n    if (this.props.status.is_banned) {\n      return pgettext(\"user status\", \"Banned\")\n    } else if (this.props.status.is_hidden) {\n      return pgettext(\"user status\", \"Hidden\")\n    } else if (this.props.status.is_online_hidden) {\n      return pgettext(\"user status\", \"Online (hidden)\")\n    } else if (this.props.status.is_offline_hidden) {\n      return pgettext(\"user status\", \"Offline (hidden)\")\n    } else if (this.props.status.is_online) {\n      return pgettext(\"user status\", \"Online\")\n    } else if (this.props.status.is_offline) {\n      return pgettext(\"user status\", \"Offline\")\n    }\n  }\n\n  render() {\n    return (\n      <span\n        className={this.props.className || \"status-label\"}\n        title={this.getHelp()}\n      >\n        {this.getLabel()}\n      </span>\n    )\n  }\n}\n\nexport function getStatusClassName(status) {\n  let className = \"\"\n  if (status.is_banned) {\n    className = \"banned\"\n  } else if (status.is_hidden) {\n    className = \"offline\"\n  } else if (status.is_online_hidden) {\n    className = \"online\"\n  } else if (status.is_offline_hidden) {\n    className = \"offline\"\n  } else if (status.is_online) {\n    className = \"online\"\n  } else if (status.is_offline) {\n    className = \"offline\"\n  }\n\n  return \"user-status user-\" + className\n}\n\nexport function getStatusDescription(user, status) {\n  if (status.is_banned) {\n    if (status.banned_until) {\n      return interpolate(\n        pgettext(\"user status\", \"%(username)s is banned until %(ban_expires)s\"),\n        {\n          username: user.username,\n          ban_expires: status.banned_until.format(\"LL, LT\"),\n        },\n        true\n      )\n    } else {\n      return interpolate(\n        pgettext(\"user status\", \"%(username)s is banned\"),\n        {\n          username: user.username,\n        },\n        true\n      )\n    }\n  } else if (status.is_hidden) {\n    return interpolate(\n      pgettext(\"user status\", \"%(username)s is hiding presence\"),\n      {\n        username: user.username,\n      },\n      true\n    )\n  } else if (status.is_online_hidden) {\n    return interpolate(\n      pgettext(\"user status\", \"%(username)s is online (hidden)\"),\n      {\n        username: user.username,\n      },\n      true\n    )\n  } else if (status.is_offline_hidden) {\n    return interpolate(\n      pgettext(\n        \"user status\",\n        \"%(username)s was last seen %(last_click)s (hidden)\"\n      ),\n      {\n        username: user.username,\n        last_click: status.last_click.fromNow(),\n      },\n      true\n    )\n  } else if (status.is_online) {\n    return interpolate(\n      pgettext(\"user status\", \"%(username)s is online\"),\n      {\n        username: user.username,\n      },\n      true\n    )\n  } else if (status.is_offline) {\n    return interpolate(\n      pgettext(\"user status\", \"%(username)s was last seen %(last_click)s\"),\n      {\n        username: user.username,\n        last_click: status.last_click.fromNow(),\n      },\n      true\n    )\n  }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getEmptyMessage() {\n    if (this.props.emptyMessage) {\n      return this.props.emptyMessage\n    } else {\n      return pgettext(\n        \"username history empty\",\n        \"Your account has no history of name changes.\"\n      )\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"username-history ui-ready\">\n        <ul className=\"list-group\">\n          <li className=\"list-group-item empty-message\">\n            {this.getEmptyMessage()}\n          </li>\n        </ul>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default class extends React.Component {\n  renderUserAvatar() {\n    if (this.props.change.changed_by) {\n      return (\n        <a\n          href={this.props.change.changed_by.url}\n          className=\"user-avatar-wrapper\"\n        >\n          <Avatar user={this.props.change.changed_by} size=\"100\" />\n        </a>\n      )\n    } else {\n      return (\n        <span className=\"user-avatar-wrapper\">\n          <Avatar size=\"100\" />\n        </span>\n      )\n    }\n  }\n\n  renderUsername() {\n    if (this.props.change.changed_by) {\n      return (\n        <a href={this.props.change.changed_by.url} className=\"item-title\">\n          {this.props.change.changed_by.username}\n        </a>\n      )\n    } else {\n      return (\n        <span className=\"item-title\">\n          {this.props.change.changed_by_username}\n        </span>\n      )\n    }\n  }\n\n  render() {\n    return (\n      <li className=\"list-group-item\" key={this.props.change.id}>\n        <div className=\"change-avatar\">{this.renderUserAvatar()}</div>\n        <div className=\"change-author\">{this.renderUsername()}</div>\n        <div className=\"change\">\n          <span className=\"old-username\">{this.props.change.old_username}</span>\n          <span className=\"material-icon\">arrow_forward</span>\n          <span className=\"new-username\">{this.props.change.new_username}</span>\n        </div>\n        <div className=\"change-date\">\n          <abbr title={this.props.change.changed_on.format(\"LLL\")}>\n            {this.props.change.changed_on.fromNow()}\n          </abbr>\n        </div>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport Change from \"misago/components/username-history/change\"\n\nexport default class extends React.Component {\n  render() {\n    return (\n      <div className=\"username-history ui-ready\">\n        <ul className=\"list-group\">\n          {this.props.changes.map((change) => {\n            return <Change change={change} key={change.id} />\n          })}\n        </ul>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  getClassName() {\n    if (this.props.hiddenOnMobile) {\n      return \"list-group-item hidden-xs hidden-sm\"\n    } else {\n      return \"list-group-item\"\n    }\n  }\n\n  render() {\n    return (\n      <li className={this.getClassName()}>\n        <div className=\"change-avatar\">\n          <span className=\"user-avatar\">\n            <Avatar size=\"100\" />\n          </span>\n        </div>\n        <div className=\"change-author\">\n          <span\n            className=\"ui-preview-text\"\n            style={{ width: random.int(30, 100) + \"px\" }}\n          >\n            &nbsp;\n          </span>\n        </div>\n        <div className=\"change\">\n          <span\n            className=\"ui-preview-text\"\n            style={{ width: random.int(30, 70) + \"px\" }}\n          >\n            &nbsp;\n          </span>\n          <span className=\"material-icon\">arrow_forward</span>\n          <span\n            className=\"ui-preview-text\"\n            style={{ width: random.int(30, 70) + \"px\" }}\n          >\n            &nbsp;\n          </span>\n        </div>\n        <div className=\"change-date\">\n          <span\n            className=\"ui-preview-text\"\n            style={{ width: random.int(80, 140) + \"px\" }}\n          >\n            &nbsp;\n          </span>\n        </div>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport ChangePreview from \"misago/components/username-history/change-preview\"\n\nexport default class extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"username-history ui-preview\">\n        <ul className=\"list-group\">\n          {[0, 1, 2].map((i) => {\n            return <ChangePreview hiddenOnMobile={i > 0} key={i} />\n          })}\n        </ul>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/username-history/list-empty\"\nimport ListReady from \"misago/components/username-history/list-ready\"\nimport ListPreview from \"misago/components/username-history/list-preview\"\n\nexport default class extends React.Component {\n  render() {\n    if (this.props.isLoaded) {\n      if (this.props.changes.length) {\n        return <ListReady changes={this.props.changes} />\n      } else {\n        return <ListEmpty emptyMessage={this.props.emptyMessage} />\n      }\n    } else {\n      return <ListPreview />\n    }\n  }\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\n\nexport default function ({ showStatus, user }) {\n  return (\n    <ul className=\"list-unstyled\">\n      <Status showStatus={showStatus} user={user} />\n      <JoinDate user={user} />\n      <li className=\"user-stat-divider\" />\n      <Posts user={user} />\n      <Threads user={user} />\n      <Followers user={user} />\n    </ul>\n  )\n}\n\nexport function Status({ showStatus, user }) {\n  if (!showStatus) return null\n\n  return (\n    <li className=\"user-stat-status\">\n      <UserStatus status={user.status}>\n        <StatusLabel status={user.status} user={user} />\n      </UserStatus>\n    </li>\n  )\n}\n\nexport function JoinDate({ user }) {\n  const { joined_on } = user\n\n  let title = interpolate(\n    pgettext(\"users list item\", \"Joined on %(joined_on)s\"),\n    {\n      joined_on: joined_on.format(\"LL, LT\"),\n    },\n    true\n  )\n\n  let message = interpolate(\n    pgettext(\"users list item\", \"Joined %(joined_on)s\"),\n    {\n      joined_on: joined_on.fromNow(),\n    },\n    true\n  )\n\n  return (\n    <li className=\"user-stat-join-date\">\n      <abbr title={title}>{message}</abbr>\n    </li>\n  )\n}\n\nexport function Posts({ user }) {\n  const className = getStatClassName(\"user-stat-posts\", user.posts)\n  const message = npgettext(\n    \"users list item\",\n    \"%(posts)s post\",\n    \"%(posts)s posts\",\n    user.posts\n  )\n\n  return (\n    <li className={className}>\n      {interpolate(\n        message,\n        {\n          posts: user.posts,\n        },\n        true\n      )}\n    </li>\n  )\n}\n\nexport function Threads({ user }) {\n  const className = getStatClassName(\"user-stat-threads\", user.threads)\n  const message = npgettext(\n    \"users list item\",\n    \"%(threads)s thread\",\n    \"%(threads)s threads\",\n    user.threads\n  )\n\n  return (\n    <li className={className}>\n      {interpolate(\n        message,\n        {\n          threads: user.threads,\n        },\n        true\n      )}\n    </li>\n  )\n}\n\nexport function Followers({ user }) {\n  const className = getStatClassName(\"user-stat-followers\", user.followers)\n  const message = npgettext(\n    \"users list item\",\n    \"%(followers)s follower\",\n    \"%(followers)s followers\",\n    user.followers\n  )\n\n  return (\n    <li className={className}>\n      {interpolate(\n        message,\n        {\n          followers: user.followers,\n        },\n        true\n      )}\n    </li>\n  )\n}\n\nexport function getStatClassName(className, stat) {\n  if (stat === 0) {\n    return className + \" user-stat-empty\"\n  }\n  return className\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n  let userTitle = title || rank.title || rank.name\n\n  let className = \"user-title\"\n  if (rank.css_class) {\n    className += \" user-title-\" + rank.css_class\n  }\n\n  if (rank.is_tab) {\n    return (\n      <a className={className} href={rank.url}>\n        {userTitle}\n      </a>\n    )\n  }\n\n  return <span className={className}>{userTitle}</span>\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Stats from \"./stats\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ showStatus, user }) {\n  const { rank } = user\n\n  let className = \"panel user-card\"\n  if (rank.css_class) {\n    className += \" user-card-\" + rank.css_class\n  }\n\n  return (\n    <div className={className}>\n      <div className=\"panel-body\">\n        <div className=\"row\">\n          <div className=\"col-xs-3 user-card-left\">\n            <div className=\"user-card-small-avatar\">\n              <a href={user.url}>\n                <Avatar size=\"50\" size2x=\"80\" user={user} />\n              </a>\n            </div>\n          </div>\n          <div className=\"col-xs-9 col-sm-12 user-card-body\">\n            <div className=\"user-card-avatar\">\n              <a href={user.url}>\n                <Avatar size=\"150\" size2x=\"200\" user={user} />\n              </a>\n            </div>\n\n            <div className=\"user-card-username\">\n              <a href={user.url}>{user.username}</a>\n            </div>\n            <div className=\"user-card-title\">\n              <UserTitle rank={rank} title={user.title} />\n            </div>\n\n            <div className=\"user-card-stats\">\n              <Stats showStatus={showStatus} user={user} />\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"panel user-card user-card-preview\">\n        <div className=\"panel-body\">\n          <div className=\"row\">\n            <div className=\"col-xs-3 user-card-left\">\n              <div className=\"user-card-small-avatar\">\n                <span>\n                  <Avatar size=\"50\" size2x=\"80\" />\n                </span>\n              </div>\n            </div>\n            <div className=\"col-xs-9 col-sm-12 user-card-body\">\n              <div className=\"user-card-avatar\">\n                <span>\n                  <Avatar size=\"150\" size2x=\"200\" />\n                </span>\n              </div>\n\n              <div className=\"user-card-username\">\n                <span\n                  className=\"ui-preview-text\"\n                  style={{ width: random.int(60, 150) + \"px\" }}\n                >\n                  &nbsp;\n                </span>\n              </div>\n              <div className=\"user-card-title\">\n                <span\n                  className=\"ui-preview-text\"\n                  style={{ width: random.int(60, 150) + \"px\" }}\n                >\n                  &nbsp;\n                </span>\n              </div>\n\n              <div className=\"user-card-stats\">\n                <ul className=\"list-unstyled\">\n                  <li>\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 70) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                  </li>\n                  <li>\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 70) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                  </li>\n                  <li className=\"user-stat-divider\" />\n                  <li>\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 70) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                  </li>\n                  <li>\n                    <span\n                      className=\"ui-preview-text\"\n                      style={{ width: random.int(30, 70) + \"px\" }}\n                    >\n                      &nbsp;\n                    </span>\n                  </li>\n                </ul>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ colClassName, cols }) {\n  const list = Array.apply(null, { length: cols }).map(Number.call, Number)\n\n  return (\n    <div className=\"users-cards-list ui-preview\">\n      <div className=\"row\">\n        {list.map((i) => {\n          let className = colClassName\n          if (i !== 0) className += \" hidden-xs\"\n          if (i === 3) className += \" hidden-sm\"\n\n          return (\n            <div className={className} key={i}>\n              <Card />\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Card from \"./card\"\nimport Preview from \"./preview\"\n\nexport default function ({ cols, isReady, showStatus, users }) {\n  let colClassName = \"col-xs-12 col-sm-4\"\n  if (cols === 4) {\n    colClassName += \" col-md-3\"\n  }\n\n  if (!isReady) {\n    return <Preview colClassName={colClassName} cols={cols} />\n  }\n\n  return (\n    <div className=\"users-cards-list ui-ready\">\n      <div className=\"row\">\n        {users.map((user) => {\n          return (\n            <div className={colClassName} key={user.id}>\n              <Card showStatus={showStatus} user={user} />\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      dropdown: false,\n    }\n  }\n\n  toggleNav = () => {\n    this.setState({\n      dropdown: !this.state.dropdown,\n    })\n  }\n\n  hideNav = () => {\n    this.setState({\n      dropdown: false,\n    })\n  }\n\n  getCompactNavClassName() {\n    if (this.state.dropdown) {\n      return \"compact-nav open\"\n    } else {\n      return \"compact-nav\"\n    }\n  }\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getClassName() {\n    if (this.props.value) {\n      return \"btn btn-yes-no btn-yes-no-on\"\n    } else {\n      return \"btn btn-yes-no btn-yes-no-off\"\n    }\n  }\n\n  getIcon() {\n    if (!!this.props.value) {\n      return this.props.iconOn || \"check_box\"\n    } else {\n      return this.props.iconOff || \"check_box_outline_blank\"\n    }\n  }\n\n  getLabel() {\n    if (!!this.props.value) {\n      return this.props.labelOn || pgettext(\"yesno switch choice\", \"yes\")\n    } else {\n      return this.props.labelOff || pgettext(\"yesno switch choice\", \"no\")\n    }\n  }\n\n  toggle = () => {\n    this.props.onChange({\n      target: {\n        value: !this.props.value,\n      },\n    })\n  }\n\n  render() {\n    return (\n      <button\n        type=\"button\"\n        onClick={this.toggle}\n        className={this.getClassName()}\n        id={this.props.id || null}\n        aria-describedby={this.props[\"aria-describedby\"] || null}\n        disabled={this.props.disabled || false}\n      >\n        <span className=\"material-icon\">{this.getIcon()}</span>\n        <span className=\"btn-text\">{this.getLabel()}</span>\n      </button>\n    )\n  }\n}\n","export const locale = window.misago_locale || \"en-us\"\n\nexport const momentAgo = pgettext(\"time ago\", \"moment ago\")\nexport const momentAgoNarrow = pgettext(\"time ago\", \"now\")\nexport const dayAt = pgettext(\"day at time\", \"%(day)s at %(time)s\")\nexport const tomorrowAt = pgettext(\"day at time\", \"Tomorrow at %(time)s\")\nexport const yesterdayAt = pgettext(\"day at time\", \"Yesterday at %(time)s\")\n\nexport const minuteCompact = pgettext(\"short minutes\", \"%(time)sm\")\nexport const hourCompact = pgettext(\"short hours\", \"%(time)sh\")\nexport const dayCompact = pgettext(\"short days\", \"%(time)sd\")\n\nexport const relativeNumeric = new Intl.RelativeTimeFormat(locale, {\n  numeric: \"always\",\n  style: \"long\",\n})\n\nexport const relativeAuto = new Intl.RelativeTimeFormat(locale, {\n  numeric: \"auto\",\n  style: \"long\",\n})\n\nexport const fullDateTime = new Intl.DateTimeFormat(locale, {\n  dateStyle: \"full\",\n  timeStyle: \"medium\",\n})\n\nexport const thisYearDate = new Intl.DateTimeFormat(locale, {\n  month: \"long\",\n  day: \"numeric\",\n})\n\nexport const thisYearDateNarrow = new Intl.DateTimeFormat(locale, {\n  month: \"short\",\n  day: \"numeric\",\n})\n\nexport const otherYearDate = new Intl.DateTimeFormat(locale, {\n  year: \"numeric\",\n  month: \"long\",\n  day: \"numeric\",\n})\n\nexport const otherYearDateNarrow = new Intl.DateTimeFormat(locale, {\n  year: \"2-digit\",\n  month: \"short\",\n})\n\nexport const weekday = new Intl.DateTimeFormat(locale, {\n  weekday: \"long\",\n})\n\nexport const shortTime = new Intl.DateTimeFormat(locale, { timeStyle: \"short\" })\n\nexport function formatNarrow(date) {\n  const now = new Date()\n  const absDiff = Math.abs(Math.round((date - now) / 1000))\n\n  if (absDiff < 60) {\n    return momentAgoNarrow\n  }\n\n  if (absDiff < 60 * 55) {\n    const minutes = Math.ceil(absDiff / 60)\n    return minuteCompact.replace(\"%(time)s\", minutes)\n  }\n\n  if (absDiff < 3600 * 24) {\n    const hours = Math.ceil(absDiff / 3600)\n    return hourCompact.replace(\"%(time)s\", hours)\n  }\n\n  if (absDiff < 86400 * 7) {\n    const days = Math.ceil(absDiff / 86400)\n    return dayCompact.replace(\"%(time)s\", days)\n  }\n\n  if (date.getFullYear() === now.getFullYear()) {\n    return thisYearDateNarrow.format(date)\n  }\n\n  return otherYearDateNarrow.format(date)\n}\n\nexport function formatRelative(date) {\n  const now = new Date()\n  const diff = Math.round((date - now) / 1000)\n  const absDiff = Math.abs(diff)\n  const sign = diff < 1 ? -1 : 1\n\n  if (absDiff < 90) {\n    return momentAgo\n  }\n\n  if (absDiff < 60 * 47) {\n    const minutes = Math.ceil(absDiff / 60) * sign\n    return relativeNumeric.format(minutes, \"minute\")\n  }\n\n  if (absDiff < 3600 * 3) {\n    const hours = Math.ceil(absDiff / 3600) * sign\n    return relativeNumeric.format(hours, \"hour\")\n  }\n\n  if (isSameDay(now, date)) {\n    return shortTime.format(date)\n  }\n\n  if (isYesterday(date)) {\n    return yesterdayAt.replace(\"%(time)s\", shortTime.format(date))\n  }\n\n  if (isTomorrow(date)) {\n    return tomorrowAt.replace(\"%(time)s\", shortTime.format(date))\n  }\n\n  if (diff < 0 && absDiff < 3600 * 24 * 6) {\n    const day = weekday.format(date)\n    return formatDayAtTime(day, date)\n  }\n\n  if (now.getFullYear() == date.getFullYear()) {\n    return thisYearDate.format(date)\n  }\n\n  return otherYearDate.format(date)\n}\n\nexport function isSameDay(now, date) {\n  return (\n    now.getFullYear() == date.getFullYear() &&\n    now.getMonth() == date.getMonth() &&\n    now.getDate() == date.getDate()\n  )\n}\n\nexport function isYesterday(date) {\n  const yesterday = new Date()\n  yesterday.setDate(yesterday.getDate() - 1)\n  return isSameDay(yesterday, date)\n}\n\nexport function isTomorrow(date) {\n  const yesterday = new Date()\n  yesterday.setDate(yesterday.getDate() + 1)\n  return isSameDay(yesterday, date)\n}\n\nexport function formatDayAtTime(day, date) {\n  return dayAt\n    .replace(\"%(day)s\", day)\n    .replace(\"%(time)s\", shortTime.format(date))\n}\n","class OrderedList {\n  constructor(items) {\n    this.isOrdered = false\n    this._items = items || []\n  }\n\n  add(key, item, order) {\n    this._items.push({\n      key: key,\n      item: item,\n\n      after: order ? order.after || null : null,\n      before: order ? order.before || null : null,\n    })\n  }\n\n  get(key, value) {\n    for (var i = 0; i < this._items.length; i++) {\n      if (this._items[i].key === key) {\n        return this._items[i].item\n      }\n    }\n\n    return value\n  }\n\n  has(key) {\n    return this.get(key) !== undefined\n  }\n\n  values() {\n    var values = []\n    for (var i = 0; i < this._items.length; i++) {\n      values.push(this._items[i].item)\n    }\n    return values\n  }\n\n  order(values_only) {\n    if (!this.isOrdered) {\n      this._items = this._order(this._items)\n      this.isOrdered = true\n    }\n\n    if (values_only || typeof values_only === \"undefined\") {\n      return this.values()\n    } else {\n      return this._items\n    }\n  }\n\n  orderedValues() {\n    return this.order(true)\n  }\n\n  _order(unordered) {\n    // Index of unordered items\n    var index = []\n    unordered.forEach(function (item) {\n      index.push(item.key)\n    })\n\n    // Ordered items\n    var ordered = []\n    var ordering = []\n\n    // First pass: register items that\n    // don't specify their order\n    unordered.forEach(function (item) {\n      if (!item.after && !item.before) {\n        ordered.push(item)\n        ordering.push(item.key)\n      }\n    })\n\n    // Second pass: register items that\n    // specify their before to \"_end\"\n    unordered.forEach(function (item) {\n      if (item.before === \"_end\") {\n        ordered.push(item)\n        ordering.push(item.key)\n      }\n    })\n\n    // Third pass: keep iterating items\n    // until we hit iterations limit or finish\n    // ordering list\n    function insertItem(item) {\n      var insertAt = -1\n      if (ordering.indexOf(item.key) === -1) {\n        if (item.after) {\n          insertAt = ordering.indexOf(item.after)\n          if (insertAt !== -1) {\n            insertAt += 1\n          }\n        } else if (item.before) {\n          insertAt = ordering.indexOf(item.before)\n        }\n\n        if (insertAt !== -1) {\n          ordered.splice(insertAt, 0, item)\n          ordering.splice(insertAt, 0, item.key)\n        }\n      }\n    }\n\n    var iterations = 200\n    while (iterations > 0 && index.length !== ordering.length) {\n      iterations -= 1\n      unordered.forEach(insertItem)\n    }\n\n    return ordered\n  }\n}\n\nexport default OrderedList\n","import { formatRelative, fullDateTime } from \"./datetimeFormats\"\n\nconst cache = {}\n\nexport function startLiveTimestamps() {\n  document.querySelectorAll(\"[misago-timestamp]\").forEach(\n    element => {\n      const timestamp = element.getAttribute(\"misago-timestamp\")\n      if (!cache[timestamp]) {\n        cache[timestamp] = new Date(timestamp)\n      }\n\n      if (!element.hasAttribute(\"title\")) {\n        element.setAttribute(\"title\", fullDateTime.format(cache[timestamp]))\n      }\n\n      element.textContent = formatRelative(cache[timestamp])\n    }\n  )\n\n  updateLiveTimestamps()\n  window.setInterval(updateLiveTimestamps, 1000 * 55)\n}\n\nexport function updateLiveTimestamps() {\n  document.querySelectorAll(\"[misago-timestamp]\").forEach(\n    element => {\n      const timestamp = element.getAttribute(\"misago-timestamp\")\n      if (!cache[timestamp]) {\n        cache[timestamp] = new Date(timestamp)\n      }\n\n      element.textContent = formatRelative(cache[timestamp])\n    }\n  )\n}","import \"bootstrap/js/transition\"\nimport \"bootstrap/js/affix\"\nimport \"bootstrap/js/modal\"\nimport \"bootstrap/js/dropdown\"\nimport \"at-js\"\nimport \"cropit\"\nimport \"jquery-caret\"\nimport OrderedList from \"misago/utils/ordered-list\"\nimport \"misago/style/index.less\"\nimport {startLiveTimestamps} from \"./liveTimestamps\"\n\nexport class Misago {\n  constructor() {\n    this._initializers = []\n    this._context = {}\n  }\n\n  addInitializer(initializer) {\n    this._initializers.push({\n      key: initializer.name,\n\n      item: initializer.initializer,\n\n      after: initializer.after,\n      before: initializer.before,\n    })\n  }\n\n  init(context) {\n    this._context = context\n\n    var initOrder = new OrderedList(this._initializers).orderedValues()\n    initOrder.forEach((initializer) => {\n      initializer(this)\n    })\n  }\n\n  // context accessors\n  has(key) {\n    return !!this._context[key]\n  }\n\n  get(key, fallback) {\n    if (this.has(key)) {\n      return this._context[key]\n    } else {\n      return fallback || undefined\n    }\n  }\n\n  pop(key) {\n    if (this.has(key)) {\n      let value = this._context[key]\n      this._context[key] = null\n      return value\n    } else {\n      return undefined\n    }\n  }\n}\n\n// create  singleton\nvar misago = new Misago()\n\n// expose it globally\nwindow.misago = misago\n\n// and export it for tests and stuff\nexport default misago\n\nstartLiveTimestamps()","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\n\nexport default function initializer() {\n  ajax.init(misago.get(\"CSRF_COOKIE_NAME\"))\n}\n\nmisago.addInitializer({\n  name: \"ajax\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst AUTH_SYNC_RATE = 45 // sync user with backend every 45 seconds\n\nexport default function initializer(context) {\n  if (context.get(\"isAuthenticated\")) {\n    window.setInterval(function () {\n      ajax.get(context.get(\"AUTH_API\")).then(\n        function (data) {\n          store.dispatch(patch(data))\n        },\n        function (rejection) {\n          snackbar.apiError(rejection)\n        }\n      )\n    }, AUTH_SYNC_RATE * 1000)\n  }\n}\n\nmisago.addInitializer({\n  name: \"auth-sync\",\n  initializer: initializer,\n  after: \"auth\",\n})\n","import misago from \"misago/index\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n  auth.init(store, storage, modal)\n}\n\nmisago.addInitializer({\n  name: \"auth\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport captcha from \"misago/services/captcha\"\nimport include from \"misago/services/include\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer(context) {\n  captcha.init(context, ajax, include, snackbar)\n}\n\nmisago.addInitializer({\n  name: \"captcha\",\n  initializer: initializer,\n})\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class AcceptAgreement extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = { submiting: false }\n  }\n\n  handleDecline = () => {\n    if (this.state.submiting) return\n\n    const confirmation = window.confirm(\n      pgettext(\n        \"accept agreement prompt\",\n        \"Declining will result in immediate deactivation and deletion of your account. This action is not reversible.\"\n      )\n    )\n    if (!confirmation) return\n\n    this.setState({ submiting: true })\n\n    ajax.post(this.props.api, { accept: false }).then(() => {\n      window.location.reload(true)\n    })\n  }\n\n  handleAccept = () => {\n    if (this.state.submiting) return\n\n    this.setState({ submiting: true })\n\n    ajax.post(this.props.api, { accept: true }).then(() => {\n      window.location.reload(true)\n    })\n  }\n\n  render() {\n    return (\n      <div>\n        <button\n          className=\"btn btn-default\"\n          disabled={this.state.submiting}\n          type=\"buton\"\n          onClick={this.handleDecline}\n        >\n          {pgettext(\"accept agreement choice\", \"Decline\")}\n        </button>\n        <button\n          className=\"btn btn-primary\"\n          disabled={this.state.submiting}\n          type=\"buton\"\n          onClick={this.handleAccept}\n        >\n          {pgettext(\"accept agreement choice\", \"Accept and continue\")}\n        </button>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport AcceptAgreement from \"misago/components/accept-agreement\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n  if (document.getElementById(\"required-agreement-mount\")) {\n    mount(\n      <AcceptAgreement api={context.get(\"REQUIRED_AGREEMENT_API\")} />,\n      \"required-agreement-mount\",\n      false\n    )\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:accept-agreement\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\n\nexport default class extends React.Component {\n  refresh() {\n    window.location.reload()\n  }\n\n  getMessage() {\n    if (this.props.signedIn) {\n      return interpolate(\n        pgettext(\n          \"auth message\",\n          \"You have signed in as %(username)s. Please refresh the page before continuing.\"\n        ),\n        { username: this.props.signedIn.username },\n        true\n      )\n    } else if (this.props.signedOut) {\n      return interpolate(\n        pgettext(\n          \"auth message\",\n          \"%(username)s, you have been signed out. Please refresh the page before continuing.\"\n        ),\n        { username: this.props.user.username },\n        true\n      )\n    }\n  }\n\n  render() {\n    let className = \"auth-message\"\n    if (this.props.signedIn || this.props.signedOut) {\n      className += \" show\"\n    }\n\n    return (\n      <div className={className}>\n        <div className=\"container\">\n          <p className=\"lead\">{this.getMessage()}</p>\n          <p>\n            <button\n              className=\"btn btn-default\"\n              type=\"button\"\n              onClick={this.refresh}\n            >\n              {pgettext(\"auth message\", \"Reload page\")}\n            </button>\n            <span className=\"hidden-xs hidden-sm\">\n              {\" \" + pgettext(\"auth message\", \"or press F5 key.\")}\n            </span>\n          </p>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function select(state) {\n  return {\n    user: state.auth.user,\n    signedIn: state.auth.signedIn,\n    signedOut: state.auth.signedOut,\n  }\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport AuthMessage, { select } from \"misago/components/auth-message\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n  mount(connect(select)(AuthMessage), \"auth-message-mount\")\n}\n\nmisago.addInitializer({\n  name: \"component:auth-message\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport default function initializer(context) {\n  if (context.has(\"BAN_MESSAGE\")) {\n    showBannedPage(context.get(\"BAN_MESSAGE\"), false)\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:banmed-page\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport modal from \"../services/modal\"\nimport SignInModal from \"./sign-in\"\n\nclass SignInModalAutoOpen extends React.Component {\n  componentDidMount() {\n    const query = window.document.location.search\n    if (query === \"?modal=login\") {\n      window.setTimeout(() => modal.show(<SignInModal />), 300)\n    }\n  }\n\n  render() {\n    return null\n  }\n}\n\nexport default SignInModalAutoOpen\n","import React from \"react\"\n\nexport default function NavbarBranding({ logo, logoXs, text, url }) {\n  if (logo) {\n    return (\n      <div className=\"navbar-branding\">\n        <a href={url} className=\"navbar-branding-logo\">\n          <img src={logo} alt={text} />\n        </a>\n      </div>\n    )\n  }\n\n  return (\n    <div className=\"navbar-branding\">\n      {!!logoXs && (\n        <a href={url} className=\"navbar-branding-logo-xs\">\n          <img src={logoXs} alt={text} />\n        </a>\n      )}\n      {!!text && (\n        <a href={url} className=\"navbar-branding-text\">\n          {text}\n        </a>\n      )}\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function NavbarExtraMenu({ items }) {\n  return (\n    <ul className=\"navbar-extra-menu\" role=\"nav\">\n      {items.map((item, index) => (\n        <li key={index} className={item.className}>\n          <a\n            href={item.url}\n            target={item.targetBlank ? \"_blank\" : null}\n            rel={item.rel}\n          >\n            {item.title}\n          </a>\n        </li>\n      ))}\n    </ul>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownHeader, DropdownPills } from \"../Dropdown\"\n\nexport default function NotificationsDropdownBody({\n  children,\n  showAll,\n  showUnread,\n  unread,\n}) {\n  return (\n    <div className=\"notifications-dropdown-body\">\n      <DropdownHeader>\n        {pgettext(\"notifications title\", \"Notifications\")}\n      </DropdownHeader>\n      <DropdownPills>\n        <NotificationsDropdownBodyPill active={!unread} onClick={showAll}>\n          {pgettext(\"notifications dropdown\", \"All\")}\n        </NotificationsDropdownBodyPill>\n        <NotificationsDropdownBodyPill active={unread} onClick={showUnread}>\n          {pgettext(\"notifications dropdown\", \"Unread\")}\n        </NotificationsDropdownBodyPill>\n      </DropdownPills>\n      {children}\n      <DropdownFooter>\n        <a\n          className=\"btn btn-default btn-block\"\n          href={misago.get(\"NOTIFICATIONS_URL\")}\n        >\n          {pgettext(\"notifications\", \"See all notifications\")}\n        </a>\n      </DropdownFooter>\n    </div>\n  )\n}\n\nfunction NotificationsDropdownBodyPill({ active, children, onClick }) {\n  return (\n    <button\n      className={classnames(\"btn\", {\n        \"btn-primary\": active,\n        \"btn-default\": !active,\n      })}\n      type=\"button\"\n      onClick={onClick}\n    >\n      {children}\n    </button>\n  )\n}\n","import NotificationsDropdown from \"./NotificationsDropdown\"\n\nexport default NotificationsDropdown\n","import React from \"react\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n  NotificationsList,\n  NotificationsListError,\n  NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsDropdownBody from \"./NotificationsDropdownBody\"\n\nexport default class NotificationsDropdown extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      unread: false,\n      url: \"\",\n    }\n  }\n\n  getApiUrl() {\n    let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n    url += this.state.unread ? \"&filter=unread\" : \"\"\n    return url\n  }\n\n  render = () => (\n    <NotificationsDropdownBody\n      unread={this.state.unread}\n      showAll={() => this.setState({ unread: false })}\n      showUnread={() => this.setState({ unread: true })}\n    >\n      <NotificationsFetch\n        filter={this.state.unread ? \"unread\" : \"all\"}\n        disabled={!this.props.active}\n      >\n        {({ data, loading, error }) => {\n          if (loading) {\n            return <NotificationsListLoading />\n          }\n\n          if (error) {\n            return <NotificationsListError error={error} />\n          }\n\n          return (\n            <NotificationsList\n              filter={this.state.unread ? \"unread\" : \"all\"}\n              items={data ? data.results : []}\n            />\n          )\n        }}\n      </NotificationsFetch>\n    </NotificationsDropdownBody>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarNotificationsToggle({\n  id,\n  className,\n  badge,\n  url,\n  active,\n  onClick,\n}) {\n  const title = !!badge\n    ? pgettext(\"navbar\", \"You have unread notifications!\")\n    : pgettext(\"navbar\", \"Open notifications\")\n\n  return (\n    <a\n      id={id}\n      className={classnames(\"btn btn-navbar-icon\", className, { active })}\n      href={url}\n      title={title}\n      onClick={onClick}\n    >\n      {!!badge && <span className=\"navbar-item-badge\">{badge}</span>}\n      <span className=\"material-icon\">\n        {!!badge ? \"notifications_active\" : \"notifications_none\"}\n      </span>\n    </a>\n  )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NotificationsDropdown from \"../NotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\n\nexport default function NavbarNotificationsDropdown({\n  id,\n  className,\n  badge,\n  url,\n}) {\n  return (\n    <Dropdown\n      id={id}\n      toggle={({ isOpen, toggle }) => (\n        <NavbarNotificationsToggle\n          className={className}\n          active={isOpen}\n          badge={badge}\n          url={url}\n          onClick={(event) => {\n            event.preventDefault()\n            toggle()\n          }}\n        />\n      )}\n      menuClassName=\"notifications-dropdown\"\n      menuAlignRight\n    >\n      {({ isOpen }) => <NotificationsDropdown active={isOpen} />}\n    </Dropdown>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarPrivateThreads({\n  id,\n  className,\n  badge,\n  url,\n  active,\n  onClick,\n}) {\n  const title = !!badge\n    ? pgettext(\"navbar\", \"You have unread private threads!\")\n    : pgettext(\"navbar\", \"Open private threads\")\n\n  return (\n    <a\n      id={id}\n      className={classnames(\"btn btn-navbar-icon\", className, { active })}\n      href={url}\n      title={title}\n      onClick={onClick}\n    >\n      {!!badge && <span className=\"navbar-item-badge\">{badge}</span>}\n      <span className=\"material-icon\">inbox</span>\n    </a>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSearchToggle({\n  id,\n  className,\n  url,\n  active,\n  onClick,\n}) {\n  return (\n    <a\n      id={id}\n      className={classnames(\"btn btn-navbar-icon\", className, { active })}\n      href={url}\n      title={pgettext(\"navbar\", \"Open search\")}\n      onClick={onClick}\n    >\n      <span className=\"material-icon\">search</span>\n    </a>\n  )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport { SearchDropdown } from \"../Search\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\n\nexport default function NavbarSearchDropdown({ id, className, url }) {\n  return (\n    <Dropdown\n      id={id}\n      toggle={({ isOpen, toggle }) => (\n        <NavbarSearchToggle\n          className={className}\n          active={isOpen}\n          url={url}\n          onClick={(event) => {\n            event.preventDefault()\n            toggle()\n\n            window.setTimeout(() => {\n              document\n                .querySelector(\".search-dropdown .form-control-search\")\n                .focus()\n            }, 0)\n          }}\n        />\n      )}\n      menuClassName=\"search-dropdown\"\n      menuAlignRight\n    >\n      {() => <SearchDropdown />}\n    </Dropdown>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nexport default function NavbarSiteNavToggle({\n  id,\n  className,\n  active,\n  onClick,\n}) {\n  return (\n    <button\n      id={id}\n      className={classnames(\"btn btn-navbar-icon\", className, { active })}\n      title={pgettext(\"navbar\", \"Open menu\")}\n      type=\"button\"\n      onClick={onClick}\n    >\n      <span className=\"material-icon\">menu</span>\n    </button>\n  )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport { SiteNavDropdown } from \"../SiteNav\"\n\nexport default function NavbarSiteNavDropdown({ id, className }) {\n  return (\n    <Dropdown\n      id={id}\n      toggle={({ isOpen, toggle }) => (\n        <NavbarSiteNavToggle\n          className={className}\n          active={isOpen}\n          onClick={toggle}\n        />\n      )}\n      menuClassName=\"site-nav-dropdown\"\n      menuAlignRight\n    >\n      {({ isOpen, close }) => <SiteNavDropdown close={close} />}\n    </Dropdown>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Avatar from \"../avatar\"\n\nexport default function NavbarUserNavToggle({\n  id,\n  className,\n  user,\n  active,\n  onClick,\n}) {\n  return (\n    <a\n      id={id}\n      className={classnames(\"btn-navbar-image\", className, { active })}\n      href={user.url}\n      title={pgettext(\"navbar\", \"Open your options\")}\n      onClick={onClick}\n    >\n      <Avatar user={user} size={34} />\n    </a>\n  )\n}\n","import React from \"react\"\nimport { Dropdown } from \"../Dropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\nimport { UserNavDropdown } from \"../UserNav\"\n\nexport default function NavbarUserNavDropdown({ id, className, user }) {\n  return (\n    <Dropdown\n      id={id}\n      toggle={({ isOpen, toggle }) => (\n        <NavbarUserNavToggle\n          className={className}\n          active={isOpen}\n          user={user}\n          onClick={(event) => {\n            event.preventDefault()\n            toggle()\n          }}\n        />\n      )}\n      menuClassName=\"user-nav-dropdown\"\n      menuAlignRight\n    >\n      {({ isOpen, close }) => <UserNavDropdown close={close} />}\n    </Dropdown>\n  )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport * as overlay from \"../../reducers/overlay\"\nimport RegisterButton from \"../RegisterButton\"\nimport SignInButton from \"../SignInButton\"\nimport SignInModalAutoOpen from \"../SignInModalAutoOpen\"\nimport NavbarBranding from \"./NavbarBranding\"\nimport NavbarExtraMenu from \"./NavbarExtraMenu\"\nimport NavbarNotificationsDropdown from \"./NavbarNotificationsDropdown\"\nimport NavbarNotificationsToggle from \"./NavbarNotificationsToggle\"\nimport NavbarPrivateThreads from \"./NavbarPrivateThreads\"\nimport NavbarSearchDropdown from \"./NavbarSearchDropdown\"\nimport NavbarSearchToggle from \"./NavbarSearchToggle\"\nimport NavbarSiteNavDropdown from \"./NavbarSiteNavDropdown\"\nimport NavbarSiteNavToggle from \"./NavbarSiteNavToggle\"\nimport NavbarUserNavDropdown from \"./NavbarUserNavDropdown\"\nimport NavbarUserNavToggle from \"./NavbarUserNavToggle\"\n\nexport function Navbar({\n  dispatch,\n  branding,\n  extraMenuItems,\n  authDelegated,\n  user,\n  searchUrl,\n  notificationsUrl,\n  privateThreadsUrl,\n  showSearch,\n  showPrivateThreads,\n}) {\n  return (\n    <div className=\"container navbar-container\">\n      <NavbarBranding {...branding} />\n      <div className=\"navbar-right\">\n        {extraMenuItems.length > 0 && (\n          <NavbarExtraMenu items={extraMenuItems} />\n        )}\n        {!!showSearch && (\n          <NavbarSearchDropdown id=\"navbar-search-dropdown\" url={searchUrl} />\n        )}\n        {!!showSearch && (\n          <NavbarSearchToggle\n            id=\"navbar-search-overlay\"\n            url={searchUrl}\n            onClick={(event) => {\n              dispatch(overlay.openSearch())\n              event.preventDefault()\n            }}\n          />\n        )}\n        <NavbarSiteNavDropdown id=\"navbar-site-nav-dropdown\" />\n        <NavbarSiteNavToggle\n          id=\"navbar-site-nav-overlay\"\n          onClick={() => {\n            dispatch(overlay.openSiteNav())\n          }}\n        />\n        {!!showPrivateThreads && (\n          <NavbarPrivateThreads\n            id=\"navbar-private-threads\"\n            badge={user.unreadPrivateThreads}\n            url={privateThreadsUrl}\n          />\n        )}\n        {!!user && (\n          <NavbarNotificationsDropdown\n            id=\"navbar-notifications-dropdown\"\n            badge={user.unreadNotifications}\n            url={notificationsUrl}\n          />\n        )}\n        {!!user && (\n          <NavbarNotificationsToggle\n            id=\"navbar-notifications-overlay\"\n            badge={user.unreadNotifications}\n            url={notificationsUrl}\n            onClick={(event) => {\n              dispatch(overlay.openNotifications())\n              event.preventDefault()\n            }}\n          />\n        )}\n        {!!user && (\n          <NavbarUserNavDropdown id=\"navbar-user-nav-dropdown\" user={user} />\n        )}\n        {!!user && (\n          <NavbarUserNavToggle\n            id=\"navbar-user-nav-overlay\"\n            user={user}\n            onClick={(event) => {\n              dispatch(overlay.openUserNav())\n              event.preventDefault()\n            }}\n          />\n        )}\n        {!user && <SignInButton className=\"btn-navbar-sign-in\" />}\n        {!user && !authDelegated && (\n          <RegisterButton className=\"btn-navbar-register\" />\n        )}\n        {!user && !authDelegated && <SignInModalAutoOpen />}\n      </div>\n    </div>\n  )\n}\n\nfunction select(state) {\n  const settings = misago.get(\"SETTINGS\")\n  const user = state.auth.user\n\n  return {\n    branding: {\n      logo: settings.logo,\n      logoXs: settings.logo_small,\n      text: settings.logo_text,\n      url: misago.get(\"MISAGO_PATH\"),\n    },\n    extraMenuItems: misago.get(\"extraMenuItems\"),\n\n    user: !user.id\n      ? null\n      : {\n          id: user.id,\n          username: user.username,\n          email: user.email,\n          avatars: user.avatars,\n          unreadNotifications: user.unreadNotifications,\n          unreadPrivateThreads: user.unread_private_threads,\n          url: user.url,\n        },\n\n    searchUrl: misago.get(\"SEARCH_URL\"),\n    notificationsUrl: misago.get(\"NOTIFICATIONS_URL\"),\n    privateThreadsUrl: misago.get(\"PRIVATE_THREADS_URL\"),\n\n    authDelegated: settings.enable_oauth2_client,\n    showSearch: !!user.acl.can_search,\n    showPrivateThreads: !!user && !!user.acl.can_use_private_threads,\n  }\n}\n\nconst NavbarConnected = connect(select)(Navbar)\n\nexport default NavbarConnected\n","import Navbar from \"./Navbar\"\n\nexport default Navbar\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Navbar from \"../../components/Navbar\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  const root = document.getElementById(\"misago-navbar\")\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <Navbar />\n    </Provider>,\n    root\n  )\n}\n\nmisago.addInitializer({\n  name: \"component:navbar\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { DropdownFooter, DropdownPills } from \"../Dropdown\"\nimport { Overlay, OverlayHeader } from \"../Overlay\"\n\nexport default function NotificationsOverlayBody({\n  children,\n  open,\n  showAll,\n  showUnread,\n  unread,\n}) {\n  return (\n    <Overlay open={open}>\n      <OverlayHeader>\n        {pgettext(\"notifications title\", \"Notifications\")}\n      </OverlayHeader>\n      <DropdownPills>\n        <NotificationsOverlayBodyPill active={!unread} onClick={showAll}>\n          {pgettext(\"notifications dropdown\", \"All\")}\n        </NotificationsOverlayBodyPill>\n        <NotificationsOverlayBodyPill active={unread} onClick={showUnread}>\n          {pgettext(\"notifications dropdown\", \"Unread\")}\n        </NotificationsOverlayBodyPill>\n      </DropdownPills>\n      {children}\n      <DropdownFooter>\n        <a\n          className=\"btn btn-default btn-block\"\n          href={misago.get(\"NOTIFICATIONS_URL\")}\n        >\n          {pgettext(\"notifications\", \"See all notifications\")}\n        </a>\n      </DropdownFooter>\n    </Overlay>\n  )\n}\n\nfunction NotificationsOverlayBodyPill({ active, children, onClick }) {\n  return (\n    <button\n      className={classnames(\"btn\", {\n        \"btn-primary\": active,\n        \"btn-default\": !active,\n      })}\n      type=\"button\"\n      onClick={onClick}\n    >\n      {children}\n    </button>\n  )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport {\n  NotificationsList,\n  NotificationsListError,\n  NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsOverlayBody from \"./NotificationsOverlayBody\"\n\nclass NotificationsOverlay extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.body = document.body\n\n    this.state = {\n      unread: false,\n      url: \"\",\n    }\n  }\n\n  getApiUrl() {\n    let url = misago.get(\"NOTIFICATIONS_API\") + \"?limit=20\"\n    url += this.state.unread ? \"&filter=unread\" : \"\"\n    return url\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    if (prevProps.open !== this.props.open) {\n      if (this.props.open) {\n        this.body.classList.add(\"notifications-fullscreen\")\n      } else {\n        this.body.classList.remove(\"notifications-fullscreen\")\n      }\n    }\n  }\n\n  render = () => (\n    <NotificationsOverlayBody\n      open={this.props.open}\n      unread={this.state.unread}\n      showAll={() => this.setState({ unread: false })}\n      showUnread={() => this.setState({ unread: true })}\n    >\n      <NotificationsFetch\n        filter={this.state.unread ? \"unread\" : \"all\"}\n        disabled={!this.props.open}\n      >\n        {({ data, loading, error }) => {\n          if (loading) {\n            return <NotificationsListLoading />\n          }\n\n          if (error) {\n            return <NotificationsListError error={error} />\n          }\n\n          return (\n            <NotificationsList\n              filter={this.state.unread ? \"unread\" : \"all\"}\n              items={data ? data.results : []}\n            />\n          )\n        }}\n      </NotificationsFetch>\n    </NotificationsOverlayBody>\n  )\n}\n\nfunction select(state) {\n  return { open: state.overlay.notifications }\n}\n\nconst NotificationsOverlayConnected = connect(select)(NotificationsOverlay)\n\nexport default NotificationsOverlayConnected\n","import NotificationsOverlay from \"./NotificationsOverlay\"\n\nexport default NotificationsOverlay\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport NotificationsOverlay from \"../../components/NotificationsOverlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  if (context.get(\"isAuthenticated\")) {\n    const root = document.getElementById(\"notifications-mount\")\n    ReactDOM.render(\n      <Provider store={store.getStore()}>\n        <NotificationsOverlay />\n      </Provider>,\n      root\n    )\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:notifications-overlay\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport { PageHeaderPlain } from \"../PageHeader\"\n\nexport default function NotificationsHeader() {\n  return (\n    <PageHeaderPlain\n      header={pgettext(\"notifications title\", \"Notifications\")}\n      styleName=\"notifications\"\n    />\n  )\n}\n","import PageTitle from \"./PageTitle\"\n\nexport default PageTitle\n","export default function PageTitle({ title, subtitle }) {\n  const parts = []\n  if (subtitle) {\n    parts.push(subtitle)\n  }\n  if (title) {\n    parts.push(title)\n  }\n  parts.push(misago.get(\"SETTINGS\").forum_name)\n\n  document.title = parts.join(\" | \")\n  return null\n}\n","import React from \"react\"\n\nexport default function PillsNav({ children }) {\n  return <ul className=\"nav nav-pills\">{children}</ul>\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function PillsNavLink({ active, link, icon, children }) {\n  return (\n    <li className={classnames({ active })}>\n      <Link to={link} activeClassName=\"\">\n        {!!icon && <span className=\"material-icon\">{icon}</span>}\n        {children}\n      </Link>\n    </li>\n  )\n}\n","import React from \"react\"\nimport { PillsNav, PillsNavLink } from \"../PillsNav\"\nimport { Toolbar, ToolbarSection, ToolbarItem } from \"../Toolbar\"\n\nexport default function NotificationsPills({ filter }) {\n  const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n  return (\n    <Toolbar>\n      <ToolbarSection auto>\n        <ToolbarItem>\n          <PillsNav>\n            <PillsNavLink active={filter === \"all\"} link={basename}>\n              {pgettext(\"notifications nav\", \"All\")}\n            </PillsNavLink>\n            <PillsNavLink\n              active={filter === \"unread\"}\n              link={basename + \"unread/\"}\n            >\n              {pgettext(\"notifications nav\", \"Unread\")}\n            </PillsNavLink>\n            <PillsNavLink active={filter === \"read\"} link={basename + \"read/\"}>\n              {pgettext(\"notifications nav\", \"Read\")}\n            </PillsNavLink>\n          </PillsNav>\n        </ToolbarItem>\n      </ToolbarSection>\n    </Toolbar>\n  )\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function NotificationsPagination({ baseUrl, data, disabled }) {\n  return (\n    <div className=\"misago-pagination\">\n      <NotificationsPaginationLink\n        url={baseUrl}\n        disabled={disabled || !data || !data.hasPrevious}\n      >\n        {pgettext(\"notifications pagination\", \"Latest\")}\n      </NotificationsPaginationLink>\n      <NotificationsPaginationLink\n        url={baseUrl + \"?before=\" + (data ? data.firstCursor : \"\")}\n        disabled={disabled || !data || !data.hasPrevious}\n      >\n        {pgettext(\"notifications pagination\", \"Newer\")}\n      </NotificationsPaginationLink>\n      <NotificationsPaginationLink\n        url={baseUrl + \"?after=\" + (data ? data.lastCursor : \"\")}\n        disabled={disabled || !data || !data.hasNext}\n      >\n        {pgettext(\"notifications pagination\", \"Older\")}\n      </NotificationsPaginationLink>\n    </div>\n  )\n}\n\nfunction NotificationsPaginationLink({ disabled, children, url }) {\n  if (disabled) {\n    return (\n      <button className=\"btn btn-default\" type=\"disabled\" disabled>\n        {children}\n      </button>\n    )\n  }\n\n  return (\n    <Link to={url} className=\"btn btn-default\" activeClassName=\"\">\n      {children}\n    </Link>\n  )\n}\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarSection, ToolbarItem, ToolbarSpacer } from \"../Toolbar\"\nimport NotificationsPagination from \"./NotificationsPagination\"\n\nexport default function NotificationsToolbar({\n  baseUrl,\n  data,\n  disabled,\n  bottom,\n  markAllAsRead,\n}) {\n  return (\n    <Toolbar>\n      <ToolbarSection>\n        <ToolbarItem>\n          <NotificationsPagination\n            baseUrl={baseUrl}\n            data={data}\n            disabled={disabled}\n          />\n        </ToolbarItem>\n      </ToolbarSection>\n      <ToolbarSpacer />\n      <ToolbarSection className={classnames({ \"hidden-xs\": !bottom })}>\n        <ToolbarItem>\n          <Button\n            className=\"btn-default btn-block\"\n            type=\"button\"\n            disabled={disabled || !data || !data.unreadNotifications}\n            onClick={markAllAsRead}\n          >\n            <span className=\"material-icon\">done_all</span>\n            {pgettext(\"notifications\", \"Mark all as read\")}\n          </Button>\n        </ToolbarItem>\n      </ToolbarSection>\n    </Toolbar>\n  )\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { updateAuthenticatedUser } from \"../../reducers/auth\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport NotificationsFetch from \"../NotificationsFetch\"\nimport PageTitle from \"../PageTitle\"\nimport PageContainer from \"../PageContainer\"\nimport {\n  NotificationsList,\n  NotificationsListError,\n  NotificationsListLoading,\n} from \"../NotificationsList\"\nimport NotificationsPills from \"./NotificationsPills\"\nimport NotificationsToolbar from \"./NotificationsToolbar\"\n\nfunction NotificationsRoute({ dispatch, location, route }) {\n  const { query } = location\n  const { filter } = route.props\n\n  const baseUrl = getBaseUrl(filter)\n\n  return (\n    <PageContainer>\n      <PageTitle\n        title={pgettext(\"notifications title\", \"Notifications\")}\n        subtitle={getSubtitle(filter)}\n      />\n\n      <NotificationsPills filter={filter} />\n\n      <NotificationsFetch filter={filter} query={query}>\n        {({ data, loading, error, refetch }) => (\n          <ApiMutation url={misago.get(\"NOTIFICATIONS_API\") + \"read-all/\"}>\n            {(readAll, { loading: mutating }) => {\n              const toolbarProps = {\n                baseUrl,\n                data,\n                disabled:\n                  loading || mutating || !data || data.results.length === 0,\n                markAllAsRead: async () => {\n                  const confirmed = window.confirm(\n                    pgettext(\"notifications\", \"Mark all notifications as read?\")\n                  )\n\n                  if (confirmed) {\n                    readAll({\n                      onSuccess: async () => {\n                        refetch()\n                        dispatch(\n                          updateAuthenticatedUser({ unreadNotifications: null })\n                        )\n                        snackbar.success(\n                          pgettext(\n                            \"notifications\",\n                            \"All notifications have been marked as read.\"\n                          )\n                        )\n                      },\n                      onError: snackbar.apiError,\n                    })\n                  }\n                },\n              }\n\n              if (loading || mutating) {\n                return (\n                  <div>\n                    <NotificationsToolbar {...toolbarProps} />\n                    <NotificationsListLoading />\n                    <NotificationsToolbar {...toolbarProps} bottom />\n                  </div>\n                )\n              }\n\n              if (error) {\n                return (\n                  <div>\n                    <NotificationsToolbar {...toolbarProps} />\n                    <NotificationsListError error={error} />\n                    <NotificationsToolbar {...toolbarProps} bottom />\n                  </div>\n                )\n              }\n\n              if (data) {\n                if (!data.hasPrevious && query) {\n                  window.history.replaceState({}, \"\", baseUrl)\n                }\n\n                return (\n                  <div>\n                    <NotificationsToolbar {...toolbarProps} />\n                    <NotificationsList\n                      filter={filter}\n                      items={data.results}\n                      hasNext={data.hasNext}\n                      hasPrevious={data.hasPrevious}\n                    />\n                    <NotificationsToolbar {...toolbarProps} bottom />\n                  </div>\n                )\n              }\n\n              return null\n            }}\n          </ApiMutation>\n        )}\n      </NotificationsFetch>\n    </PageContainer>\n  )\n}\n\nfunction getSubtitle(filter) {\n  if (filter === \"unread\") {\n    return pgettext(\"notifications title\", \"Unread notifications\")\n  } else if (filter === \"read\") {\n    return pgettext(\"notifications title\", \"Read notifications\")\n  } else {\n    return null\n  }\n}\n\nfunction getBaseUrl(filter) {\n  let url = misago.get(\"NOTIFICATIONS_URL\")\n  if (filter !== \"all\") {\n    url += filter + \"/\"\n  }\n  return url\n}\n\nconst NotificationsRouteConnected = connect()(NotificationsRoute)\n\nexport default NotificationsRouteConnected\n","import Notifications from \"./Notifications\"\nimport NotificationsFetch from \"../NotificationsFetch/NotificationsFetch\"\n\nexport default Notifications\n\nexport { NotificationsFetch }\n","import React from \"react\"\nimport { Router, browserHistory } from \"react-router\"\nimport NotificationsHeader from \"./NotificationsHeader\"\nimport NotificationsRoute from \"./NotificationsRoute\"\n\nexport default function Notifications() {\n  const basename = misago.get(\"NOTIFICATIONS_URL\")\n\n  return (\n    <div className=\"page page-notifications\">\n      <NotificationsHeader />\n      <Router\n        history={browserHistory}\n        routes={[\n          {\n            path: basename,\n            component: NotificationsRoute,\n            props: {\n              filter: \"all\",\n            },\n          },\n          {\n            path: basename + \"unread/\",\n            component: NotificationsRoute,\n            props: {\n              filter: \"unread\",\n            },\n          },\n          {\n            path: basename + \"read/\",\n            component: NotificationsRoute,\n            props: {\n              filter: \"read\",\n            },\n          },\n        ]}\n      />\n    </div>\n  )\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport Notifications from \"../../components/Notifications\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  const basename = misago.get(\"NOTIFICATIONS_URL\")\n  if (\n    document.location.pathname.startsWith(basename) &&\n    !document.location.pathname.startsWith(basename + \"disable-email/\") &&\n    context.get(\"isAuthenticated\")\n  ) {\n    const root = document.getElementById(\"page-mount\")\n    ReactDOM.render(\n      <Provider store={store.getStore()}>\n        <Notifications />\n      </Provider>,\n      root\n    )\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:notifications\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nexport function SideNav(props) {\n  return (\n    <div className=\"list-group nav-side\">\n      {props.options.map((option) => {\n        return (\n          <Link\n            to={props.baseUrl + option.component + \"/\"}\n            className=\"list-group-item\"\n            activeClassName=\"active\"\n            key={option.component}\n          >\n            <span className=\"material-icon\">{option.icon}</span>\n            {option.name}\n          </Link>\n        )\n      })}\n    </div>\n  )\n}\n\nexport function CompactNav(props) {\n  return (\n    <ul className={props.className || \"dropdown-menu\"} role=\"menu\">\n      {props.options.map((option) => {\n        return (\n          <Li\n            path={props.baseUrl + option.component + \"/\"}\n            key={option.component}\n          >\n            <Link\n              to={props.baseUrl + option.component + \"/\"}\n              onClick={props.hideNav}\n            >\n              <span className=\"material-icon hidden-sm\">{option.icon}</span>\n              {option.name}\n            </Link>\n          </Li>\n        )\n      })}\n    </ul>\n  )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      password: \"\",\n    }\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"delete your account title\", \"Delete account\"),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n  }\n\n  onPasswordChange = (event) => {\n    this.setState({ password: event.target.value })\n  }\n\n  handleSubmit = (event) => {\n    event.preventDefault()\n\n    const { isLoading, password } = this.state\n    const { user } = this.props\n\n    if (password.length == 0) {\n      snackbar.error(pgettext(\"delete your account form\", \"Complete the form.\"))\n      return false\n    }\n\n    if (isLoading) return false\n    this.setState({ isLoading: true })\n\n    ajax.post(user.api.delete, { password }).then(\n      (success) => {\n        window.location.href = misago.get(\"MISAGO_PATH\")\n      },\n      (rejection) => {\n        this.setState({ isLoading: false })\n        if (rejection.password) {\n          snackbar.error(rejection.password[0])\n        } else {\n          snackbar.apiError(rejection)\n        }\n      }\n    )\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"panel panel-danger panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"delete your account title\", \"Delete account\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <p>\n              {pgettext(\n                \"delete your account form\",\n                \"This form lets you delete your account. This action is not reversible.\"\n              )}\n            </p>\n            <p>\n              {pgettext(\n                \"delete your account form\",\n                \"Your account will be deleted together with its profile details, IP addresses and notifications.\"\n              )}\n            </p>\n            <p>\n              {pgettext(\n                \"delete your account form\",\n                \"Other content will NOT be deleted, but username displayed next to it will be changed to one shared by all deleted accounts.\"\n              )}\n            </p>\n            <p>\n              {pgettext(\n                \"delete your account form\",\n                \"Your username and e-maill address will become available again for use during registration or for other accounts to change to.\"\n              )}\n            </p>\n          </div>\n          <div className=\"panel-footer\">\n            <div className=\"input-group\">\n              <input\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                name=\"password-confirmation\"\n                type=\"password\"\n                placeholder={pgettext(\n                  \"delete your account form field\",\n                  \"Enter your password to confirm\"\n                )}\n                value={this.state.password}\n                required\n                onChange={this.onPasswordChange}\n              />\n              <span className=\"input-group-btn\">\n                <Button className=\"btn-danger\" loading={this.state.isLoading}>\n                  {pgettext(\n                    \"delete your account form btn\",\n                    \"Delete my account\"\n                  )}\n                </Button>\n              </span>\n            </div>\n          </div>\n        </div>\n      </form>\n    )\n  }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"edit details\", \"Edit details\"),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n  }\n\n  onSuccess = () => {\n    snackbar.info(\n      pgettext(\"profile details form\", \"Your details have been changed.\")\n    )\n  }\n\n  render() {\n    return (\n      <Form api={this.props.user.api.edit_details} onSuccess={this.onSuccess} />\n    )\n  }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Button from \"misago/components/button\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class DownloadData extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      isSubmiting: false,\n      downloads: [],\n    }\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"download your data title\", \"Download your data\"),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n\n    this.handleLoadDownloads()\n  }\n\n  handleLoadDownloads = () => {\n    ajax.get(this.props.user.api.data_downloads).then(\n      (data) => {\n        this.setState({\n          isLoading: false,\n          downloads: data,\n        })\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n      }\n    )\n  }\n\n  handleRequestDataDownload = () => {\n    this.setState({ isSubmiting: true })\n    ajax.post(this.props.user.api.request_data_download).then(\n      () => {\n        this.handleLoadDownloads()\n        snackbar.success(\n          pgettext(\n            \"download your data\",\n            \"Your request for data download has been registered.\"\n          )\n        )\n        this.setState({ isSubmiting: false })\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n        this.setState({ isSubmiting: false })\n      }\n    )\n  }\n\n  render() {\n    return (\n      <div>\n        <div className=\"panel panel-default panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"download your data title\", \"Download your data\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <p>\n              {pgettext(\n                \"download your data\",\n                'To download your data from the site, click the \"Request data download\" button. Depending on amount of data to be archived and number of users wanting to download their data at same time it may take up to few days for your download to be prepared. An e-mail with notification will be sent to you when your data is ready to be downloaded.'\n              )}\n            </p>\n\n            <p>\n              {pgettext(\n                \"download your data\",\n                \"The download will only be available for limited amount of time, after which it will be deleted from the site and marked as expired.\"\n              )}\n            </p>\n          </div>\n          <table className=\"table\">\n            <thead>\n              <tr>\n                <th>{pgettext(\"download your data table\", \"Requested on\")}</th>\n                <th className=\"col-md-4\">\n                  {pgettext(\"download your data table\", \"Download\")}\n                </th>\n              </tr>\n            </thead>\n            <tbody>\n              {this.state.downloads.map((item) => {\n                return (\n                  <tr key={item.id}>\n                    <td style={rowStyle}>\n                      {moment(item.requested_on).fromNow()}\n                    </td>\n                    <td>\n                      <DownloadButton\n                        exportFile={item.file}\n                        status={item.status}\n                      />\n                    </td>\n                  </tr>\n                )\n              })}\n              {this.state.downloads.length == 0 ? (\n                <tr>\n                  <td colSpan=\"2\">\n                    {pgettext(\n                      \"download your data table\",\n                      \"You have no data downloads.\"\n                    )}\n                  </td>\n                </tr>\n              ) : null}\n            </tbody>\n          </table>\n          <div className=\"panel-footer text-right\">\n            <Button\n              className=\"btn-primary\"\n              loading={this.state.isSubmiting}\n              type=\"button\"\n              onClick={this.handleRequestDataDownload}\n            >\n              {pgettext(\"download your data btn\", \"Request data download\")}\n            </Button>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nconst rowStyle = {\n  verticalAlign: \"middle\",\n}\n\nconst STATUS_PENDING = 0\nconst STATUS_PROCESSING = 1\n\nconst DownloadButton = ({ exportFile, status }) => {\n  if (status === STATUS_PENDING || status === STATUS_PROCESSING) {\n    return (\n      <Button\n        className=\"btn-info btn-sm btn-block\"\n        disabled={true}\n        type=\"button\"\n      >\n        {pgettext(\"download your data table btn\", \"Download is being prepared\")}\n      </Button>\n    )\n  }\n\n  if (exportFile) {\n    return (\n      <a className=\"btn btn-success btn-sm btn-block\" href={exportFile}>\n        {pgettext(\"download your data table btn\", \"Download your data\")}\n      </a>\n    )\n  }\n\n  return (\n    <Button\n      className=\"btn-default btn-sm btn-block\"\n      disabled={true}\n      type=\"button\"\n    >\n      {pgettext(\"download your data table btn\", \"Download is expired\")}\n    </Button>\n  )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Select from \"misago/components/select\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport { patch } from \"misago/reducers/auth\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nconst WATCH_CHOICES = [\n  {\n    value: 0,\n    icon: \"notifications_none\",\n    label: pgettext(\"watch thread choice\", \"No\"),\n  },\n  {\n    value: 1,\n    icon: \"notifications\",\n    label: pgettext(\"watch thread choice\", \"Yes, with on site notifications\"),\n  },\n  {\n    value: 2,\n    icon: \"mail\",\n    label: pgettext(\n      \"watch thread choice\",\n      \"Yes, with on site and e-mail notifications\"\n    ),\n  },\n]\n\nconst NOTIFICATION_CHOICES = [\n  {\n    value: 0,\n    icon: \"notifications_none\",\n    label: pgettext(\"notification preference\", \"Don't notify\"),\n  },\n  {\n    value: 1,\n    icon: \"notifications\",\n    label: pgettext(\"notification preference\", \"Notify on site\"),\n  },\n  {\n    value: 2,\n    icon: \"mail\",\n    label: pgettext(\n      \"notification preference\",\n      \"Notify on site and with e-mail\"\n    ),\n  },\n]\n\nexport default class ForumOptionsForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      is_hiding_presence: props.user.is_hiding_presence,\n      limits_private_thread_invites_to:\n        props.user.limits_private_thread_invites_to,\n\n      watch_started_threads: props.user.watch_started_threads,\n      watch_replied_threads: props.user.watch_replied_threads,\n      watch_new_private_threads_by_followed:\n        props.user.watch_new_private_threads_by_followed,\n      watch_new_private_threads_by_other_users:\n        props.user.watch_new_private_threads_by_other_users,\n      notify_new_private_threads_by_followed:\n        props.user.notify_new_private_threads_by_followed,\n      notify_new_private_threads_by_other_users:\n        props.user.notify_new_private_threads_by_other_users,\n\n      errors: {},\n    }\n\n    this.privateThreadInvitesChoices = [\n      {\n        value: 0,\n        icon: \"help_outline\",\n        label: pgettext(\n          \"private threads preference\",\n          \"Anybody can invite me to their private threads\"\n        ),\n      },\n      {\n        value: 1,\n        icon: \"done_all\",\n        label: pgettext(\n          \"private threads preference\",\n          \"Only those I follow can invite me to their private threads\"\n        ),\n      },\n      {\n        value: 2,\n        icon: \"highlight_off\",\n        label: pgettext(\n          \"private threads preference\",\n          \"Nobody can invite me to their private threads\"\n        ),\n      },\n    ]\n  }\n\n  send() {\n    return ajax.post(this.props.user.api.options, {\n      is_hiding_presence: this.state.is_hiding_presence,\n      limits_private_thread_invites_to:\n        this.state.limits_private_thread_invites_to,\n\n      watch_started_threads: this.state.watch_started_threads,\n      watch_replied_threads: this.state.watch_replied_threads,\n      watch_new_private_threads_by_followed:\n        this.state.watch_new_private_threads_by_followed,\n      watch_new_private_threads_by_other_users:\n        this.state.watch_new_private_threads_by_other_users,\n      notify_new_private_threads_by_followed:\n        this.state.notify_new_private_threads_by_followed,\n      notify_new_private_threads_by_other_users:\n        this.state.notify_new_private_threads_by_other_users,\n    })\n  }\n\n  handleSuccess() {\n    store.dispatch(\n      patch({\n        is_hiding_presence: this.state.is_hiding_presence,\n        limits_private_thread_invites_to:\n          this.state.limits_private_thread_invites_to,\n\n        watch_started_threads: this.state.watch_started_threads,\n        watch_replied_threads: this.state.watch_replied_threads,\n        watch_new_private_threads_by_followed:\n          this.state.watch_new_private_threads_by_followed,\n        watch_new_private_threads_by_other_users:\n          this.state.watch_new_private_threads_by_other_users,\n        notify_new_private_threads_by_followed:\n          this.state.notify_new_private_threads_by_followed,\n        notify_new_private_threads_by_other_users:\n          this.state.notify_new_private_threads_by_other_users,\n      })\n    )\n    snackbar.success(\n      pgettext(\"forum options form\", \"Your forum options have been changed.\")\n    )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(\n        pgettext(\"forum options form\", \"Please reload the page and try again.\")\n      )\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"forum options title\", \"Forum options\"),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"panel panel-default panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"forum options form title\", \"Change forum options\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <fieldset>\n              <legend>\n                {pgettext(\"forum options form\", \"Privacy settings\")}\n              </legend>\n\n              <FormGroup\n                label={pgettext(\"forum options form\", \"Hide my presence\")}\n                helpText={pgettext(\n                  \"forum options form\",\n                  \"If you hide your presence, only members with permission to see hidden presence will see when you are online.\"\n                )}\n                for=\"id_is_hiding_presence\"\n              >\n                <YesNoSwitch\n                  id=\"id_is_hiding_presence\"\n                  disabled={this.state.isLoading}\n                  iconOn=\"visibility_off\"\n                  iconOff=\"visibility\"\n                  labelOn={pgettext(\n                    \"forum options form\",\n                    \"Hide my presence from other users\"\n                  )}\n                  labelOff={pgettext(\n                    \"forum options form\",\n                    \"Show my presence to other users\"\n                  )}\n                  onChange={this.bindInput(\"is_hiding_presence\")}\n                  value={this.state.is_hiding_presence}\n                />\n              </FormGroup>\n\n              <FormGroup\n                label={pgettext(\n                  \"forum options form\",\n                  \"Limit private thread invitations from other users\"\n                )}\n                for=\"id_limits_private_thread_invites_to\"\n              >\n                <Select\n                  id=\"id_limits_private_thread_invites_to\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"limits_private_thread_invites_to\")}\n                  value={this.state.limits_private_thread_invites_to}\n                  choices={this.privateThreadInvitesChoices}\n                />\n              </FormGroup>\n            </fieldset>\n\n            <fieldset>\n              <legend>\n                {pgettext(\"notifications options\", \"Notifications preferences\")}\n              </legend>\n\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Automatically watch threads I start\"\n                )}\n                for=\"id_watch_started_threads\"\n              >\n                <Select\n                  id=\"id_watch_started_threads\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"watch_started_threads\")}\n                  value={this.state.watch_started_threads}\n                  choices={WATCH_CHOICES}\n                />\n              </FormGroup>\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Automatically watch threads I reply to\"\n                )}\n                for=\"id_watch_replied_threads\"\n              >\n                <Select\n                  id=\"id_watch_replied_threads\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\"watch_replied_threads\")}\n                  value={this.state.watch_replied_threads}\n                  choices={WATCH_CHOICES}\n                />\n              </FormGroup>\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Automatically watch new private threads I'm invited to by the members I am following\"\n                )}\n                for=\"id_watch_new_private_threads_by_followed\"\n              >\n                <Select\n                  id=\"id_watch_new_private_threads_by_followed\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\n                    \"watch_new_private_threads_by_followed\"\n                  )}\n                  value={this.state.watch_new_private_threads_by_followed}\n                  choices={WATCH_CHOICES}\n                />\n              </FormGroup>\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Automatically watch new private threads I'm invited to by other members\"\n                )}\n                for=\"id_watch_new_private_threads_by_other_users\"\n              >\n                <Select\n                  id=\"id_watch_new_private_threads_by_other_users\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\n                    \"watch_new_private_threads_by_other_users\"\n                  )}\n                  value={this.state.watch_new_private_threads_by_other_users}\n                  choices={WATCH_CHOICES}\n                />\n              </FormGroup>\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Notify me about new private thread invitations from the members I am following\"\n                )}\n                for=\"id_notify_new_private_threads_by_followed\"\n              >\n                <Select\n                  id=\"id_notify_new_private_threads_by_followed\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\n                    \"notify_new_private_threads_by_followed\"\n                  )}\n                  value={this.state.notify_new_private_threads_by_followed}\n                  choices={NOTIFICATION_CHOICES}\n                />\n              </FormGroup>\n              <FormGroup\n                label={pgettext(\n                  \"notifications options\",\n                  \"Notify me about new private thread invitations from other members\"\n                )}\n                for=\"id_notify_new_private_threads_by_other_users\"\n              >\n                <Select\n                  id=\"id_notify_new_private_threads_by_other_users\"\n                  disabled={this.state.isLoading}\n                  onChange={this.bindInput(\n                    \"notify_new_private_threads_by_other_users\"\n                  )}\n                  value={this.state.notify_new_private_threads_by_other_users}\n                  choices={NOTIFICATION_CHOICES}\n                />\n              </FormGroup>\n            </fieldset>\n          </div>\n          <div className=\"panel-footer\">\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"forum options form btn\", \"Save changes\")}\n            </Button>\n          </div>\n        </div>\n      </form>\n    )\n  }\n}\n","import React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\n\nexport default function () {\n  return (\n    <div className=\"panel panel-default panel-form\">\n      <div className=\"panel-heading\">\n        <h3 className=\"panel-title\">\n          {pgettext(\"change username title\", \"Change username\")}\n        </h3>\n      </div>\n      <PanelLoader />\n    </div>\n  )\n}\n","import React from \"react\"\nimport PanelMessage from \"misago/components/panel-message\"\n\nexport default class extends React.Component {\n  getHelpText() {\n    if (this.props.options.next_on) {\n      return interpolate(\n        pgettext(\n          \"change username\",\n          \"You will be able to change your username %(next_change)s.\"\n        ),\n        { next_change: this.props.options.next_on.fromNow() },\n        true\n      )\n    } else {\n      return pgettext(\n        \"change username\",\n        \"You have changed your name allowed number of times.\"\n      )\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"panel panel-default panel-form\">\n        <div className=\"panel-heading\">\n          <h3 className=\"panel-title\">\n            {pgettext(\"change username title\", \"Change username\")}\n          </h3>\n        </div>\n        <PanelMessage\n          helpText={this.getHelpText()}\n          message={pgettext(\n            \"change username\",\n            \"You can't change your username at the moment.\"\n          )}\n        />\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      username: \"\",\n\n      validators: {\n        username: [\n          validators.usernameContent(),\n          validators.usernameMinLength(props.options.length_min),\n          validators.usernameMaxLength(props.options.length_max),\n        ],\n      },\n\n      isLoading: false,\n    }\n  }\n\n  getHelpText() {\n    let phrases = []\n\n    if (this.props.options.changes_left > 0) {\n      let message = npgettext(\n        \"change username form\",\n        \"You can change your username %(changes_left)s more time.\",\n        \"You can change your username %(changes_left)s more times.\",\n        this.props.options.changes_left\n      )\n\n      phrases.push(\n        interpolate(\n          message,\n          {\n            changes_left: this.props.options.changes_left,\n          },\n          true\n        )\n      )\n    }\n\n    if (this.props.user.acl.name_changes_expire > 0) {\n      let message = npgettext(\n        \"change username form\",\n        \"Used changes become available again after %(name_changes_expire)s day.\",\n        \"Used changes become available again after %(name_changes_expire)s days.\",\n        this.props.user.acl.name_changes_expire\n      )\n\n      phrases.push(\n        interpolate(\n          message,\n          {\n            name_changes_expire: this.props.user.acl.name_changes_expire,\n          },\n          true\n        )\n      )\n    }\n\n    return phrases.length ? phrases.join(\" \") : null\n  }\n\n  clean() {\n    let errors = this.validate()\n    if (errors.username) {\n      snackbar.error(errors.username[0])\n      return false\n    }\n    if (this.state.username.trim() === this.props.user.username) {\n      snackbar.info(\n        pgettext(\"change username form\", \"New username is same as current one.\")\n      )\n      return false\n    } else {\n      return true\n    }\n  }\n\n  send() {\n    return ajax.post(this.props.user.api.username, {\n      username: this.state.username,\n    })\n  }\n\n  handleSuccess(success) {\n    this.setState({\n      username: \"\",\n    })\n\n    this.props.complete(success.username, success.slug, success.options)\n  }\n\n  handleError(rejection) {\n    snackbar.apiError(rejection)\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"panel panel-default panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"change username title\", \"Change username\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <FormGroup\n              label={pgettext(\"change username form field\", \"New username\")}\n              for=\"id_username\"\n              helpText={this.getHelpText()}\n            >\n              <input\n                type=\"text\"\n                id=\"id_username\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"username\")}\n                value={this.state.username}\n              />\n            </FormGroup>\n          </div>\n          <div className=\"panel-footer\">\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"change username form btn\", \"Change username\")}\n            </Button>\n          </div>\n        </div>\n      </form>\n    )\n  }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport FormLoading from \"misago/components/options/change-username/form-loading\"\nimport FormLocked from \"misago/components/options/change-username/form-locked\"\nimport Form from \"misago/components/options/change-username/form\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      options: null,\n    }\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"change username title\", \"Change username\"),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n\n    Promise.all([\n      ajax.get(this.props.user.api.username),\n      ajax.get(misago.get(\"USERNAME_CHANGES_API\"), {\n        user: this.props.user.id,\n      }),\n    ]).then((data) => {\n      store.dispatch(hydrate(data[1].results))\n\n      this.setState({\n        isLoaded: true,\n        options: {\n          changes_left: data[0].changes_left,\n          length_min: data[0].length_min,\n          length_max: data[0].length_max,\n          next_on: data[0].next_on ? moment(data[0].next_on) : null,\n        },\n      })\n    })\n  }\n\n  onComplete = (username, slug, options) => {\n    this.setState({\n      options,\n    })\n\n    store.dispatch(\n      addNameChange({ username, slug }, this.props.user, this.props.user)\n    )\n    store.dispatch(updateUsername(this.props.user, username, slug))\n\n    snackbar.success(\n      pgettext(\"change username\", \"Your username has been changed.\")\n    )\n  }\n\n  getChangeForm() {\n    if (!this.state.isLoaded) {\n      return <FormLoading />\n    }\n\n    if (this.state.options.changes_left === 0) {\n      return <FormLocked options={this.state.options} />\n    }\n\n    return (\n      <Form\n        complete={this.onComplete}\n        options={this.state.options}\n        user={this.props.user}\n      />\n    )\n  }\n\n  render() {\n    return (\n      <div>\n        {this.getChangeForm()}\n        <UsernameHistory\n          changes={this.props[\"username-history\"]}\n          isLoaded={this.state.isLoaded}\n        />\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      new_email: \"\",\n      password: \"\",\n\n      validators: {\n        new_email: [validators.email()],\n        password: [],\n      },\n\n      isLoading: false,\n    }\n  }\n\n  clean() {\n    let errors = this.validate()\n    let lengths = [\n      this.state.new_email.trim().length,\n      this.state.password.trim().length,\n    ]\n\n    if (lengths.indexOf(0) !== -1) {\n      snackbar.error(pgettext(\"change email form\", \"Fill out all fields.\"))\n      return false\n    }\n\n    if (errors.new_email) {\n      snackbar.error(errors.new_email[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.user.api.change_email, {\n      new_email: this.state.new_email,\n      password: this.state.password,\n    })\n  }\n\n  handleSuccess(response) {\n    this.setState({\n      new_email: \"\",\n      password: \"\",\n    })\n\n    snackbar.success(response.detail)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      if (rejection.new_email) {\n        snackbar.error(rejection.new_email)\n      } else {\n        snackbar.error(rejection.password)\n      }\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <input type=\"type\" style={{ display: \"none\" }} />\n        <input type=\"password\" style={{ display: \"none\" }} />\n        <div className=\"panel panel-default panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"change email title\", \"Change e-mail address\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <FormGroup\n              label={pgettext(\"change email form field\", \"New e-mail\")}\n              for=\"id_new_email\"\n            >\n              <input\n                type=\"text\"\n                id=\"id_new_email\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"new_email\")}\n                value={this.state.new_email}\n              />\n            </FormGroup>\n\n            <hr />\n\n            <FormGroup\n              label={pgettext(\n                \"change email form field\",\n                \"Your current password\"\n              )}\n              for=\"id_confirm_email\"\n            >\n              <input\n                type=\"password\"\n                id=\"id_confirm_email\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"password\")}\n                value={this.state.password}\n              />\n            </FormGroup>\n          </div>\n          <div className=\"panel-footer\">\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"change email form btn\", \"Change e-mail\")}\n            </Button>\n          </div>\n        </div>\n      </form>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      new_password: \"\",\n      repeat_password: \"\",\n      password: \"\",\n\n      validators: {\n        new_password: [],\n        repeat_password: [],\n        password: [],\n      },\n\n      isLoading: false,\n    }\n  }\n\n  clean() {\n    let errors = this.validate()\n    let lengths = [\n      this.state.new_password.trim().length,\n      this.state.repeat_password.trim().length,\n      this.state.password.trim().length,\n    ]\n\n    if (lengths.indexOf(0) !== -1) {\n      snackbar.error(pgettext(\"change password form\", \"Fill out all fields.\"))\n      return false\n    }\n\n    if (errors.new_password) {\n      snackbar.error(errors.new_password[0])\n      return false\n    }\n\n    if (this.state.new_password !== this.state.repeat_password) {\n      snackbar.error(\n        pgettext(\"change password form\", \"New passwords are different.\")\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.user.api.change_password, {\n      new_password: this.state.new_password,\n      password: this.state.password,\n    })\n  }\n\n  handleSuccess(response) {\n    this.setState({\n      new_password: \"\",\n      repeat_password: \"\",\n      password: \"\",\n    })\n\n    snackbar.success(response.detail)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      if (rejection.new_password) {\n        snackbar.error(rejection.new_password)\n      } else {\n        snackbar.error(rejection.password)\n      }\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <input type=\"type\" style={{ display: \"none\" }} />\n        <input type=\"password\" style={{ display: \"none\" }} />\n        <div className=\"panel panel-default panel-form\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"change password title\", \"Change password\")}\n            </h3>\n          </div>\n          <div className=\"panel-body\">\n            <FormGroup\n              label={pgettext(\"change password form field\", \"New password\")}\n              for=\"id_new_password\"\n            >\n              <input\n                type=\"password\"\n                id=\"id_new_password\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"new_password\")}\n                value={this.state.new_password}\n              />\n            </FormGroup>\n\n            <FormGroup\n              label={pgettext(\"change password form field\", \"Repeat password\")}\n              for=\"id_repeat_password\"\n            >\n              <input\n                type=\"password\"\n                id=\"id_repeat_password\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"repeat_password\")}\n                value={this.state.repeat_password}\n              />\n            </FormGroup>\n\n            <hr />\n\n            <FormGroup\n              label={pgettext(\n                \"change password form field\",\n                \"Your current password\"\n              )}\n              for=\"id_confirm_password\"\n            >\n              <input\n                type=\"password\"\n                id=\"id_confirm_password\"\n                className=\"form-control\"\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"password\")}\n                value={this.state.password}\n              />\n            </FormGroup>\n          </div>\n          <div className=\"panel-footer\">\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"change password form btn\", \"Change password\")}\n            </Button>\n          </div>\n        </div>\n      </form>\n    )\n  }\n}\n","import React from \"react\"\nimport misago from \"misago/index\"\n\nconst UnusablePasswordMessage = () => {\n  return (\n    <div className=\"panel panel-default panel-form\">\n      <div className=\"panel-heading\">\n        <h3 className=\"panel-title\">\n          {pgettext(\n            \"change sign in credentials title\",\n            \"Change e-mail or password\"\n          )}\n        </h3>\n      </div>\n      <div className=\"panel-body panel-message-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">info_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">\n            {pgettext(\n              \"change sign in credentials\",\n              \"You need to set a password for your account to be able to change your e-mail or password.\"\n            )}\n          </p>\n          <p className=\"help-block\">\n            <a\n              className=\"btn btn-primary\"\n              href={misago.get(\"FORGOTTEN_PASSWORD_URL\")}\n            >\n              {pgettext(\"change sign in credentials link\", \"Set password\")}\n            </a>\n          </p>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport default UnusablePasswordMessage\n","import React from \"react\"\nimport ChangeEmail from \"misago/components/options/sign-in-credentials/change-email\"\nimport ChangePassword from \"misago/components/options/sign-in-credentials/change-password\"\nimport misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\nimport UnusablePasswordMessage from \"./UnusablePasswordMessage\"\n\nexport default class extends React.Component {\n  componentDidMount() {\n    title.set({\n      title: pgettext(\n        \"change sign in credentials title\",\n        \"Change e-mail or password\"\n      ),\n      parent: pgettext(\"forum options\", \"Change your options\"),\n    })\n  }\n\n  render() {\n    if (!this.props.user.has_usable_password) {\n      return <UnusablePasswordMessage />\n    }\n\n    return (\n      <div>\n        <ChangeEmail user={this.props.user} />\n        <ChangePassword user={this.props.user} />\n\n        <p className=\"message-line\">\n          <span className=\"material-icon\">warning</span>\n          <a href={misago.get(\"FORGOTTEN_PASSWORD_URL\")}>\n            {pgettext(\n              \"change sign in credentials link\",\n              \"Change forgotten password\"\n            )}\n          </a>\n        </p>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { SideNav, CompactNav } from \"misago/components/options/navs\"\nimport DeleteAccount from \"misago/components/options/delete-account\"\nimport EditDetails from \"misago/components/options/edit-details\"\nimport DownloadData from \"misago/components/options/download-data\"\nimport ChangeForumOptions from \"misago/components/options/forum-options\"\nimport ChangeUsername from \"misago/components/options/change-username/root\"\nimport ChangeSignInCredentials from \"misago/components/options/sign-in-credentials/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport PageContainer from \"../PageContainer\"\nimport {\n  PageHeader,\n  PageHeaderBanner,\n  PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n  render() {\n    const page = misago.get(\"USER_OPTIONS\").filter((page) => {\n      const url = misago.get(\"USERCP_URL\") + page.component + \"/\"\n      return this.props.location.pathname.substr(0, url.length) === url\n    })[0]\n\n    return (\n      <div className=\"page page-options\">\n        <PageHeaderContainer>\n          <PageHeader styleName=\"options\">\n            <PageHeaderBanner styleName=\"options\">\n              <FlexRow>\n                <FlexRowSection auto>\n                  <FlexRowCol auto>\n                    <h1>{pgettext(\"forum options\", \"Change your options\")}</h1>\n                  </FlexRowCol>\n                  <FlexRowCol className=\"hidden-xs hidden-md hidden-lg\" shrink>\n                    <div className=\"dropdown\">\n                      <button\n                        type=\"button\"\n                        className=\"btn btn-default btn-outline btn-icon dropdown-toggle\"\n                        title={pgettext(\"forum options nav btn\", \"Menu\")}\n                        data-toggle=\"dropdown\"\n                        aria-haspopup=\"true\"\n                        aria-expanded=\"false\"\n                      >\n                        <span className=\"material-icon\">menu</span>\n                      </button>\n                      <CompactNav\n                        className=\"dropdown-menu dropdown-menu-right\"\n                        baseUrl={misago.get(\"USERCP_URL\")}\n                        options={misago.get(\"USER_OPTIONS\")}\n                      />\n                    </div>\n                  </FlexRowCol>\n                </FlexRowSection>\n                <FlexRowSection className=\"hidden-sm hidden-md hidden-lg\">\n                  <FlexRowCol>\n                    <div className=\"dropdown\">\n                      <button\n                        type=\"button\"\n                        className=\"btn btn-default btn-outline btn-block dropdown-toggle\"\n                        data-toggle=\"dropdown\"\n                        aria-haspopup=\"true\"\n                        aria-expanded=\"false\"\n                      >\n                        <span className=\"material-icon\">{page.icon}</span>\n                        {page.name}\n                      </button>\n                      <CompactNav\n                        className=\"dropdown-menu\"\n                        baseUrl={misago.get(\"USERCP_URL\")}\n                        options={misago.get(\"USER_OPTIONS\")}\n                      />\n                    </div>\n                  </FlexRowCol>\n                </FlexRowSection>\n              </FlexRow>\n            </PageHeaderBanner>\n          </PageHeader>\n        </PageHeaderContainer>\n        <PageContainer>\n          <div className=\"row\">\n            <div className=\"col-md-3 hidden-xs hidden-sm\">\n              <SideNav\n                baseUrl={misago.get(\"USERCP_URL\")}\n                options={misago.get(\"USER_OPTIONS\")}\n              />\n            </div>\n            <div className=\"col-md-9\">{this.props.children}</div>\n          </div>\n        </PageContainer>\n      </div>\n    )\n  }\n}\n\nexport function select(store) {\n  return {\n    tick: store.tick.tick,\n    user: store.auth.user,\n    \"username-history\": store[\"username-history\"],\n  }\n}\n\nexport function paths() {\n  const paths = [\n    {\n      path: misago.get(\"USERCP_URL\") + \"forum-options/\",\n      component: connect(select)(ChangeForumOptions),\n    },\n    {\n      path: misago.get(\"USERCP_URL\") + \"edit-details/\",\n      component: connect(select)(EditDetails),\n    },\n  ]\n\n  const delegateAuth = misago.get(\"SETTINGS\").DELEGATE_AUTH\n  if (!delegateAuth) {\n    paths.push({\n      path: misago.get(\"USERCP_URL\") + \"change-username/\",\n      component: connect(select)(ChangeUsername),\n    })\n    paths.push({\n      path: misago.get(\"USERCP_URL\") + \"sign-in-credentials/\",\n      component: connect(select)(ChangeSignInCredentials),\n    })\n  }\n\n  if (misago.get(\"ENABLE_DOWNLOAD_OWN_DATA\")) {\n    paths.push({\n      path: misago.get(\"USERCP_URL\") + \"download-data/\",\n      component: connect(select)(DownloadData),\n    })\n  }\n\n  if (!delegateAuth && misago.get(\"ENABLE_DELETE_OWN_ACCOUNT\")) {\n    paths.push({\n      path: misago.get(\"USERCP_URL\") + \"delete-account/\",\n      component: connect(select)(DeleteAccount),\n    })\n  }\n\n  return paths\n}\n","import Options, { paths } from \"misago/components/options/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n  if (context.has(\"USER_OPTIONS\")) {\n    mount({\n      root: misago.get(\"USERCP_URL\"),\n      component: Options,\n      paths: paths(),\n    })\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:options\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import moment from \"moment\"\nimport React from \"react\"\nimport PanelLoader from \"misago/components/panel-loader\"\nimport PanelMessage from \"misago/components/panel-message\"\nimport misago from \"misago/index\"\nimport polls from \"misago/services/polls\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    if (misago.has(\"PROFILE_BAN\")) {\n      this.initWithPreloadedData(misago.pop(\"PROFILE_BAN\"))\n    } else {\n      this.initWithoutPreloadedData()\n    }\n\n    this.startPolling(props.profile.api.ban)\n  }\n\n  initWithPreloadedData(ban) {\n    if (ban.expires_on) {\n      ban.expires_on = moment(ban.expires_on)\n    }\n\n    this.state = {\n      isLoaded: true,\n      ban,\n    }\n  }\n\n  initWithoutPreloadedData() {\n    this.state = {\n      isLoaded: false,\n    }\n  }\n\n  startPolling(api) {\n    polls.start({\n      poll: \"ban-details\",\n      url: api,\n      frequency: 90 * 1000,\n      update: this.update,\n      error: this.error,\n    })\n  }\n\n  update = (ban) => {\n    if (ban.expires_on) {\n      ban.expires_on = moment(ban.expires_on)\n    }\n\n    this.setState({\n      isLoaded: true,\n      error: null,\n\n      ban,\n    })\n  }\n\n  error = (error) => {\n    this.setState({\n      isLoaded: true,\n      error: error.detail,\n      ban: null,\n    })\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"profile ban details title\", \"Ban details\"),\n      parent: this.props.profile.username,\n    })\n  }\n\n  componentWillUnmount() {\n    polls.stop(\"ban-details\")\n  }\n\n  getUserMessage() {\n    if (this.state.ban.user_message) {\n      return (\n        <div className=\"panel-body ban-message ban-user-message\">\n          <h4>{pgettext(\"profile ban details\", \"User-shown ban message\")}</h4>\n          <div\n            className=\"lead\"\n            dangerouslySetInnerHTML={{\n              __html: this.state.ban.user_message.html,\n            }}\n          />\n        </div>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getStaffMessage() {\n    if (this.state.ban.staff_message) {\n      return (\n        <div className=\"panel-body ban-message ban-staff-message\">\n          <h4>{pgettext(\"profile ban details\", \"Team-shown ban message\")}</h4>\n          <div\n            className=\"lead\"\n            dangerouslySetInnerHTML={{\n              __html: this.state.ban.staff_message.html,\n            }}\n          />\n        </div>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getExpirationMessage() {\n    if (this.state.ban.expires_on) {\n      if (this.state.ban.expires_on.isAfter(moment())) {\n        let title = interpolate(\n          pgettext(\n            \"profile ban details\",\n            \"This ban expires on %(expires_on)s.\"\n          ),\n          {\n            expires_on: this.state.ban.expires_on.format(\"LL, LT\"),\n          },\n          true\n        )\n\n        let message = interpolate(\n          pgettext(\"profile ban details\", \"This ban expires %(expires_on)s.\"),\n          {\n            expires_on: this.state.ban.expires_on.fromNow(),\n          },\n          true\n        )\n\n        return <abbr title={title}>{message}</abbr>\n      } else {\n        return pgettext(\"profile ban details\", \"This ban has expired.\")\n      }\n    } else {\n      return interpolate(\n        pgettext(\"profile ban details\", \"%(username)s's ban is permanent.\"),\n        {\n          username: this.props.profile.username,\n        },\n        true\n      )\n    }\n  }\n\n  getPanelBody() {\n    if (this.state.ban) {\n      if (Object.keys(this.state.ban).length) {\n        return (\n          <div>\n            {this.getUserMessage()}\n            {this.getStaffMessage()}\n\n            <div className=\"panel-body ban-expires\">\n              <h4>{pgettext(\"profile ban details\", \"Ban expiration\")}</h4>\n              <p className=\"lead\">{this.getExpirationMessage()}</p>\n            </div>\n          </div>\n        )\n      } else {\n        return (\n          <div>\n            <PanelMessage\n              message={pgettext(\n                \"profile ban details\",\n                \"No ban is active at the moment.\"\n              )}\n            />\n          </div>\n        )\n      }\n    } else if (this.state.error) {\n      return (\n        <div>\n          <PanelMessage icon=\"error_outline\" message={this.state.error} />\n        </div>\n      )\n    } else {\n      return (\n        <div>\n          <PanelLoader />\n        </div>\n      )\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"profile-ban-details\">\n        <div className=\"panel panel-default\">\n          <div className=\"panel-heading\">\n            <h3 className=\"panel-title\">\n              {pgettext(\"profile ban details title\", \"Ban details\")}\n            </h3>\n          </div>\n\n          {this.getPanelBody()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Form from \"misago/components/edit-details\"\n\nexport default function ({ api, display, onCancel, onSuccess }) {\n  if (!display) return null\n\n  return <Form api={api} onCancel={onCancel} onSuccess={onSuccess} />\n}\n","import React from \"react\"\n\nexport default function ({ isAuthenticated, profile }) {\n  let message = null\n  if (isAuthenticated) {\n    message = pgettext(\n      \"profile details empty\",\n      \"You are not sharing any details with others.\"\n    )\n  } else {\n    message = interpolate(\n      pgettext(\n        \"profile details empty\",\n        \"%(username)s is not sharing any details with others.\"\n      ),\n      {\n        username: profile.username,\n      },\n      true\n    )\n  }\n\n  return (\n    <div className=\"panel panel-default\">\n      <div className=\"panel-body text-center lead\">{message}</div>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function ({ html, text, url }) {\n  if (html) {\n    return (\n      <div\n        className=\"form-control-static col-md-9\"\n        dangerouslySetInnerHTML={{ __html: html }}\n      />\n    )\n  }\n\n  return (\n    <div className=\"form-control-static col-md-9\">\n      <SafeValue text={text} url={url} />\n    </div>\n  )\n}\n\nexport function SafeValue({ text, url }) {\n  if (url) {\n    return (\n      <p>\n        <a href={url} target=\"_blank\" rel=\"nofollow\">\n          {text || url}\n        </a>\n      </p>\n    )\n  }\n\n  if (text) {\n    return <p>{text}</p>\n  }\n\n  return null\n}\n","import React from \"react\"\nimport FieldValue from \"./field-value\"\n\nexport default function (props) {\n  return (\n    <div className=\"form-group\">\n      <strong className=\"control-label col-md-3\">{props.name}:</strong>\n      <FieldValue {...props} />\n    </div>\n  )\n}\n","import React from \"react\"\nimport Field from \"./field\"\n\nexport default function ({ fields, name }) {\n  return (\n    <div className=\"panel panel-default panel-profile-details-group\">\n      <div className=\"panel-heading\">\n        <h3 className=\"panel-title\">{name}</h3>\n      </div>\n      <div className=\"panel-body\">\n        <div className=\"form-horizontal\">\n          {fields.map(({ fieldname, html, name, text, url }) => {\n            return (\n              <Field\n                key={fieldname}\n                name={name}\n                html={html}\n                text={text}\n                url={url}\n              />\n            )\n          })}\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport EmptyMessage from \"./empty-message\"\nimport Group from \"./group\"\nimport Loader from \"misago/components/loader\"\n\nexport default function ({\n  display,\n  groups,\n  isAuthenticated,\n  loading,\n  profile,\n}) {\n  if (!display) return null\n\n  if (loading) {\n    return <Loader />\n  }\n\n  if (!groups.length) {\n    return <EmptyMessage isAuthenticated={isAuthenticated} profile={profile} />\n  }\n\n  return (\n    <div>\n      {groups.map((group, i) => {\n        return <Group fields={group.fields} key={i} name={group.name} />\n      })}\n    </div>\n  )\n}\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nconst ProfileDetailsHeader = ({ onEdit, showEditButton }) => (\n  <Toolbar>\n    <ToolbarSection auto>\n      <ToolbarItem auto>\n        <h3>{pgettext(\"profile details title\", \"Details\")}</h3>\n      </ToolbarItem>\n    </ToolbarSection>\n    {showEditButton && (\n      <ToolbarSection>\n        <ToolbarItem>\n          <button\n            className=\"btn btn-default btn-outline btn-block\"\n            onClick={onEdit}\n            type=\"button\"\n          >\n            {pgettext(\"profile details edit btn\", \"Edit\")}\n          </button>\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n  </Toolbar>\n)\n\nexport default ProfileDetailsHeader\n","import React from \"react\"\nimport { load } from \"misago/reducers/profile-details\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  componentDidMount() {\n    const { data, dispatch, user } = this.props\n    if (data && data.id === user.id) return\n\n    ajax.get(this.props.user.api.details).then(\n      (data) => {\n        dispatch(load(data))\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n      }\n    )\n  }\n\n  render() {\n    return this.props.children\n  }\n}\n","import React from \"react\"\nimport Form from \"./form\"\nimport GroupsList from \"./groups-list\"\nimport Header from \"./header\"\nimport ProfileDetailsData from \"misago/data/profile-details\"\nimport { load as loadDetails } from \"misago/reducers/profile-details\"\nimport title from \"misago/services/page-title\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      editing: false,\n    }\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"profile details title\", \"Details\"),\n      parent: this.props.profile.username,\n    })\n  }\n\n  onCancel = () => {\n    this.setState({ editing: false })\n  }\n\n  onEdit = () => {\n    this.setState({ editing: true })\n  }\n\n  onSuccess = (newDetails) => {\n    const { dispatch, isAuthenticated, profile } = this.props\n\n    let message = null\n    if (isAuthenticated) {\n      message = pgettext(\n        \"profile details form\",\n        \"Your details have been changed.\"\n      )\n    } else {\n      message = interpolate(\n        pgettext(\n          \"profile details form\",\n          \"%(username)s's details have been changed.\"\n        ),\n        {\n          username: profile.username,\n        },\n        true\n      )\n    }\n\n    snackbar.info(message)\n    dispatch(loadDetails(newDetails))\n    this.setState({ editing: false })\n  }\n\n  render() {\n    const { dispatch, isAuthenticated, profile, profileDetails } = this.props\n    const loading = profileDetails.id !== profile.id\n\n    return (\n      <ProfileDetailsData\n        data={profileDetails}\n        dispatch={dispatch}\n        user={profile}\n      >\n        <div className=\"profile-details\">\n          <Header\n            onEdit={this.onEdit}\n            showEditButton={!!profileDetails.edit && !this.state.editing}\n          />\n          <GroupsList\n            display={!this.state.editing}\n            groups={profileDetails.groups}\n            isAuthenticated={isAuthenticated}\n            loading={loading}\n            profile={profile}\n          />\n          <Form\n            api={profile.api.edit_details}\n            dispatch={dispatch}\n            display={this.state.editing}\n            onCancel={this.onCancel}\n            onSuccess={this.onSuccess}\n          />\n        </div>\n      </ProfileDetailsData>\n    )\n  }\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport * as posts from \"misago/reducers/posts\"\nimport title from \"misago/services/page-title\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n    }\n  }\n\n  loadItems(start = 0) {\n    ajax\n      .get(this.props.api, {\n        start: start || 0,\n      })\n      .then(\n        (data) => {\n          if (start === 0) {\n            store.dispatch(posts.load(data))\n          } else {\n            store.dispatch(posts.append(data))\n          }\n\n          this.setState({\n            isLoading: false,\n          })\n        },\n        (rejection) => {\n          this.setState({\n            isLoading: false,\n          })\n\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  loadMore = () => {\n    this.setState({\n      isLoading: true,\n    })\n\n    this.loadItems(this.props.posts.next)\n  }\n\n  componentDidMount() {\n    title.set({\n      title: this.props.title,\n      parent: this.props.profile.username,\n    })\n\n    this.loadItems()\n  }\n\n  render() {\n    return (\n      <div className=\"profile-feed\">\n        <Toolbar>\n          <ToolbarSection auto>\n            <ToolbarItem auto>\n              <h3>{this.props.header}</h3>\n            </ToolbarItem>\n          </ToolbarSection>\n        </Toolbar>\n        <Feed\n          isLoading={this.state.isLoading}\n          loadMore={this.loadMore}\n          {...this.props}\n        />\n      </div>\n    )\n  }\n}\n\nexport function Feed(props) {\n  if (props.posts.isLoaded && !props.posts.results.length) {\n    return <p className=\"lead\">{props.emptyMessage}</p>\n  }\n\n  return (\n    <div>\n      <PostFeed\n        isReady={props.posts.isLoaded}\n        posts={props.posts.results}\n        poster={props.profile}\n      />\n      <LoadMoreButton\n        isLoading={props.isLoading}\n        loadMore={props.loadMore}\n        next={props.posts.next}\n      />\n    </div>\n  )\n}\n\nexport function LoadMoreButton(props) {\n  if (!props.next) return null\n\n  return (\n    <div className=\"pager-more\">\n      <Button\n        className=\"btn btn-default btn-outline\"\n        loading={props.isLoading}\n        onClick={props.loadMore}\n      >\n        {pgettext(\"profile load more btn\", \"Show older activity\")}\n      </Button>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default class extends React.Component {\n  getClassName() {\n    if (this.props.className) {\n      return \"form-search \" + this.props.className\n    } else {\n      return \"form-search\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()}>\n        <input\n          type=\"text\"\n          className=\"form-control\"\n          value={this.props.value}\n          onChange={this.props.onChange}\n          placeholder={\n            this.props.placeholder ||\n            pgettext(\"quick search placeholder\", \"Search...\")\n          }\n        />\n        <span className=\"material-icon\">search</span>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsersList from \"misago/components/users-list\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.setSpecialProps()\n\n    if (misago.has(this.PRELOADED_DATA_KEY)) {\n      this.initWithPreloadedData(misago.pop(this.PRELOADED_DATA_KEY))\n    } else {\n      this.initWithoutPreloadedData()\n    }\n  }\n\n  setSpecialProps() {\n    this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWERS\"\n    this.TITLE = pgettext(\"profile followers title\", \"Followers\")\n    this.API_FILTER = \"followers\"\n  }\n\n  initWithPreloadedData(data) {\n    this.state = {\n      isLoaded: true,\n      isBusy: false,\n\n      search: \"\",\n\n      count: data.count,\n      more: data.more,\n\n      page: data.page,\n      pages: data.pages,\n    }\n\n    store.dispatch(hydrate(data.results))\n  }\n\n  initWithoutPreloadedData() {\n    this.state = {\n      isLoaded: false,\n      isBusy: false,\n\n      search: \"\",\n\n      count: 0,\n      more: 0,\n\n      page: 1,\n      pages: 1,\n    }\n\n    this.loadUsers()\n  }\n\n  loadUsers(page = 1, search = null) {\n    const apiUrl = this.props.profile.api[this.API_FILTER]\n\n    ajax\n      .get(\n        apiUrl,\n        {\n          search: search,\n          page: page || 1,\n        },\n        \"user-\" + this.API_FILTER\n      )\n      .then(\n        (data) => {\n          if (page === 1) {\n            store.dispatch(hydrate(data.results))\n          } else {\n            store.dispatch(append(data.results))\n          }\n\n          this.setState({\n            isLoaded: true,\n            isBusy: false,\n\n            count: data.count,\n            more: data.more,\n\n            page: data.page,\n            pages: data.pages,\n          })\n        },\n        (rejection) => {\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  componentDidMount() {\n    title.set({\n      title: this.TITLE,\n      parent: this.props.profile.username,\n    })\n  }\n\n  loadMore = () => {\n    this.setState({\n      isBusy: true,\n    })\n\n    this.loadUsers(this.state.page + 1, this.state.search)\n  }\n\n  search = (ev) => {\n    this.setState({\n      isLoaded: false,\n      isBusy: true,\n\n      search: ev.target.value,\n\n      count: 0,\n      more: 0,\n\n      page: 1,\n      pages: 1,\n    })\n\n    this.loadUsers(1, ev.target.value)\n  }\n\n  getLabel() {\n    if (!this.state.isLoaded) {\n      return pgettext(\"Loading...\")\n    } else if (this.state.search) {\n      let message = npgettext(\n        \"profile followers\",\n        \"Found %(users)s user.\",\n        \"Found %(users)s users.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          users: this.state.count,\n        },\n        true\n      )\n    } else if (this.props.profile.id === this.props.user.id) {\n      let message = npgettext(\n        \"profile followers\",\n        \"You have %(users)s follower.\",\n        \"You have %(users)s followers.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          users: this.state.count,\n        },\n        true\n      )\n    } else {\n      let message = npgettext(\n        \"profile followers\",\n        \"%(username)s has %(users)s follower.\",\n        \"%(username)s has %(users)s followers.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          username: this.props.profile.username,\n          users: this.state.count,\n        },\n        true\n      )\n    }\n  }\n\n  getEmptyMessage() {\n    if (this.state.search) {\n      return pgettext(\n        \"profile followers\",\n        \"Search returned no users matching specified criteria.\"\n      )\n    } else if (this.props.user.id === this.props.profile.id) {\n      return pgettext(\"profile followers\", \"You have no followers.\")\n    } else {\n      return interpolate(\n        pgettext(\"profile followers\", \"%(username)s has no followers.\"),\n        {\n          username: this.props.profile.username,\n        },\n        true\n      )\n    }\n  }\n\n  getMoreButton() {\n    if (!this.state.more) return null\n\n    return (\n      <div className=\"pager-more\">\n        <Button\n          className=\"btn btn-default btn-outline\"\n          loading={this.state.isBusy}\n          onClick={this.loadMore}\n        >\n          {interpolate(\n            pgettext(\"profile followers\", \"Show more (%(more)s)\"),\n            {\n              more: this.state.more,\n            },\n            true\n          )}\n        </Button>\n      </div>\n    )\n  }\n\n  getListBody() {\n    if (this.state.isLoaded && this.state.count === 0) {\n      return <p className=\"lead\">{this.getEmptyMessage()}</p>\n    }\n\n    return (\n      <div>\n        <UsersList\n          cols={3}\n          isReady={this.state.isLoaded}\n          users={this.props.users}\n        />\n\n        {this.getMoreButton()}\n      </div>\n    )\n  }\n\n  getClassName() {\n    return \"profile-\" + this.API_FILTER\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()}>\n        <Toolbar>\n          <ToolbarSection auto>\n            <ToolbarItem auto>\n              <h3>{this.getLabel()}</h3>\n            </ToolbarItem>\n          </ToolbarSection>\n          <ToolbarSection>\n            <ToolbarItem>\n              <Search\n                value={this.state.search}\n                onChange={this.search}\n                placeholder={pgettext(\n                  \"profile followers search\",\n                  \"Search users...\"\n                )}\n              />\n            </ToolbarItem>\n          </ToolbarSection>\n        </Toolbar>\n\n        {this.getListBody()}\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Followers from \"misago/components/profile/followers\"\n\nexport default class extends Followers {\n  setSpecialProps() {\n    this.PRELOADED_DATA_KEY = \"PROFILE_FOLLOWS\"\n    this.TITLE = pgettext(\"profile follows title\", \"Follows\")\n    this.API_FILTER = \"follows\"\n  }\n\n  getLabel() {\n    if (!this.state.isLoaded) {\n      return pgettext(\"profile follows\", \"Loading...\")\n    } else if (this.state.search) {\n      let message = npgettext(\n        \"profile follows\",\n        \"Found %(users)s user.\",\n        \"Found %(users)s users.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          users: this.state.count,\n        },\n        true\n      )\n    } else if (this.props.profile.id === this.props.user.id) {\n      let message = npgettext(\n        \"profile follows\",\n        \"You are following %(users)s user.\",\n        \"You are following %(users)s users.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          users: this.state.count,\n        },\n        true\n      )\n    } else {\n      let message = npgettext(\n        \"profile follows\",\n        \"%(username)s is following %(users)s user.\",\n        \"%(username)s is following %(users)s users.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          username: this.props.profile.username,\n          users: this.state.count,\n        },\n        true\n      )\n    }\n  }\n\n  getEmptyMessage() {\n    if (this.state.search) {\n      return pgettext(\n        \"profile follows\",\n        \"Search returned no users matching specified criteria.\"\n      )\n    } else if (this.props.user.id === this.props.profile.id) {\n      return pgettext(\"profile follows\", \"You are not following any users.\")\n    } else {\n      return interpolate(\n        pgettext(\"profile follows\", \"%(username)s is not following any users.\"),\n        {\n          username: this.props.profile.username,\n        },\n        true\n      )\n    }\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Search from \"misago/components/quick-search\"\nimport UsernameHistory from \"misago/components/username-history/root\"\nimport misago from \"misago/index\"\nimport { hydrate, append } from \"misago/reducers/username-history\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../Toolbar\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    if (misago.has(\"PROFILE_NAME_HISTORY\")) {\n      this.initWithPreloadedData(misago.pop(\"PROFILE_NAME_HISTORY\"))\n    } else {\n      this.initWithoutPreloadedData()\n    }\n  }\n\n  initWithPreloadedData(data) {\n    this.state = {\n      isLoaded: true,\n      isBusy: false,\n\n      search: \"\",\n\n      count: data.count,\n      more: data.more,\n\n      page: data.page,\n      pages: data.pages,\n    }\n\n    store.dispatch(hydrate(data.results))\n  }\n\n  initWithoutPreloadedData() {\n    this.state = {\n      isLoaded: false,\n      isBusy: false,\n\n      search: \"\",\n\n      count: 0,\n      more: 0,\n\n      page: 1,\n      pages: 1,\n    }\n\n    this.loadChanges()\n  }\n\n  loadChanges(page = 1, search = null) {\n    ajax\n      .get(\n        misago.get(\"USERNAME_CHANGES_API\"),\n        {\n          user: this.props.profile.id,\n          search: search,\n          page: page || 1,\n        },\n        \"search-username-history\"\n      )\n      .then(\n        (data) => {\n          if (page === 1) {\n            store.dispatch(hydrate(data.results))\n          } else {\n            store.dispatch(append(data.results))\n          }\n\n          this.setState({\n            isLoaded: true,\n            isBusy: false,\n\n            count: data.count,\n            more: data.more,\n\n            page: data.page,\n            pages: data.pages,\n          })\n        },\n        (rejection) => {\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  componentDidMount() {\n    title.set({\n      title: pgettext(\"profile username history title\", \"Username history\"),\n      parent: this.props.profile.username,\n    })\n  }\n\n  loadMore = () => {\n    this.setState({\n      isBusy: true,\n    })\n\n    this.loadChanges(this.state.page + 1, this.state.search)\n  }\n\n  search = (ev) => {\n    this.setState({\n      isLoaded: false,\n      isBusy: true,\n\n      search: ev.target.value,\n\n      count: 0,\n      more: 0,\n\n      page: 1,\n      pages: 1,\n    })\n\n    this.loadChanges(1, ev.target.value)\n  }\n\n  getLabel() {\n    if (!this.state.isLoaded) {\n      return pgettext(\"profile username history\", \"Loading...\")\n    } else if (this.state.search) {\n      let message = npgettext(\n        \"profile username history\",\n        \"Found %(changes)s username change.\",\n        \"Found %(changes)s username changes.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          changes: this.state.count,\n        },\n        true\n      )\n    } else if (this.props.profile.id === this.props.user.id) {\n      let message = npgettext(\n        \"profile username history\",\n        \"Your username was changed %(changes)s time.\",\n        \"Your username was changed %(changes)s times.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          changes: this.state.count,\n        },\n        true\n      )\n    } else {\n      let message = npgettext(\n        \"profile username history\",\n        \"%(username)s's username was changed %(changes)s time.\",\n        \"%(username)s's username was changed %(changes)s times.\",\n        this.state.count\n      )\n\n      return interpolate(\n        message,\n        {\n          username: this.props.profile.username,\n          changes: this.state.count,\n        },\n        true\n      )\n    }\n  }\n\n  getEmptyMessage() {\n    if (this.state.search) {\n      return pgettext(\n        \"profile username history\",\n        \"Search returned no username changes matching specified criteria.\"\n      )\n    } else if (this.props.user.id === this.props.profile.id) {\n      return pgettext(\n        \"username history empty\",\n        \"Your account has no history of name changes.\"\n      )\n    } else {\n      return interpolate(\n        pgettext(\n          \"profile username history\",\n          \"%(username)s's username was never changed.\"\n        ),\n        {\n          username: this.props.profile.username,\n        },\n        true\n      )\n    }\n  }\n\n  getMoreButton() {\n    if (!this.state.more) return null\n\n    return (\n      <div className=\"pager-more\">\n        <Button\n          className=\"btn btn-default btn-outline\"\n          loading={this.state.isBusy}\n          onClick={this.loadMore}\n        >\n          {interpolate(\n            pgettext(\"profile username history\", \"Show older (%(more)s)\"),\n            {\n              more: this.state.more,\n            },\n            true\n          )}\n        </Button>\n      </div>\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"profile-username-history\">\n        <Toolbar>\n          <ToolbarSection auto>\n            <ToolbarItem auto>\n              <h3>{this.getLabel()}</h3>\n            </ToolbarItem>\n          </ToolbarSection>\n          <ToolbarSection>\n            <ToolbarItem>\n              <Search\n                value={this.state.search}\n                onChange={this.search}\n                placeholder={pgettext(\n                  \"profile username history search input\",\n                  \"Search history...\"\n                )}\n              />\n            </ToolbarItem>\n          </ToolbarSection>\n        </Toolbar>\n\n        <UsernameHistory\n          isLoaded={this.state.isLoaded}\n          emptyMessage={this.getEmptyMessage()}\n          changes={this.props[\"username-history\"]}\n        />\n\n        {this.getMoreButton()}\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport { patch } from \"misago/reducers/profile\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n    }\n  }\n\n  getClassName() {\n    if (this.props.profile.is_followed) {\n      return this.props.className + \" btn-default btn-following\"\n    } else {\n      return this.props.className + \" btn-default btn-follow\"\n    }\n  }\n\n  getIcon() {\n    if (this.props.profile.is_followed) {\n      return \"favorite\"\n    } else {\n      return \"favorite_border\"\n    }\n  }\n\n  getLabel() {\n    if (this.props.profile.is_followed) {\n      return pgettext(\"user profile follow btn\", \"Following\")\n    } else {\n      return pgettext(\"user profile follow btn\", \"Follow\")\n    }\n  }\n\n  action = () => {\n    this.setState({\n      isLoading: true,\n    })\n\n    if (this.props.profile.is_followed) {\n      store.dispatch(\n        patch({\n          is_followed: false,\n          followers: this.props.profile.followers - 1,\n        })\n      )\n    } else {\n      store.dispatch(\n        patch({\n          is_followed: true,\n          followers: this.props.profile.followers + 1,\n        })\n      )\n    }\n\n    ajax.post(this.props.profile.api.follow).then(\n      (data) => {\n        this.setState({\n          isLoading: false,\n        })\n\n        store.dispatch(patch(data))\n      },\n      (rejection) => {\n        this.setState({\n          isLoading: false,\n        })\n        snackbar.apiError(rejection)\n      }\n    )\n  }\n\n  render() {\n    return (\n      <Button\n        className={this.getClassName()}\n        disabled={this.state.isLoading}\n        onClick={this.action}\n      >\n        <span className=\"material-icon\">{this.getIcon()}</span>\n        {this.getLabel()}\n      </Button>\n    )\n  }\n}\n","import React from \"react\"\nimport posting from \"misago/services/posting\"\nimport misago from \"misago\"\n\nexport default class extends React.Component {\n  onClick = () => {\n    posting.open({\n      mode: \"START_PRIVATE\",\n      submit: misago.get(\"PRIVATE_THREADS_API\"),\n\n      to: [this.props.profile],\n    })\n  }\n\n  render() {\n    const canMessage = this.props.user.acl.can_start_private_threads\n    const isProfileOwner = this.props.user.id === this.props.profile.id\n\n    if (!canMessage || isProfileOwner) return null\n\n    return (\n      <button\n        className={this.props.className}\n        onClick={this.onClick}\n        type=\"button\"\n      >\n        <span className=\"material-icon\">comment</span>\n        {pgettext(\"profile message btn\", \"Message\")}\n      </button>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { updateAvatar } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      isLoading: false,\n      error: null,\n\n      is_avatar_locked: \"\",\n      avatar_lock_user_message: \"\",\n      avatar_lock_staff_message: \"\",\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.profile.api.moderate_avatar).then(\n      (options) => {\n        this.setState({\n          isLoaded: true,\n\n          is_avatar_locked: options.is_avatar_locked,\n          avatar_lock_user_message: options.avatar_lock_user_message || \"\",\n          avatar_lock_staff_message: options.avatar_lock_staff_message || \"\",\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isLoaded: true,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(this.validate().username[0])\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(this.props.profile.api.moderate_avatar, {\n      is_avatar_locked: this.state.is_avatar_locked,\n      avatar_lock_user_message: this.state.avatar_lock_user_message,\n      avatar_lock_staff_message: this.state.avatar_lock_staff_message,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    store.dispatch(updateAvatar(this.props.profile, apiResponse.avatar_hash))\n    snackbar.success(\n      pgettext(\n        \"profile avatar moderation\",\n        \"Avatar controls have been changed.\"\n      )\n    )\n  }\n\n  getFormBody() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"modal-body\">\n          <FormGroup\n            label={pgettext(\"profile avatar moderation field\", \"Lock avatar\")}\n            helpText={pgettext(\n              \"profile avatar moderation field\",\n              \"Locking user avatar will prohibit user from changing his avatar and will reset his/her avatar to default one.\"\n            )}\n            for=\"id_is_avatar_locked\"\n          >\n            <YesNoSwitch\n              id=\"id_is_avatar_locked\"\n              disabled={this.state.isLoading}\n              iconOn=\"lock_outline\"\n              iconOff=\"lock_open\"\n              labelOn={pgettext(\n                \"profile avatar moderation field\",\n                \"Disallow user from changing avatar\"\n              )}\n              labelOff={pgettext(\n                \"profile avatar moderation field\",\n                \"Allow user to change avatar\"\n              )}\n              onChange={this.bindInput(\"is_avatar_locked\")}\n              value={this.state.is_avatar_locked}\n            />\n          </FormGroup>\n\n          <FormGroup\n            label={pgettext(\"profile avatar moderation field\", \"User message\")}\n            helpText={pgettext(\n              \"profile avatar moderation field\",\n              \"Optional message for user explaining why they are prohibited from changing their avatar.\"\n            )}\n            for=\"id_avatar_lock_user_message\"\n          >\n            <textarea\n              id=\"id_avatar_lock_user_message\"\n              className=\"form-control\"\n              rows=\"4\"\n              disabled={this.state.isLoading}\n              onChange={this.bindInput(\"avatar_lock_user_message\")}\n              value={this.state.avatar_lock_user_message}\n            />\n          </FormGroup>\n\n          <FormGroup\n            label={pgettext(\"profile avatar moderation field\", \"Staff message\")}\n            helpText={pgettext(\n              \"profile avatar moderation field\",\n              \"Optional message for forum team members explaining why the user is prohibited form changing their avatar.\"\n            )}\n            for=\"id_avatar_lock_staff_message\"\n          >\n            <textarea\n              id=\"id_avatar_lock_staff_message\"\n              className=\"form-control\"\n              rows=\"4\"\n              disabled={this.state.isLoading}\n              onChange={this.bindInput(\"avatar_lock_staff_message\")}\n              value={this.state.avatar_lock_staff_message}\n            />\n          </FormGroup>\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            type=\"button\"\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n          >\n            {pgettext(\"profile avatar moderation btn\", \"Close\")}\n          </button>\n          <Button className=\"btn-primary\" loading={this.state.isLoading}>\n            {pgettext(\"profile avatar moderation btn\", \"Save changes\")}\n          </Button>\n        </div>\n      </form>\n    )\n  }\n\n  getModalBody() {\n    if (this.state.error) {\n      return (\n        <ModalMessage icon=\"remove_circle_outline\" message={this.state.error} />\n      )\n    } else if (this.state.isLoaded) {\n      return this.getFormBody()\n    } else {\n      return <Loader />\n    }\n  }\n\n  getClassName() {\n    if (this.state.error) {\n      return \"modal-dialog modal-message modal-avatar-controls\"\n    } else {\n      return \"modal-dialog modal-avatar-controls\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"profile avatar moderation title\", \"Avatar controls\")}\n            </h4>\n          </div>\n          {this.getModalBody()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport { addNameChange } from \"misago/reducers/username-history\"\nimport { updateUsername } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      isLoading: false,\n      error: null,\n\n      username: \"\",\n      validators: {\n        username: [validators.usernameContent()],\n      },\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.profile.api.moderate_username).then(\n      () => {\n        this.setState({\n          isLoaded: true,\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isLoaded: true,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(this.validate().username[0])\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(this.props.profile.api.moderate_username, {\n      username: this.state.username,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.setState({\n      username: \"\",\n    })\n\n    store.dispatch(\n      addNameChange(apiResponse, this.props.profile, this.props.user)\n    )\n    store.dispatch(\n      updateUsername(this.props.profile, apiResponse.username, apiResponse.slug)\n    )\n\n    snackbar.success(\n      pgettext(\"profile username moderation\", \"Username has been changed.\")\n    )\n  }\n\n  getFormBody() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"modal-body\">\n          <FormGroup\n            label={pgettext(\n              \"profile username moderation field\",\n              \"New username\"\n            )}\n            for=\"id_username\"\n          >\n            <input\n              type=\"text\"\n              id=\"id_username\"\n              className=\"form-control\"\n              disabled={this.state.isLoading}\n              onChange={this.bindInput(\"username\")}\n              value={this.state.username}\n            />\n          </FormGroup>\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            disabled={this.state.isLoading}\n            type=\"button\"\n          >\n            {pgettext(\"profile username moderation btn\", \"Cancel\")}\n          </button>\n          <Button className=\"btn-primary\" loading={this.state.isLoading}>\n            {pgettext(\"profile username moderation btn\", \"Change username\")}\n          </Button>\n        </div>\n      </form>\n    )\n  }\n\n  getModalBody() {\n    if (this.state.error) {\n      return (\n        <ModalMessage icon=\"remove_circle_outline\" message={this.state.error} />\n      )\n    } else if (this.state.isLoaded) {\n      return this.getFormBody()\n    } else {\n      return <Loader />\n    }\n  }\n\n  getClassName() {\n    if (this.state.error) {\n      return \"modal-dialog modal-message modal-rename-user\"\n    } else {\n      return \"modal-dialog modal-rename-user\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"profile username moderation title\", \"Change username\")}\n            </h4>\n          </div>\n          {this.getModalBody()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport Loader from \"misago/components/modal-loader\"\nimport ModalMessage from \"misago/components/modal-message\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      isLoading: false,\n      isDeleted: false,\n      error: null,\n\n      countdown: 5,\n      confirm: false,\n\n      with_content: false,\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.profile.api.delete).then(\n      () => {\n        this.setState({\n          isLoaded: true,\n        })\n\n        this.countdown()\n      },\n      (rejection) => {\n        this.setState({\n          isLoaded: true,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  countdown = () => {\n    window.setTimeout(() => {\n      if (this.state.countdown > 1) {\n        this.setState({\n          countdown: this.state.countdown - 1,\n        })\n        this.countdown()\n      } else if (!this.state.confirm) {\n        this.setState({\n          confirm: true,\n        })\n      }\n    }, 1000)\n  }\n\n  send() {\n    return ajax.post(this.props.profile.api.delete, {\n      with_content: this.state.with_content,\n    })\n  }\n\n  handleSuccess() {\n    polls.stop(\"user-profile\")\n\n    if (this.state.with_content) {\n      this.setState({\n        isDeleted: interpolate(\n          pgettext(\n            \"profile delete\",\n            \"%(username)s's account, threads, posts and other content has been deleted.\"\n          ),\n          {\n            username: this.props.profile.username,\n          },\n          true\n        ),\n      })\n    } else {\n      this.setState({\n        isDeleted: interpolate(\n          pgettext(\n            \"profile delete\",\n            \"%(username)s's account has been deleted and other content has been hidden.\"\n          ),\n          {\n            username: this.props.profile.username,\n          },\n          true\n        ),\n      })\n    }\n  }\n\n  getButtonLabel() {\n    if (this.state.confirm) {\n      return interpolate(\n        pgettext(\"profile delete btn\", \"Delete %(username)s\"),\n        {\n          username: this.props.profile.username,\n        },\n        true\n      )\n    } else {\n      return interpolate(\n        pgettext(\"profile delete btn\", \"Please wait... (%(countdown)ss)\"),\n        {\n          countdown: this.state.countdown,\n        },\n        true\n      )\n    }\n  }\n\n  getForm() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"modal-body\">\n          <FormGroup\n            label={pgettext(\"profile delete\", \"User content\")}\n            for=\"id_with_content\"\n          >\n            <YesNoSwitch\n              id=\"id_with_content\"\n              disabled={this.state.isLoading}\n              labelOn={pgettext(\n                \"profile delete content\",\n                \"Delete together with user's account\"\n              )}\n              labelOff={pgettext(\n                \"profile delete content\",\n                \"Hide after deleting user's account\"\n              )}\n              onChange={this.bindInput(\"with_content\")}\n              value={this.state.with_content}\n            />\n          </FormGroup>\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            type=\"button\"\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n          >\n            {pgettext(\"profile delete btn\", \"Cancel\")}\n          </button>\n\n          <Button\n            className=\"btn-danger\"\n            loading={this.state.isLoading}\n            disabled={!this.state.confirm}\n          >\n            {this.getButtonLabel()}\n          </Button>\n        </div>\n      </form>\n    )\n  }\n\n  getDeletedBody() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">info_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">{this.state.isDeleted}</p>\n          <p>\n            <a href={misago.get(\"USERS_LIST_URL\")}>\n              {pgettext(\"profile delete link\", \"Return to users list\")}\n            </a>\n          </p>\n        </div>\n      </div>\n    )\n  }\n\n  getModalBody() {\n    if (this.state.error) {\n      return (\n        <ModalMessage icon=\"remove_circle_outline\" message={this.state.error} />\n      )\n    } else if (this.state.isLoaded) {\n      if (this.state.isDeleted) {\n        return this.getDeletedBody()\n      } else {\n        return this.getForm()\n      }\n    } else {\n      return <Loader />\n    }\n  }\n\n  getClassName() {\n    if (this.state.error || this.state.isDeleted) {\n      return \"modal-dialog modal-message modal-delete-account\"\n    } else {\n      return \"modal-dialog modal-delete-account\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"profile delete title\", \"Delete user account\")}\n            </h4>\n          </div>\n          {this.getModalBody()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport AvatarControls from \"misago/components/profile/moderation/avatar-controls\"\nimport ChangeUsername from \"misago/components/profile/moderation/change-username\"\nimport DeleteAccount from \"misago/components/profile/moderation/delete-account\"\nimport modal from \"misago/services/modal\"\n\nlet select = function (store) {\n  return {\n    tick: store.tick,\n    user: store.auth,\n    profile: store.profile,\n  }\n}\n\nexport default class extends React.Component {\n  showAvatarDialog = () => {\n    modal.show(connect(select)(AvatarControls))\n  }\n\n  showRenameDialog = () => {\n    modal.show(connect(select)(ChangeUsername))\n  }\n\n  showDeleteDialog = () => {\n    modal.show(connect(select)(DeleteAccount))\n  }\n\n  render() {\n    const { moderation } = this.props\n\n    return (\n      <ul className=\"dropdown-menu dropdown-menu-right\" role=\"menu\">\n        {!!moderation.avatar && (\n          <li>\n            <button\n              type=\"button\"\n              className=\"btn btn-link\"\n              onClick={this.showAvatarDialog}\n            >\n              <span className=\"material-icon\">portrait</span>\n              {pgettext(\"profile moderation menu\", \"Avatar controls\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.rename && (\n          <li>\n            <button\n              type=\"button\"\n              className=\"btn btn-link\"\n              onClick={this.showRenameDialog}\n            >\n              <span className=\"material-icon\">credit_card</span>\n              {pgettext(\"profile moderation menu\", \"Change username\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.delete && (\n          <li>\n            <button\n              type=\"button\"\n              className=\"btn btn-link\"\n              onClick={this.showDeleteDialog}\n            >\n              <span className=\"material-icon\">clear</span>\n              {pgettext(\"profile moderation menu\", \"Delete account\")}\n            </button>\n          </li>\n        )}\n      </ul>\n    )\n  }\n}\n","import React from \"react\"\nimport Status, { StatusIcon, StatusLabel } from \"../user-status\"\n\nconst ProfileDataList = ({ profile }) => (\n  <ul className=\"profile-data-list\">\n    {profile.is_active === false && (\n      <li className=\"user-account-disabled\">\n        <abbr\n          title={pgettext(\n            \"profile data list\",\n            \"This user's account has been disabled by administrator.\"\n          )}\n        >\n          {pgettext(\"profile data list\", \"Account disabled\")}\n        </abbr>\n      </li>\n    )}\n    <li className=\"user-status-display\">\n      <Status user={profile} status={profile.status}>\n        <StatusIcon user={profile} status={profile.status} />\n        <StatusLabel\n          user={profile}\n          status={profile.status}\n          className=\"status-label\"\n        />\n      </Status>\n    </li>\n    {profile.rank.is_tab ? (\n      <li className=\"user-rank\">\n        <a href={profile.rank.url} className=\"item-title\">\n          {profile.rank.name}\n        </a>\n      </li>\n    ) : (\n      <li className=\"user-rank\">\n        <span className=\"item-title\">{profile.rank.name}</span>\n      </li>\n    )}\n    {(profile.title || profile.rank.title) && (\n      <li className=\"user-title\">{profile.title || profile.rank.title}</li>\n    )}\n    <li className=\"user-joined-on\">\n      <abbr\n        title={interpolate(\n          pgettext(\"profile data list\", \"Joined on %(joined_on)s\"),\n          {\n            joined_on: profile.joined_on.format(\"LL, LT\"),\n          },\n          true\n        )}\n      >\n        {interpolate(\n          pgettext(\"profile data list\", \"Joined %(joined_on)s\"),\n          {\n            joined_on: profile.joined_on.fromNow(),\n          },\n          true\n        )}\n      </abbr>\n    </li>\n    {profile.email && (\n      <li className=\"user-email\">\n        <a href={\"mailto:\" + profile.email} className=\"item-title\">\n          {profile.email}\n        </a>\n      </li>\n    )}\n  </ul>\n)\n\nexport default ProfileDataList\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n  PageHeader,\n  PageHeaderBanner,\n  PageHeaderContainer,\n  PageHeaderDetails,\n} from \"../PageHeader\"\nimport FollowButton from \"./follow-button\"\nimport MessageButton from \"./message-button\"\nimport ModerationOptions from \"./moderation/nav\"\nimport ProfileDataList from \"./ProfileDataList\"\n\nconst ProfileHeader = ({ profile, user, moderation, message, follow }) => (\n  <PageHeaderContainer>\n    <PageHeader\n      styleName={\n        profile.rank.css_class ? \"rank-\" + profile.rank.css_class : \"profile\"\n      }\n    >\n      <PageHeaderBanner\n        styleName={\n          profile.rank.css_class ? \"rank-\" + profile.rank.css_class : \"profile\"\n        }\n      >\n        <div className=\"profile-page-header\">\n          <div className=\"profile-page-header-avatar\">\n            <Avatar\n              className=\"user-avatar hidden-sm hidden-md hidden-lg\"\n              user={profile}\n              size={200}\n              size2x={400}\n            />\n            <Avatar\n              className=\"user-avatar hidden-xs hidden-md hidden-lg\"\n              user={profile}\n              size={64}\n              size2x={128}\n            />\n            <Avatar\n              className=\"user-avatar hidden-xs hidden-sm\"\n              user={profile}\n              size={128}\n              size2x={256}\n            />\n          </div>\n          <h1>{profile.username}</h1>\n        </div>\n      </PageHeaderBanner>\n      <PageHeaderDetails className=\"profile-page-header-details\">\n        <FlexRow>\n          <FlexRowSection auto>\n            <FlexRowCol>\n              <ProfileDataList profile={profile} />\n            </FlexRowCol>\n          </FlexRowSection>\n          {message && (\n            <FlexRowSection>\n              <FlexRowCol>\n                <MessageButton\n                  className=\"btn btn-default btn-block btn-outline\"\n                  profile={profile}\n                  user={user}\n                />\n              </FlexRowCol>\n              {moderation.available && !follow && (\n                <FlexRowCol shrink>\n                  <div className=\"dropdown\">\n                    <ProfileModerationButton />\n                    <ModerationOptions\n                      profile={profile}\n                      moderation={moderation}\n                    />\n                  </div>\n                </FlexRowCol>\n              )}\n            </FlexRowSection>\n          )}\n          {follow && (\n            <FlexRowSection>\n              <FlexRowCol>\n                <FollowButton\n                  className=\"btn btn-block btn-outline\"\n                  profile={profile}\n                />\n              </FlexRowCol>\n              {moderation.available && (\n                <FlexRowCol shrink>\n                  <div className=\"dropdown\">\n                    <ProfileModerationButton />\n                    <ModerationOptions\n                      profile={profile}\n                      moderation={moderation}\n                    />\n                  </div>\n                </FlexRowCol>\n              )}\n            </FlexRowSection>\n          )}\n          {moderation.available && !follow && !message && (\n            <FlexRowSection>\n              <FlexRowCol className=\"hidden-xs\" shrink>\n                <div className=\"dropdown\">\n                  <ProfileModerationButton />\n                  <ModerationOptions\n                    profile={profile}\n                    moderation={moderation}\n                  />\n                </div>\n              </FlexRowCol>\n              <FlexRowCol className=\"hidden-sm hidden-md hidden-lg\">\n                <div className=\"dropdown\">\n                  <button\n                    className=\"btn btn-default btn-block btn-outline dropdown-toggle\"\n                    type=\"button\"\n                    data-toggle=\"dropdown\"\n                    aria-haspopup=\"true\"\n                    aria-expanded=\"false\"\n                  >\n                    <span className=\"material-icon\">settings</span>\n                    {pgettext(\"profile options btn\", \"Options\")}\n                  </button>\n                  <ModerationOptions\n                    profile={profile}\n                    moderation={moderation}\n                  />\n                </div>\n              </FlexRowCol>\n            </FlexRowSection>\n          )}\n        </FlexRow>\n      </PageHeaderDetails>\n    </PageHeader>\n  </PageHeaderContainer>\n)\n\nconst ProfileModerationButton = () => (\n  <button\n    className=\"btn btn-default btn-icon btn-outline dropdown-toggle\"\n    type=\"button\"\n    title={pgettext(\"profile options btn\", \"Options\")}\n    data-toggle=\"dropdown\"\n    aria-haspopup=\"true\"\n    aria-expanded=\"false\"\n  >\n    <span className=\"material-icon\">settings</span>\n  </button>\n)\n\nexport default ProfileHeader\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst ProfileNav = ({ baseUrl, page, pages }) => (\n  <div className=\"nav-container\">\n    <div className=\"dropdown hidden-sm hidden-md hidden-lg\">\n      <button\n        className=\"btn btn-default btn-block btn-outline dropdown-toggle\"\n        type=\"button\"\n        data-toggle=\"dropdown\"\n        aria-haspopup=\"true\"\n        aria-expanded=\"false\"\n      >\n        <span className=\"material-icon\">{page.icon}</span>\n        {page.name}\n      </button>\n      <ul className=\"dropdown-menu stick-to-bottom\">\n        {pages.map((page) => (\n          <li key={page.component}>\n            <Link to={baseUrl + page.component + \"/\"}>\n              <span className=\"material-icon\">{page.icon}</span>\n              {page.name}\n            </Link>\n          </li>\n        ))}\n      </ul>\n    </div>\n    <ul className=\"nav nav-pills hidden-xs\" role=\"menu\">\n      {pages.map((page) => (\n        <Li path={baseUrl + page.component + \"/\"} key={page.component}>\n          <Link to={baseUrl + page.component + \"/\"}>\n            <span className=\"material-icon\">{page.icon}</span>\n            {page.name}\n          </Link>\n        </Li>\n      ))}\n    </ul>\n  </div>\n)\n\nexport default ProfileNav\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport BanDetails from \"./ban-details\"\nimport Details from \"./details\"\nimport { Posts, Threads } from \"./feed\"\nimport Followers from \"./followers\"\nimport Follows from \"./follows\"\nimport UsernameHistory from \"./username-history\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport PageContainer from \"../PageContainer\"\nimport ProfileHeader from \"./ProfileHeader\"\nimport ProfileNav from \"./ProfileNav\"\n\nexport default class extends WithDropdown {\n  constructor(props) {\n    super(props)\n\n    this.startPolling(props.profile.api.index)\n  }\n\n  startPolling(api) {\n    polls.start({\n      poll: \"user-profile\",\n      url: api,\n      frequency: 90 * 1000,\n      update: this.update,\n    })\n  }\n\n  update = (data) => {\n    store.dispatch(hydrate(data))\n  }\n\n  render() {\n    const baseUrl = misago.get(\"PROFILE\").url\n    const pages = misago.get(\"PROFILE_PAGES\")\n    const page = pages.filter((page) => {\n      const url = baseUrl + page.component + \"/\"\n      return this.props.location.pathname === url\n    })[0]\n    const { profile, user } = this.props\n    const moderation = getModeration(profile, user)\n    const message =\n      !!user.acl.can_start_private_threads && profile.id !== user.id\n    const follow = !!profile.acl.can_follow && profile.id !== user.id\n\n    return (\n      <div className=\"page page-user-profile\">\n        <ProfileHeader\n          profile={this.props.profile}\n          user={this.props.user}\n          moderation={moderation}\n          message={message}\n          follow={follow}\n        />\n        <PageContainer>\n          <ProfileNav baseUrl={baseUrl} page={page} pages={pages} />\n\n          {this.props.children}\n        </PageContainer>\n      </div>\n    )\n  }\n}\n\nconst getModeration = (profile, user) => {\n  const moderation = {\n    available: false,\n    rename: false,\n    avatar: false,\n    delete: false,\n  }\n\n  if (user.is_anonymous) return moderation\n\n  moderation.rename = profile.acl.can_rename\n  moderation.avatar = profile.acl.can_moderate_avatar\n  moderation.delete = profile.acl.can_delete\n  moderation.available = !!(\n    moderation.rename ||\n    moderation.avatar ||\n    moderation.delete\n  )\n\n  return moderation\n}\n\nexport function select(store) {\n  return {\n    isAuthenticated: store.auth.user.id === store.profile.id,\n\n    tick: store.tick.tick,\n    user: store.auth.user,\n    users: store.users,\n    posts: store.posts,\n    profile: store.profile,\n    profileDetails: store[\"profile-details\"],\n    \"username-history\": store[\"username-history\"],\n  }\n}\n\nconst COMPONENTS = {\n  posts: Posts,\n  threads: Threads,\n  followers: Followers,\n  follows: Follows,\n  details: Details,\n  \"username-history\": UsernameHistory,\n  \"ban-details\": BanDetails,\n}\n\nexport function paths() {\n  let paths = []\n  misago.get(\"PROFILE_PAGES\").forEach(function (item) {\n    paths.push(\n      Object.assign({}, item, {\n        path: misago.get(\"PROFILE\").url + item.component + \"/\",\n        component: connect(select)(COMPONENTS[item.component]),\n      })\n    )\n  })\n\n  return paths\n}\n","import React from \"react\"\nimport Route from \"./route\"\n\nexport function Threads(props) {\n  let emptyMessage = null\n  if (props.user.id === props.profile.id) {\n    emptyMessage = pgettext(\n      \"profile threads\",\n      \"You haven't started any threads.\"\n    )\n  } else {\n    emptyMessage = interpolate(\n      pgettext(\"profile threads\", \"%(username)s hasn't started any threads\"),\n      {\n        username: props.profile.username,\n      },\n      true\n    )\n  }\n\n  let header = null\n  if (!props.posts.isLoaded) {\n    header = pgettext(\"profile threads\", \"Loading...\")\n  } else if (props.profile.id === props.user.id) {\n    const message = npgettext(\n      \"profile threads\",\n      \"You have started %(threads)s thread.\",\n      \"You have started %(threads)s threads.\",\n      props.profile.threads\n    )\n\n    header = interpolate(\n      message,\n      {\n        threads: props.profile.threads,\n      },\n      true\n    )\n  } else {\n    const message = npgettext(\n      \"profile threads\",\n      \"%(username)s has started %(threads)s thread.\",\n      \"%(username)s has started %(threads)s threads.\",\n      props.profile.threads\n    )\n\n    header = interpolate(\n      message,\n      {\n        username: props.profile.username,\n        threads: props.profile.threads,\n      },\n      true\n    )\n  }\n\n  return (\n    <Route\n      api={props.profile.api.threads}\n      emptyMessage={emptyMessage}\n      header={header}\n      title={pgettext(\"profile threads title\", \"Threads\")}\n      {...props}\n    />\n  )\n}\n\nexport function Posts(props) {\n  let emptyMessage = null\n  if (props.user.id === props.profile.id) {\n    emptyMessage = pgettext(\"profile posts\", \"You have posted no messages.\")\n  } else {\n    emptyMessage = interpolate(\n      pgettext(\"profile posts\", \"%(username)s posted no messages.\"),\n      {\n        username: props.profile.username,\n      },\n      true\n    )\n  }\n\n  let header = null\n  if (!props.posts.isLoaded) {\n    header = pgettext(\"profile posts\", \"Loading...\")\n  } else if (props.profile.id === props.user.id) {\n    const message = npgettext(\n      \"profile posts\",\n      \"You have posted %(posts)s message.\",\n      \"You have posted %(posts)s messages.\",\n      props.profile.posts\n    )\n\n    header = interpolate(\n      message,\n      {\n        posts: props.profile.posts,\n      },\n      true\n    )\n  } else {\n    const message = npgettext(\n      \"profile posts\",\n      \"%(username)s has posted %(posts)s message.\",\n      \"%(username)s has posted %(posts)s messages.\",\n      props.profile.posts\n    )\n\n    header = interpolate(\n      message,\n      {\n        username: props.profile.username,\n        posts: props.profile.posts,\n      },\n      true\n    )\n  }\n\n  return (\n    <Route\n      api={props.profile.api.posts}\n      emptyMessage={emptyMessage}\n      header={header}\n      title={pgettext(\"profile posts title\", \"Posts\")}\n      {...props}\n    />\n  )\n}\n","import { connect } from \"react-redux\"\nimport Profile, { paths, select } from \"misago/components/profile/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n  if (context.has(\"PROFILE\") && context.has(\"PROFILE_PAGES\")) {\n    mount({\n      root: misago.get(\"PROFILE\").url,\n      component: connect(select)(Profile),\n      paths: paths(),\n    })\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:profile\",\n  initializer: initializer,\n  after: \"reducer:profile-hydrate\",\n})\n","import React from \"react\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestLinkForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      email: \"\",\n\n      validators: {\n        email: [validators.email()],\n      },\n    }\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(\n        pgettext(\n          \"request activation link form\",\n          \"Enter a valid e-mail address.\"\n        )\n      )\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"SEND_ACTIVATION_API\"), {\n      email: this.state.email,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.props.callback(apiResponse)\n  }\n\n  handleError(rejection) {\n    if ([\"already_active\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n      snackbar.info(rejection.detail)\n    } else if (rejection.status === 403 && rejection.ban) {\n      showBannedPage(rejection.ban)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"well well-form well-form-request-activation-link\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"form-group\">\n            <div className=\"control-input\">\n              <input\n                type=\"text\"\n                className=\"form-control\"\n                placeholder={pgettext(\n                  \"request activation link form field\",\n                  \"Your e-mail address\"\n                )}\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"email\")}\n                value={this.state.email}\n              />\n            </div>\n          </div>\n\n          <Button\n            className=\"btn-primary btn-block\"\n            loading={this.state.isLoading}\n          >\n            {pgettext(\"request activation link form btn\", \"Send link\")}\n          </Button>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport class LinkSent extends React.Component {\n  getMessage() {\n    return interpolate(\n      pgettext(\n        \"request activation link form\",\n        \"Activation link was sent to %(email)s\"\n      ),\n      {\n        email: this.props.user.email,\n      },\n      true\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"well well-form well-form-request-activation-link well-done\">\n        <div className=\"done-message\">\n          <div className=\"message-icon\">\n            <span className=\"material-icon\">check</span>\n          </div>\n          <div className=\"message-body\">\n            <p>{this.getMessage()}</p>\n          </div>\n          <button\n            className=\"btn btn-primary btn-block\"\n            type=\"button\"\n            onClick={this.props.callback}\n          >\n            {pgettext(\n              \"request activation link form btn\",\n              \"Request another link\"\n            )}\n          </button>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      complete: false,\n    }\n  }\n\n  complete = (apiResponse) => {\n    this.setState({\n      complete: apiResponse,\n    })\n  }\n\n  reset = () => {\n    this.setState({\n      complete: false,\n    })\n  }\n\n  render() {\n    if (this.state.complete) {\n      return <LinkSent user={this.state.complete} callback={this.reset} />\n    } else {\n      return <RequestLinkForm callback={this.complete} />\n    }\n  }\n}\n","import misago from \"misago/index\"\nimport RequestActivationLink from \"misago/components/request-activation-link\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n  if (document.getElementById(\"request-activation-link-mount\")) {\n    mount(RequestActivationLink, \"request-activation-link-mount\", false)\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:request-activation-link\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class RequestResetForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      email: \"\",\n\n      validators: {\n        email: [validators.email()],\n      },\n    }\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(\n        pgettext(\"request password reset form\", \"Enter a valid e-mail address.\")\n      )\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"SEND_PASSWORD_RESET_API\"), {\n      email: this.state.email,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.props.callback(apiResponse)\n  }\n\n  handleError(rejection) {\n    if ([\"inactive_user\", \"inactive_admin\"].indexOf(rejection.code) > -1) {\n      this.props.showInactivePage(rejection)\n    } else if (rejection.status === 403 && rejection.ban) {\n      showBannedPage(rejection.ban)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"well well-form well-form-request-password-reset\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"form-group\">\n            <div className=\"control-input\">\n              <input\n                type=\"text\"\n                className=\"form-control\"\n                placeholder={pgettext(\n                  \"request password reset form field\",\n                  \"Your e-mail address\"\n                )}\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"email\")}\n                value={this.state.email}\n              />\n            </div>\n          </div>\n\n          <Button\n            className=\"btn-primary btn-block\"\n            loading={this.state.isLoading}\n          >\n            {pgettext(\"request password reset form btn\", \"Send link\")}\n          </Button>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport class LinkSent extends React.Component {\n  getMessage() {\n    return interpolate(\n      pgettext(\n        \"request password reset form\",\n        \"Reset password link was sent to %(email)s\"\n      ),\n      {\n        email: this.props.user.email,\n      },\n      true\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"well well-form well-form-request-password-reset well-done\">\n        <div className=\"done-message\">\n          <div className=\"message-icon\">\n            <span className=\"material-icon\">check</span>\n          </div>\n          <div className=\"message-body\">\n            <p>{this.getMessage()}</p>\n          </div>\n          <button\n            type=\"button\"\n            className=\"btn btn-primary btn-block\"\n            onClick={this.props.callback}\n          >\n            {pgettext(\n              \"request password reset form btn\",\n              \"Request another link\"\n            )}\n          </button>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport class AccountInactivePage extends React.Component {\n  getActivateButton() {\n    if (this.props.activation === \"inactive_user\") {\n      return (\n        <p>\n          <a href={misago.get(\"REQUEST_ACTIVATION_URL\")}>\n            {pgettext(\n              \"request password reset form error\",\n              \"Activate your account.\"\n            )}\n          </a>\n        </p>\n      )\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"page page-message page-message-info page-forgotten-password-inactive\">\n        <div className=\"container\">\n          <div className=\"message-panel\">\n            <div className=\"message-icon\">\n              <span className=\"material-icon\">info_outline</span>\n            </div>\n\n            <div className=\"message-body\">\n              <p className=\"lead\">\n                {pgettext(\n                  \"request password reset form error\",\n                  \"Your account is inactive.\"\n                )}\n              </p>\n              <p>{this.props.message}</p>\n              {this.getActivateButton()}\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      complete: false,\n    }\n  }\n\n  complete = (apiResponse) => {\n    this.setState({\n      complete: apiResponse,\n    })\n  }\n\n  reset = () => {\n    this.setState({\n      complete: false,\n    })\n  }\n\n  showInactivePage(apiResponse) {\n    ReactDOM.render(\n      <AccountInactivePage\n        activation={apiResponse.code}\n        message={apiResponse.detail}\n      />,\n      document.getElementById(\"page-mount\")\n    )\n  }\n\n  render() {\n    if (this.state.complete) {\n      return <LinkSent callback={this.reset} user={this.state.complete} />\n    }\n\n    return (\n      <RequestResetForm\n        callback={this.complete}\n        showInactivePage={this.showInactivePage}\n      />\n    )\n  }\n}\n","import misago from \"misago/index\"\nimport RequestPasswordReset from \"misago/components/request-password-reset\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n  if (document.getElementById(\"request-password-reset-mount\")) {\n    mount(RequestPasswordReset, \"request-password-reset-mount\", false)\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:request-password-reset\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport misago from \"misago/index\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport SignInModal from \"misago/components/sign-in.js\"\nimport ajax from \"misago/services/ajax\"\nimport auth from \"misago/services/auth\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport showBannedPage from \"misago/utils/banned-page\"\n\nexport class ResetPasswordForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      password: \"\",\n    }\n  }\n\n  clean() {\n    if (this.state.password.trim().length) {\n      return true\n    } else {\n      snackbar.error(pgettext(\"password reset form\", \"Enter new password.\"))\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"CHANGE_PASSWORD_API\"), {\n      password: this.state.password,\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.props.callback(apiResponse)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 403 && rejection.ban) {\n      showBannedPage(rejection.ban)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"well well-form well-form-reset-password\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"form-group\">\n            <div className=\"control-input\">\n              <input\n                type=\"password\"\n                className=\"form-control\"\n                placeholder={pgettext(\n                  \"password reset form field\",\n                  \"Enter new password\"\n                )}\n                disabled={this.state.isLoading}\n                onChange={this.bindInput(\"password\")}\n                value={this.state.password}\n              />\n            </div>\n          </div>\n\n          <Button\n            className=\"btn-primary btn-block\"\n            loading={this.state.isLoading}\n          >\n            {pgettext(\"password reset form btn\", \"Change password\")}\n          </Button>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport class PasswordChangedPage extends React.Component {\n  getMessage() {\n    return interpolate(\n      pgettext(\n        \"password reset form\",\n        \"%(username)s, your password has been changed.\"\n      ),\n      {\n        username: this.props.user.username,\n      },\n      true\n    )\n  }\n\n  showSignIn() {\n    modal.show(SignInModal)\n  }\n\n  render() {\n    return (\n      <div className=\"page page-message page-message-success page-forgotten-password-changed\">\n        <div className=\"container\">\n          <div className=\"message-panel\">\n            <div className=\"message-icon\">\n              <span className=\"material-icon\">check</span>\n            </div>\n\n            <div className=\"message-body\">\n              <p className=\"lead\">{this.getMessage()}</p>\n              <p>\n                {pgettext(\n                  \"password reset form\",\n                  \"Sign in using new password to continue.\"\n                )}\n              </p>\n              <p>\n                <button\n                  type=\"button\"\n                  className=\"btn btn-primary\"\n                  onClick={this.showSignIn}\n                >\n                  {pgettext(\"password reset form btn\", \"Sign in\")}\n                </button>\n              </p>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport default class extends React.Component {\n  complete = (apiResponse) => {\n    auth.softSignOut()\n\n    // nuke \"redirect_to\" field so we don't end\n    // coming back to error page after sign in\n    $('#hidden-login-form input[name=\"redirect_to\"]').remove()\n\n    ReactDOM.render(\n      <PasswordChangedPage user={apiResponse} />,\n      document.getElementById(\"page-mount\")\n    )\n  }\n\n  render() {\n    return <ResetPasswordForm callback={this.complete} />\n  }\n}\n","import misago from \"misago\"\nimport ResetPasswordForm from \"misago/components/reset-password-form\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n  if (document.getElementById(\"reset-password-form-mount\")) {\n    mount(ResetPasswordForm, \"reset-password-form-mount\", false)\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:reset-password-form\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SearchOverlay } from \"../../components/Search\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  const root = document.getElementById(\"search-mount\")\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <SearchOverlay />\n    </Provider>,\n    root\n  )\n}\n\nmisago.addInitializer({\n  name: \"component:search-overlay\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport misago from \"misago\"\nimport Form from \"misago/components/form\"\nimport { load as updatePosts } from \"misago/reducers/posts\"\nimport { update as updateSearch } from \"misago/reducers/search\"\nimport { hydrate as updateUsers } from \"misago/reducers/users\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../FlexRow\"\nimport {\n  PageHeader,\n  PageHeaderContainer,\n  PageHeaderBanner,\n  PageHeaderDetails,\n} from \"../PageHeader\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n      query: props.search.query,\n    }\n  }\n\n  componentDidMount() {\n    if (this.state.query.length) {\n      this.handleSubmit()\n    }\n  }\n\n  onQueryChange = (event) => {\n    this.changeValue(\"query\", event.target.value)\n  }\n\n  clean() {\n    if (!this.state.query.trim().length) {\n      snackbar.error(pgettext(\"search form\", \"You have to enter search query.\"))\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    store.dispatch(\n      updateSearch({\n        isLoading: true,\n      })\n    )\n\n    const query = this.state.query.trim()\n\n    let url = window.location.href\n    const urlQuery = url.indexOf(\"?q=\")\n    if (urlQuery > 0) {\n      url = url.substring(0, urlQuery + 3)\n    }\n    window.history.pushState({}, \"\", url + encodeURIComponent(query))\n\n    return ajax.get(misago.get(\"SEARCH_API\"), { q: query })\n  }\n\n  handleSuccess(providers) {\n    store.dispatch(\n      updateSearch({\n        query: this.state.query.trim(),\n        isLoading: false,\n        providers,\n      })\n    )\n\n    providers.forEach((provider) => {\n      if (provider.id === \"users\") {\n        store.dispatch(updateUsers(provider.results.results))\n      } else if (provider.id === \"threads\") {\n        store.dispatch(updatePosts(provider.results))\n      }\n    })\n  }\n\n  handleError(rejection) {\n    snackbar.apiError(rejection)\n\n    store.dispatch(\n      updateSearch({\n        isLoading: false,\n      })\n    )\n  }\n\n  render() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <PageHeaderContainer>\n          <PageHeader styleName=\"site-search\">\n            <PageHeaderBanner styleName=\"site-search\">\n              <h1>{pgettext(\"search form title\", \"Search\")}</h1>\n            </PageHeaderBanner>\n            <PageHeaderDetails className=\"page-header-search-form\">\n              <FlexRow>\n                <FlexRowSection auto>\n                  <FlexRowCol>\n                    <input\n                      className=\"form-control\"\n                      disabled={this.state.isLoading}\n                      type=\"text\"\n                      value={this.state.query}\n                      placeholder={pgettext(\"search form input\", \"Search\")}\n                      onChange={this.onQueryChange}\n                    />\n                  </FlexRowCol>\n                  <FlexRowCol shrink>\n                    <button\n                      className=\"btn btn-secondary btn-icon btn-outline\"\n                      title={pgettext(\"search form btn\", \"Search\")}\n                      disabled={this.state.isLoading}\n                    >\n                      <span className=\"material-icon\">search</span>\n                    </button>\n                  </FlexRowCol>\n                </FlexRowSection>\n              </FlexRow>\n            </PageHeaderDetails>\n          </PageHeader>\n        </PageHeaderContainer>\n      </form>\n    )\n  }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nexport default function (props) {\n  return (\n    <div className=\"list-group nav-side\">\n      {props.providers.map((provider) => {\n        return (\n          <Link\n            activeClassName=\"active\"\n            className=\"list-group-item\"\n            key={provider.id}\n            to={provider.url}\n          >\n            <span className=\"material-icon\">{provider.icon}</span>\n            {provider.name}\n            <Badge results={provider.results} />\n          </Link>\n        )\n      })}\n    </div>\n  )\n}\n\nexport function Badge(props) {\n  if (!props.results) return null\n\n  let count = props.results.count\n  if (count > 1000000) {\n    count = Math.ceil(count / 1000000) + \"KK\"\n  } else if (count > 1000) {\n    count = Math.ceil(count / 1000) + \"K\"\n  }\n\n  return <span className=\"badge\">{count}</span>\n}\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport SearchForm from \"./form\"\nimport SideNav from \"./sidenav\"\n\nexport default function (props) {\n  return (\n    <div className=\"page page-search\">\n      <SearchForm provider={props.provider} search={props.search} />\n      <PageContainer>\n        <div className=\"row\">\n          <div className=\"col-md-3\">\n            <SideNav providers={props.search.providers} />\n          </div>\n          <div className=\"col-md-9\">\n            {props.children}\n            <SearchTime provider={props.provider} search={props.search} />\n          </div>\n        </div>\n      </PageContainer>\n    </div>\n  )\n}\n\nexport function SearchTime(props) {\n  let time = null\n  props.search.providers.forEach((p) => {\n    if (p.id === props.provider.id) {\n      time = p.time\n    }\n  })\n\n  if (time === null) return null\n\n  const copy = pgettext(\"search time\", \"Search took %(time)s s\")\n\n  return (\n    <footer className=\"search-footer\">\n      <p>{interpolate(copy, { time }, true)}</p>\n    </footer>\n  )\n}\n","import React from \"react\"\nimport PostFeed from \"misago/components/post-feed\"\nimport Button from \"misago/components/button\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport {\n  update as updatePosts,\n  append as appendPosts,\n} from \"misago/reducers/posts\"\nimport { updateProvider } from \"misago/reducers/search\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n  return (\n    <div>\n      <PostFeed isReady={true} posts={props.results} />\n      <LoadMore {...props} />\n    </div>\n  )\n}\n\nexport class LoadMore extends React.Component {\n  onClick = () => {\n    store.dispatch(\n      updatePosts({\n        isBusy: true,\n      })\n    )\n\n    ajax\n      .get(this.props.provider.api, {\n        q: this.props.query,\n        page: this.props.next,\n      })\n      .then(\n        (providers) => {\n          providers.forEach((provider) => {\n            if (provider.id !== \"threads\") return\n            store.dispatch(appendPosts(provider.results))\n            store.dispatch(updateProvider(provider))\n          })\n\n          store.dispatch(\n            updatePosts({\n              isBusy: false,\n            })\n          )\n        },\n        (rejection) => {\n          snackbar.apiError(rejection)\n\n          store.dispatch(\n            updatePosts({\n              isBusy: false,\n            })\n          )\n        }\n      )\n  }\n\n  render() {\n    if (!this.props.more) return null\n\n    return (\n      <div className=\"pager-more\">\n        <Button\n          className=\"btn btn-default btn-outline\"\n          loading={this.props.isBusy}\n          onClick={this.onClick}\n        >\n          {pgettext(\"search threads btn\", \"Show more\")}\n        </Button>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport Results from \"./results\"\n\nexport default function (props) {\n  return (\n    <SearchPage provider={props.route.provider} search={props.search}>\n      <Blankslate\n        loading={props.search.isLoading}\n        query={props.search.query}\n        posts={props.posts}\n      >\n        <Results\n          provider={props.route.provider}\n          query={props.search.query}\n          {...props.posts}\n        />\n      </Blankslate>\n    </SearchPage>\n  )\n}\n\nexport function Blankslate({ children, loading, posts, query }) {\n  if (posts && posts.count) return children\n\n  if (query.length) {\n    return (\n      <p className=\"lead\">\n        {loading\n          ? pgettext(\"search threads\", \"Loading results...\")\n          : pgettext(\n              \"search threads\",\n              \"No threads matching search query have been found.\"\n            )}\n      </p>\n    )\n  }\n\n  return (\n    <p className=\"lead\">\n      {pgettext(\n        \"search threads\",\n        \"Enter at least two characters to search threads.\"\n      )}\n    </p>\n  )\n}\n","import React from \"react\"\nimport SearchPage from \"../page\"\nimport UsersList from \"misago/components/users-list\"\n\nexport default function (props) {\n  return (\n    <SearchPage provider={props.route.provider} search={props.search}>\n      <Blankslate\n        loading={props.search.isLoading}\n        query={props.search.query}\n        users={props.users}\n      >\n        <UsersList\n          cols={3}\n          isReady={!props.search.isLoading}\n          users={props.users}\n        />\n      </Blankslate>\n    </SearchPage>\n  )\n}\n\nexport function Blankslate({ children, loading, query, users }) {\n  if (users.length) return children\n\n  if (query.length) {\n    return (\n      <p className=\"lead\">\n        {loading\n          ? pgettext(\"search users\", \"Loading results...\")\n          : pgettext(\n              \"search users\",\n              \"No users matching search query have been found.\"\n            )}\n      </p>\n    )\n  }\n\n  return (\n    <p className=\"lead\">\n      {pgettext(\n        \"search users\",\n        \"Enter at least two characters to search users.\"\n      )}\n    </p>\n  )\n}\n","import { connect } from \"react-redux\"\nimport SearchThreads from \"./threads\"\nimport SearchUsers from \"./users\"\n\nconst components = {\n  threads: SearchThreads,\n  users: SearchUsers,\n}\n\nexport function select(store) {\n  return {\n    posts: store.posts,\n    search: store.search,\n    tick: store.tick.tick,\n    user: store.auth.user,\n    users: store.users,\n  }\n}\n\nexport default function (providers) {\n  return providers.map((provider) => {\n    return {\n      path: provider.url,\n      component: connect(select)(components[provider.id]),\n      provider: provider,\n    }\n  })\n}\n","import paths from \"misago/components/search-route\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n  if (context.get(\"CURRENT_LINK\") === \"misago:search\") {\n    mount({\n      paths: paths(misago.get(\"SEARCH_PROVIDERS\")),\n    })\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:search\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { SiteNavOverlay } from \"../../components/SiteNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  const root = document.getElementById(\"site-nav-mount\")\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <SiteNavOverlay />\n    </Provider>,\n    root\n  )\n}\n\nmisago.addInitializer({\n  name: \"component:site-nav-overlay\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\n\nconst TYPES_CLASSES = {\n  info: \"alert-info\",\n  success: \"alert-success\",\n  warning: \"alert-warning\",\n  error: \"alert-danger\",\n}\n\nexport class Snackbar extends React.Component {\n  getSnackbarClass() {\n    let snackbarClass = \"alerts-snackbar\"\n    if (this.props.isVisible) {\n      snackbarClass += \" in\"\n    } else {\n      snackbarClass += \" out\"\n    }\n    return snackbarClass\n  }\n\n  render() {\n    return (\n      <div className={this.getSnackbarClass()}>\n        <p className={\"alert \" + TYPES_CLASSES[this.props.type]}>\n          {this.props.message}\n        </p>\n      </div>\n    )\n  }\n}\n\nexport function select(state) {\n  return state.snackbar\n}\n","import { connect } from \"react-redux\"\nimport misago from \"misago/index\"\nimport { Snackbar, select } from \"misago/components/snackbar\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer() {\n  mount(connect(select)(Snackbar), \"snackbar-mount\")\n}\n\nmisago.addInitializer({\n  name: \"component:snackbar\",\n  initializer: initializer,\n  after: \"snackbar\",\n})\n","import React from \"react\"\nimport {\n  PageHeader,\n  PageHeaderBanner,\n  PageHeaderContainer,\n} from \"../PageHeader\"\n\nconst Header = ({ backendName }) => {\n  const pageTitleTpl = pgettext(\"social auth title\", \"Sign in with %(backend)s\")\n  const pageTitle = interpolate(pageTitleTpl, { backend: backendName }, true)\n\n  return (\n    <PageHeaderContainer>\n      <PageHeader styleName=\"social-auth\">\n        <PageHeaderBanner styleName=\"social-auth\">\n          <h1>{pageTitle}</h1>\n        </PageHeaderBanner>\n      </PageHeader>\n    </PageHeaderContainer>\n  )\n}\n\nexport default Header\n","import React from \"react\"\nimport misago from \"misago\"\nimport RegisterLegalFootnote from \"misago/components/RegisterLegalFootnote\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport * as validators from \"misago/utils/validators\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nexport default class Register extends Form {\n  constructor(props) {\n    super(props)\n\n    const formValidators = {\n      email: [validators.email()],\n      username: [validators.usernameContent()],\n    }\n\n    if (!!misago.get(\"TERMS_OF_SERVICE_ID\")) {\n      formValidators.termsOfService = [validators.requiredTermsOfService()]\n    }\n\n    if (!!misago.get(\"PRIVACY_POLICY_ID\")) {\n      formValidators.privacyPolicy = [validators.requiredPrivacyPolicy()]\n    }\n\n    this.state = {\n      email: props.email || \"\",\n      emailProtected: !!props.email,\n      username: props.username || \"\",\n\n      termsOfService: null,\n      privacyPolicy: null,\n\n      validators: formValidators,\n      errors: {},\n\n      isLoading: false,\n    }\n  }\n\n  clean() {\n    let errors = this.validate()\n    let lengths = [\n      this.state.email.trim().length,\n      this.state.username.trim().length,\n    ]\n\n    if (lengths.indexOf(0) !== -1) {\n      snackbar.error(pgettext(\"social auth form\", \"Fill out all fields.\"))\n      return false\n    }\n\n    const { validators } = this.state\n\n    const checkTermsOfService = !!misago.get(\"TERMS_OF_SERVICE_ID\")\n    if (checkTermsOfService && this.state.termsOfService === null) {\n      snackbar.error(validators.termsOfService[0](null))\n      return false\n    }\n\n    const checkPrivacyPolicy = !!misago.get(\"PRIVACY_POLICY_ID\")\n    if (checkPrivacyPolicy && this.state.privacyPolicy === null) {\n      snackbar.error(validators.privacyPolicy[0](null))\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.url, {\n      email: this.state.email,\n      username: this.state.username,\n      terms_of_service: this.state.termsOfService,\n      privacy_policy: this.state.privacyPolicy,\n    })\n  }\n\n  handleSuccess(response) {\n    const { onRegistrationComplete } = this.props\n    onRegistrationComplete(response)\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 200) {\n      // We've entered \"errored\" state because response is HTML instead of exptected JSON\n      const { onRegistrationComplete } = this.props\n      const { username } = this.state\n      onRegistrationComplete({ activation: \"active\", step: \"done\", username })\n    } else if (rejection.status === 400) {\n      const stateUpdate = { errors: rejection }\n      if (rejection.email) {\n        stateUpdate.emailProtected = false\n      }\n      this.setState(stateUpdate)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  handlePrivacyPolicyChange = (event) => {\n    const value = event.target.value\n    this.handleToggleAgreement(\"privacyPolicy\", value)\n  }\n\n  handleTermsOfServiceChange = (event) => {\n    const value = event.target.value\n    this.handleToggleAgreement(\"termsOfService\", value)\n  }\n\n  handleToggleAgreement = (agreement, value) => {\n    this.setState((prevState, props) => {\n      if (prevState[agreement] === null) {\n        const errors = { ...prevState.errors, [agreement]: null }\n        return { errors, [agreement]: value }\n      }\n\n      const validator = this.state.validators[agreement][0]\n      const errors = { ...prevState.errors, [agreement]: [validator(null)] }\n      return { errors, [agreement]: null }\n    })\n  }\n\n  render() {\n    const { backend_name } = this.props\n    const { email, emailProtected, username, isLoading } = this.state\n\n    let emailHelpText = null\n    if (emailProtected) {\n      const emailHelpTextTpl = pgettext(\n        \"social auth form\",\n        \"Your e-mail address has been verified by %(backend)s.\"\n      )\n      emailHelpText = interpolate(\n        emailHelpTextTpl,\n        { backend: backend_name },\n        true\n      )\n    }\n\n    return (\n      <div className=\"page page-social-auth page-social-auth-register\">\n        <Header backendName={backend_name} />\n        <PageContainer>\n          <div className=\"row\">\n            <div className=\"col-md-6 col-md-offset-3\">\n              <form onSubmit={this.handleSubmit}>\n                <div className=\"panel panel-default panel-form\">\n                  <div className=\"panel-heading\">\n                    <h3 className=\"panel-title\">\n                      {pgettext(\n                        \"social auth form title\",\n                        \"Complete your account\"\n                      )}\n                    </h3>\n                  </div>\n                  <div className=\"panel-body\">\n                    <FormGroup\n                      for=\"id_username\"\n                      label={pgettext(\"social auth form field\", \"Username\")}\n                      validation={this.state.errors.username}\n                    >\n                      <input\n                        type=\"text\"\n                        id=\"id_username\"\n                        className=\"form-control\"\n                        disabled={isLoading}\n                        onChange={this.bindInput(\"username\")}\n                        value={username}\n                      />\n                    </FormGroup>\n                    <FormGroup\n                      for=\"id_email\"\n                      label={pgettext(\n                        \"social auth form field\",\n                        \"E-mail address\"\n                      )}\n                      helpText={emailHelpText}\n                      validation={\n                        emailProtected ? null : this.state.errors.email\n                      }\n                    >\n                      <input\n                        type=\"email\"\n                        id=\"id_email\"\n                        className=\"form-control\"\n                        disabled={isLoading || emailProtected}\n                        onChange={this.bindInput(\"email\")}\n                        value={email}\n                      />\n                    </FormGroup>\n                    <RegisterLegalFootnote\n                      errors={this.state.errors}\n                      privacyPolicy={this.state.privacyPolicy}\n                      termsOfService={this.state.termsOfService}\n                      onPrivacyPolicyChange={this.handlePrivacyPolicyChange}\n                      onTermsOfServiceChange={this.handleTermsOfServiceChange}\n                    />\n                  </div>\n                  <div className=\"panel-footer\">\n                    <Button\n                      className=\"btn-primary\"\n                      loading={this.state.isLoading}\n                    >\n                      {pgettext(\"social auth form btn\", \"Sign in\")}\n                    </Button>\n                  </div>\n                </div>\n              </form>\n            </div>\n          </div>\n        </PageContainer>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport PageContainer from \"../PageContainer\"\nimport Header from \"./header\"\n\nconst Complete = ({ activation, backend_name, username }) => {\n  let icon = \"\"\n  let message = \"\"\n  if (activation === \"user\") {\n    message = pgettext(\n      \"account activation required\",\n      \"%(username)s, your account has been created but you need to activate it before you will be able to sign in.\"\n    )\n  } else if (activation === \"admin\") {\n    message = pgettext(\n      \"account activation required\",\n      \"%(username)s, your account has been created but the site administrator will have to activate it before you will be able to sign in.\"\n    )\n  } else {\n    message = pgettext(\n      \"social auth complete\",\n      \"%(username)s, your account has been created and you have been signed in to it.\"\n    )\n  }\n\n  if (activation === \"active\") {\n    icon = \"check\"\n  } else {\n    icon = \"info_outline\"\n  }\n\n  return (\n    <div className=\"page page-social-auth page-social-auth-register\">\n      <Header backendName={backend_name} />\n      <PageContainer>\n        <div className=\"row\">\n          <div className=\"col-md-6 col-md-offset-3\">\n            <div className=\"panel panel-default panel-form\">\n              <div className=\"panel-heading\">\n                <h3 className=\"panel-title\">\n                  {pgettext(\n                    \"social auth complete title\",\n                    \"Registration completed!\"\n                  )}\n                </h3>\n              </div>\n              <div className=\"panel-body panel-message-body\">\n                <div className=\"message-icon\">\n                  <span className=\"material-icon\">{icon}</span>\n                </div>\n                <div className=\"message-body\">\n                  <p className=\"lead\">\n                    {interpolate(message, { username }, true)}\n                  </p>\n                  <p className=\"help-block\">\n                    <a\n                      className=\"btn btn-default\"\n                      href={misago.get(\"MISAGO_PATH\")}\n                    >\n                      {pgettext(\n                        \"social auth complete link\",\n                        \"Return to forum index\"\n                      )}\n                    </a>\n                  </p>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </PageContainer>\n    </div>\n  )\n}\n\nexport default Complete\n","import React from \"react\"\nimport Register from \"./register\"\nimport Complete from \"./complete\"\n\nexport default class SocialAuth extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      step: props.step,\n\n      activation: props.activation || \"\",\n      email: props.email || \"\",\n      username: props.username || \"\",\n    }\n  }\n\n  handleRegistrationComplete = ({ activation, email, step, username }) => {\n    this.setState({ activation, email, step, username })\n  }\n\n  render() {\n    const { backend_name, url } = this.props\n    const { activation, email, step, username } = this.state\n\n    if (step === \"register\") {\n      return (\n        <Register\n          backend_name={backend_name}\n          email={email}\n          url={url}\n          username={username}\n          onRegistrationComplete={this.handleRegistrationComplete}\n        />\n      )\n    }\n\n    return (\n      <Complete\n        activation={activation}\n        backend_name={backend_name}\n        email={email}\n        url={url}\n        username={username}\n      />\n    )\n  }\n}\n","import React from \"react\"\nimport SocialAuth from \"misago/components/social-auth\"\nimport misago from \"misago\"\nimport mount from \"misago/utils/mount-component\"\n\nexport default function initializer(context) {\n  if (context.get(\"CURRENT_LINK\") === \"misago:social-complete\") {\n    const props = context.get(\"SOCIAL_AUTH_FORM\")\n    mount(<SocialAuth {...props} />, \"page-mount\")\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:social-auth\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport Form from \"./form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      username: \"\",\n    }\n  }\n\n  onUsernameChange = (event) => {\n    this.changeValue(\"username\", event.target.value)\n  }\n\n  clean() {\n    if (!this.state.username.trim().length) {\n      snackbar.error(\n        pgettext(\n          \"add private thread participant\",\n          \"You have to enter user name.\"\n        )\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.patch(this.props.thread.api.index, [\n      { op: \"add\", path: \"participants\", value: this.state.username },\n      { op: \"add\", path: \"acl\", value: 1 },\n    ])\n  }\n\n  handleSuccess(data) {\n    store.dispatch(updateAcl(data))\n    store.dispatch(participants.replace(data.participants))\n\n    snackbar.success(\n      pgettext(\n        \"add private thread participant\",\n        \"New participant has been added to thread.\"\n      )\n    )\n\n    modal.hide()\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-sm\" role=\"document\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-content\">\n            <ModalHeader />\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"id_username\"\n                label={pgettext(\n                  \"add private thread participant field\",\n                  \"User to add\"\n                )}\n              >\n                <input\n                  id=\"id_username\"\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  onChange={this.onUsernameChange}\n                  type=\"text\"\n                  value={this.state.username}\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-block btn-primary\"\n                disabled={this.state.isLoading}\n              >\n                {pgettext(\n                  \"add private thread participant btn\",\n                  \"Add participant\"\n                )}\n              </button>\n              <button\n                className=\"btn btn-block btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"add private thread participant btn\", \"Cancel\")}\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\n          \"add private thread participant modal title\",\n          \"Add participant\"\n        )}\n      </h4>\n    </div>\n  )\n}\n","import React from \"react\"\nimport AddParticipantModal from \"misago/components/add-participant\"\nimport modal from \"misago/services/modal\"\n\nexport default class extends React.Component {\n  onClick = () => {\n    modal.show(<AddParticipantModal thread={this.props.thread} />)\n  }\n\n  render() {\n    if (!this.props.thread.acl.can_add_participants) return null\n\n    return (\n      <div className=\"col-xs-12 col-sm-3\">\n        <button\n          className=\"btn btn-default btn-block\"\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          <span className=\"material-icon\">person_add</span>\n          {pgettext(\"add participant btn\", \"Add participant\")}\n        </button>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { changeOwner } from \"./actions\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.isUser = props.participant.id === props.user.id\n  }\n\n  onClick = () => {\n    let confirmed = false\n    if (this.isUser) {\n      confirmed = window.confirm(\n        pgettext(\n          \"private thread owner change\",\n          \"Are you sure you want to take over this thread?\"\n        )\n      )\n    } else {\n      const message = pgettext(\n        \"private thread owner change\",\n        \"Are you sure you want to change thread owner to %(user)s?\"\n      )\n      confirmed = window.confirm(\n        interpolate(\n          message,\n          {\n            user: this.props.participant.username,\n          },\n          true\n        )\n      )\n    }\n\n    if (!confirmed) return\n\n    changeOwner(this.props.thread, this.props.participant)\n  }\n\n  render() {\n    if (this.props.participant.is_owner) return null\n    if (!this.props.thread.acl.can_change_owner) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          {pgettext(\"private thread owner change btn\", \"Make owner\")}\n        </button>\n      </li>\n    )\n  }\n}\n","import * as participants from \"misago/reducers/participants\"\nimport { updateAcl } from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function leave(thread, participant) {\n  ajax\n    .patch(thread.api.index, [\n      { op: \"remove\", path: \"participants\", value: participant.id },\n    ])\n    .then(\n      () => {\n        snackbar.success(\n          pgettext(\"thread participants actions\", \"You have left this thread.\")\n        )\n        window.setTimeout(() => {\n          window.location = misago.get(\"PRIVATE_THREADS_URL\")\n        }, 3 * 1000)\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n      }\n    )\n}\n\nexport function remove(thread, participant) {\n  ajax\n    .patch(thread.api.index, [\n      { op: \"remove\", path: \"participants\", value: participant.id },\n      { op: \"add\", path: \"acl\", value: 1 },\n    ])\n    .then(\n      (data) => {\n        store.dispatch(updateAcl(data))\n        store.dispatch(participants.replace(data.participants))\n\n        const message = pgettext(\n          \"thread participants actions\",\n          \"%(user)s has been removed from this thread.\"\n        )\n        snackbar.success(\n          interpolate(\n            message,\n            {\n              user: participant.username,\n            },\n            true\n          )\n        )\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n      }\n    )\n}\n\nexport function changeOwner(thread, participant) {\n  ajax\n    .patch(thread.api.index, [\n      { op: \"replace\", path: \"owner\", value: participant.id },\n      { op: \"add\", path: \"acl\", value: 1 },\n    ])\n    .then(\n      (data) => {\n        store.dispatch(updateAcl(data))\n        store.dispatch(participants.replace(data.participants))\n\n        const message = pgettext(\n          \"thread participants actions\",\n          \"%(user)s has been made new thread owner.\"\n        )\n        snackbar.success(\n          interpolate(\n            message,\n            {\n              user: participant.username,\n            },\n            true\n          )\n        )\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n      }\n    )\n}\n","import React from \"react\"\nimport { remove, leave } from \"./actions\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.isUser = props.participant.id === props.user.id\n  }\n\n  onClick = () => {\n    let confirmed = false\n    if (this.isUser) {\n      confirmed = window.confirm(\n        pgettext(\n          \"private thread leave\",\n          \"Are you sure you want to leave this thread?\"\n        )\n      )\n    } else {\n      const message = pgettext(\n        \"private thread leave\",\n        \"Are you sure you want to remove %(user)s from this thread?\"\n      )\n      confirmed = window.confirm(\n        interpolate(\n          message,\n          {\n            user: this.props.participant.username,\n          },\n          true\n        )\n      )\n    }\n\n    if (!confirmed) return\n\n    if (this.isUser) {\n      leave(this.props.thread, this.props.participant)\n    } else {\n      remove(this.props.thread, this.props.participant)\n    }\n  }\n\n  render() {\n    const isModerator = this.props.user.acl.can_moderate_private_threads\n\n    if (!(this.props.userIsOwner || this.isUser || isModerator)) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          {this.isUser\n            ? pgettext(\"private thread leave btn\", \"Leave thread\")\n            : pgettext(\"private thread leave btn\", \"Remove\")}\n        </button>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport MakeOwner from \"./make-owner\"\nimport Remove from \"./remove\"\nimport Avatar from \"misago/components/avatar\"\n\nexport default function (props) {\n  const participant = props.participant\n\n  let className = \"btn btn-default\"\n  if (participant.is_owner) {\n    className = \"btn btn-primary\"\n  }\n  className += \" btn-user btn-block\"\n\n  return (\n    <div className=\"col-xs-12 col-sm-3 col-md-2 participant-card\">\n      <div className=\"dropdown\">\n        <button\n          aria-haspopup=\"true\"\n          aria-expanded=\"false\"\n          className={className}\n          data-toggle=\"dropdown\"\n          type=\"button\"\n        >\n          <Avatar size=\"34\" user={participant} />\n          <span className=\"btn-text\">{participant.username}</span>\n        </button>\n        <ul className=\"dropdown-menu stick-to-bottom\">\n          <UserStatus isOwner={participant.is_owner} />\n          <li className=\"dropdown-header\" />\n          <li>\n            <a href={participant.url}>\n              {pgettext(\"thread participants profile link\", \"See profile\")}\n            </a>\n          </li>\n          <li role=\"separator\" className=\"divider\" />\n          <MakeOwner {...props} />\n          <Remove {...props} />\n        </ul>\n      </div>\n    </div>\n  )\n}\n\nexport function UserStatus({ isOwner }) {\n  if (!isOwner) return null\n\n  return (\n    <li className=\"dropdown-header dropdown-header-owner\">\n      <span className=\"material-icon\">start</span>\n      <span className=\"icon-text\">\n        {pgettext(\"thread participants owner status\", \"Thread owner\")}\n      </span>\n    </li>\n  )\n}\n","import React from \"react\"\nimport Card from \"./card\"\n\nexport default function ({ participants, thread, user, userIsOwner }) {\n  return (\n    <div className=\"participants-cards\">\n      <div className=\"row\">\n        {participants.map((participant) => {\n          return (\n            <Card\n              key={participant.id}\n              participant={participant}\n              thread={thread}\n              user={user}\n              userIsOwner={userIsOwner}\n            />\n          )\n        })}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport AddParticipant from \"./add-participant\"\nimport CardsList from \"./cards-list\"\nimport * as utils from \"./utils\"\n\nexport default function (props) {\n  if (!props.participants.length) return null\n\n  return (\n    <div className=\"panel panel-default panel-participants\">\n      <div className=\"panel-body\">\n        <CardsList\n          userIsOwner={getUserIsOwner(props.user, props.participants)}\n          {...props}\n        />\n        <div className=\"row\">\n          <AddParticipant thread={props.thread} />\n          <div className=\"col-xs-12 col-sm-9\">\n            <p>{utils.getParticipantsCopy(props.participants)}</p>\n          </div>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport function getUserIsOwner(user, participants) {\n  return participants[0].id === user.id\n}\n","export function getParticipantsCopy(participants) {\n  const count = participants.length\n  const message = npgettext(\n    \"thread participants stat\",\n    \"This thread has %(users)s participant.\",\n    \"This thread has %(users)s participants.\",\n    count\n  )\n\n  return interpolate(\n    message,\n    {\n      users: count,\n    },\n    true\n  )\n}\n","import React from \"react\"\n\nexport default function (props) {\n  return (\n    <div className=\"poll-choices-bars\">\n      {props.poll.choices.map((choice) => {\n        return (\n          <PollChoice choice={choice} key={choice.hash} poll={props.poll} />\n        )\n      })}\n    </div>\n  )\n}\n\nexport function PollChoice(props) {\n  let proc = 0\n  if (props.choice.votes && props.poll.votes) {\n    proc = Math.ceil((props.choice.votes * 100) / props.poll.votes)\n  }\n\n  return (\n    <dl className=\"dl-horizontal\">\n      <dt>{props.choice.label}</dt>\n      <dd>\n        <div className=\"progress\">\n          <div\n            className=\"progress-bar\"\n            role=\"progressbar\"\n            aria-valuenow={proc}\n            aria-valuemin=\"0\"\n            aria-valuemax=\"100\"\n            style={{ width: proc + \"%\" }}\n          >\n            <span className=\"sr-only\">\n              {getVotesLabel(props.votes, props.proc)}\n            </span>\n          </div>\n        </div>\n        <ul className=\"list-unstyled list-inline poll-chart\">\n          <ChoiceVotes proc={proc} votes={props.choice.votes} />\n          <UserChoice selected={props.choice.selected} />\n        </ul>\n      </dd>\n    </dl>\n  )\n}\n\nexport function ChoiceVotes(props) {\n  return (\n    <li className=\"poll-chart-votes\">\n      {getVotesLabel(props.votes, props.proc)}\n    </li>\n  )\n}\n\nexport function getVotesLabel(votes, proc) {\n  const message = npgettext(\n    \"thread poll\",\n    \"%(votes)s vote, %(proc)s% of total.\",\n    \"%(votes)s votes, %(proc)s% of total.\",\n    votes\n  )\n\n  return interpolate(\n    message,\n    {\n      votes: votes,\n      proc: proc,\n    },\n    true\n  )\n}\n\nexport function UserChoice(props) {\n  if (!props.selected) return null\n\n  return (\n    <li className=\"poll-chart-selected\">\n      <span className=\"material-icon\">check_box</span>\n      {pgettext(\"thread poll\", \"You've voted on this choice.\")}\n    </li>\n  )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: true,\n      error: null,\n      data: [],\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.poll.api.votes).then(\n      (data) => {\n        const hydratedData = data.map((choice) => {\n          return Object.assign({}, choice, {\n            voters: choice.voters.map((voter) => {\n              return Object.assign({}, voter, {\n                voted_on: moment(voter.voted_on),\n              })\n            }),\n          })\n        })\n\n        this.setState({\n          isLoading: false,\n          data: hydratedData,\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isLoading: false,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  render() {\n    return (\n      <div\n        className={\n          \"modal-dialog\" + (this.state.error ? \" modal-message\" : \" modal-sm\")\n        }\n        role=\"document\"\n      >\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"thread poll\", \"Poll votes\")}\n            </h4>\n          </div>\n\n          <ModalBody\n            data={this.state.data}\n            error={this.state.error}\n            isLoading={this.state.isLoading}\n          />\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function ModalBody(props) {\n  if (props.isLoading) {\n    return <Loader />\n  } else if (props.error) {\n    return <Message icon=\"error_outline\" message={props.error} />\n  }\n\n  return <ChoicesList data={props.data} />\n}\n\nexport function ChoicesList(props) {\n  return (\n    <div className=\"modal-body modal-poll-votes\">\n      <ul className=\"list-unstyled votes-details\">\n        {props.data.map((choice) => {\n          return <ChoiceDetails key={choice.hash} {...choice} />\n        })}\n      </ul>\n    </div>\n  )\n}\n\nexport function ChoiceDetails(props) {\n  return (\n    <li>\n      <h4>{props.label}</h4>\n      <VotesCount votes={props.votes} />\n      <VotesList voters={props.voters} />\n      <hr />\n    </li>\n  )\n}\n\nexport function VotesCount(props) {\n  const message = npgettext(\n    \"thread poll\",\n    \"%(votes)s user has voted for this choice.\",\n    \"%(votes)s users have voted for this choice.\",\n    props.votes\n  )\n\n  const label = interpolate(\n    message,\n    {\n      votes: props.votes,\n    },\n    true\n  )\n\n  return <p>{label}</p>\n}\n\nexport function VotesList(props) {\n  if (!props.voters.length) return null\n\n  return (\n    <ul className=\"list-unstyled\">\n      {props.voters.map((user) => {\n        return <Voter key={user.username} {...user} />\n      })}\n    </ul>\n  )\n}\n\nexport function Voter(props) {\n  if (props.url) {\n    return (\n      <li>\n        <a className=\"item-title\" href={props.url}>\n          {props.username}\n        </a>{\" \"}\n        <VoteDate voted_on={props.voted_on} />\n      </li>\n    )\n  }\n\n  return (\n    <li>\n      <strong>{props.username}</strong> <VoteDate voted_on={props.voted_on} />\n    </li>\n  )\n}\n\nexport function VoteDate(props) {\n  return (\n    <abbr className=\"text-muted\" title={props.voted_on.format(\"LLL\")}>\n      {props.voted_on.fromNow()}\n    </abbr>\n  )\n}\n","import React from \"react\"\nimport Modal from \"./modal\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n  const { isPollOver, poll, showVoting, thread } = props\n\n  if (!isVisible(isPollOver, poll.acl, poll)) return null\n\n  const controls = []\n\n  const canVote = poll.acl.can_vote\n  const canChangeVote = !poll.hasSelectedChoices || poll.allow_revotes\n\n  if (canVote && canChangeVote) controls.push(0)\n  if (poll.is_public || poll.acl.can_see_votes) controls.push(1)\n  if (poll.acl.can_edit) controls.push(2)\n  if (poll.acl.can_delete) controls.push(3)\n\n  return (\n    <div className=\"row poll-options\">\n      <ChangeVote\n        controls={controls}\n        isPollOver={isPollOver}\n        poll={poll}\n        showVoting={showVoting}\n      />\n      <SeeVotes controls={controls} poll={poll} />\n      <Edit\n        controls={controls}\n        poll={poll}\n        thread={thread}\n        onClick={props.edit}\n      />\n      <Delete controls={controls} poll={poll} />\n    </div>\n  )\n}\n\nexport function isVisible(isPollOver, acl, poll) {\n  return (\n    poll.is_public ||\n    acl.can_delete ||\n    acl.can_edit ||\n    acl.can_see_votes ||\n    (acl.can_vote &&\n      !isPollOver &&\n      (!poll.hasSelectedChoices || poll.allow_revotes))\n  )\n}\n\nexport function getClassName(controls, control) {\n  let className = \"col-xs-6\"\n\n  if (controls.length === 1) {\n    className = \"col-xs-12\"\n  }\n\n  if (controls.length === 3 && controls[0] === control) {\n    className = \"col-xs-12\"\n  }\n\n  return className + \" col-sm-3 col-md-2\"\n}\n\nexport function ChangeVote(props) {\n  const canVote = props.poll.acl.can_vote\n  const canChangeVote =\n    !props.poll.hasSelectedChoices || props.poll.allow_revotes\n\n  if (!(canVote && canChangeVote)) return null\n\n  return (\n    <div className={getClassName(props.controls, 0)}>\n      <button\n        className=\"btn btn-default btn-block btn-sm\"\n        disabled={props.poll.isBusy}\n        onClick={props.showVoting}\n        type=\"button\"\n      >\n        {pgettext(\"thread poll\", \"Vote\")}\n      </button>\n    </div>\n  )\n}\n\nexport class SeeVotes extends React.Component {\n  onClick = () => {\n    modal.show(<Modal poll={this.props.poll} />)\n  }\n\n  render() {\n    const seeVotes =\n      this.props.poll.is_public || this.props.poll.acl.can_see_votes\n    if (!seeVotes) return null\n\n    return (\n      <div className={getClassName(this.props.controls, 1)}>\n        <button\n          className=\"btn btn-default btn-block btn-sm\"\n          disabled={this.props.poll.isBusy}\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          {pgettext(\"thread poll\", \"See votes\")}\n        </button>\n      </div>\n    )\n  }\n}\n\nexport function Edit(props) {\n  if (!props.poll.acl.can_edit) return null\n\n  return (\n    <div className={getClassName(props.controls, 2)}>\n      <button\n        className=\"btn btn-default btn-block btn-sm\"\n        disabled={props.poll.isBusy}\n        onClick={props.onClick}\n        type=\"button\"\n      >\n        {pgettext(\"thread poll\", \"Edit\")}\n      </button>\n    </div>\n  )\n}\n\nexport class Delete extends React.Component {\n  onClick = () => {\n    const deletePoll = window.confirm(\n      pgettext(\n        \"thread poll\",\n        \"Are you sure you want to delete this poll? This action is not reversible.\"\n      )\n    )\n    if (!deletePoll) return false\n\n    store.dispatch(poll.busy())\n\n    ajax\n      .delete(this.props.poll.api.index)\n      .then(this.handleSuccess, this.handleError)\n  }\n\n  handleSuccess = (newThreadAcl) => {\n    snackbar.success(pgettext(\"thread poll\", \"Poll has been deleted\"))\n    store.dispatch(poll.remove())\n    store.dispatch(thread.updateAcl(newThreadAcl))\n  }\n\n  handleError = (rejection) => {\n    snackbar.apiError(rejection)\n    store.dispatch(poll.release())\n  }\n\n  render() {\n    if (!this.props.poll.acl.can_delete) return null\n\n    return (\n      <div className={getClassName(this.props.controls, 3)}>\n        <button\n          className=\"btn btn-default btn-block btn-sm\"\n          disabled={this.props.poll.isBusy}\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          {pgettext(\"thread poll\", \"Delete\")}\n        </button>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '<abbr title=\"%(absolute)s\">%(relative)s</abbr>'\nconst USER_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst USER_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\n\nexport default function (props) {\n  return (\n    <ul className=\"list-unstyled list-inline poll-details\">\n      <PollVotes votes={props.poll.votes} />\n      <PollLength poll={props.poll} />\n      <PollIsPublic poll={props.poll} />\n      <PollCreation poll={props.poll} />\n    </ul>\n  )\n}\n\nexport function PollCreation(props) {\n  const message = interpolate(\n    escapeHtml(pgettext(\"thread poll\", \"Started by %(poster)s %(posted_on)s.\")),\n    {\n      poster: getPoster(props.poll),\n      posted_on: getPostedOn(props.poll),\n    },\n    true\n  )\n\n  return (\n    <li\n      className=\"poll-info-creation\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function getPoster(poll) {\n  if (poll.url.poster) {\n    return interpolate(\n      USER_URL,\n      {\n        url: escapeHtml(poll.url.poster),\n        user: escapeHtml(poll.poster_name),\n      },\n      true\n    )\n  }\n\n  return interpolate(\n    USER_SPAN,\n    {\n      user: escapeHtml(poll.poster_name),\n    },\n    true\n  )\n}\n\nexport function getPostedOn(poll) {\n  return interpolate(\n    DATE_ABBR,\n    {\n      absolute: escapeHtml(poll.posted_on.format(\"LLL\")),\n      relative: escapeHtml(poll.posted_on.fromNow()),\n    },\n    true\n  )\n}\n\nexport function PollLength(props) {\n  if (!props.poll.length) {\n    return null\n  }\n\n  const message = interpolate(\n    escapeHtml(pgettext(\"thread poll\", \"Voting ends %(ends_on)s.\")),\n    {\n      ends_on: getEndsOn(props.poll),\n    },\n    true\n  )\n\n  return (\n    <li\n      className=\"poll-info-ends-on\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function getEndsOn(poll) {\n  return interpolate(\n    DATE_ABBR,\n    {\n      absolute: escapeHtml(poll.endsOn.format(\"LLL\")),\n      relative: escapeHtml(poll.endsOn.fromNow()),\n    },\n    true\n  )\n}\n\nexport function PollVotes(props) {\n  const message = npgettext(\n    \"thread poll\",\n    \"%(votes)s vote.\",\n    \"%(votes)s votes.\",\n    props.votes\n  )\n  const label = interpolate(\n    message,\n    {\n      votes: props.votes,\n    },\n    true\n  )\n\n  return <li className=\"poll-info-votes\">{label}</li>\n}\n\nexport function PollIsPublic(props) {\n  if (!props.poll.is_public) {\n    return null\n  }\n\n  return (\n    <li className=\"poll-info-public\">\n      {pgettext(\"thread poll\", \"Voting is public.\")}\n    </li>\n  )\n}\n","import React from \"react\"\nimport Chart from \"./chart\"\nimport Options from \"./options\"\nimport PollInfo from \"../info\"\n\nexport default function (props) {\n  return (\n    <div className=\"panel panel-default panel-poll\">\n      <div className=\"panel-body\">\n        <h2>{props.poll.question}</h2>\n        <PollInfo poll={props.poll} />\n        <Chart poll={props.poll} />\n        <Options\n          isPollOver={props.isPollOver}\n          poll={props.poll}\n          edit={props.edit}\n          showVoting={props.showVoting}\n          thread={props.thread}\n        />\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '<abbr title=\"%(absolute)s\">%(relative)s</abbr>'\nconst USER_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst USER_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\n\nexport default function (props) {\n  return (\n    <ul className=\"list-unstyled list-inline poll-help\">\n      <PollChoicesLeft choicesLeft={props.choicesLeft} />\n      <PollAllowRevote poll={props.poll} />\n    </ul>\n  )\n}\n\nexport function PollChoicesLeft({ choicesLeft }) {\n  if (choicesLeft === 0) {\n    return (\n      <li className=\"poll-help-choices-left\">\n        {pgettext(\"thread poll\", \"You can't select any more choices.\")}\n      </li>\n    )\n  }\n\n  const message = npgettext(\n    \"thread poll\",\n    \"You can select %(choices)s more choice.\",\n    \"You can select %(choices)s more choices.\",\n    choicesLeft\n  )\n\n  const label = interpolate(\n    message,\n    {\n      choices: choicesLeft,\n    },\n    true\n  )\n\n  return <li className=\"poll-help-choices-left\">{label}</li>\n}\n\nexport function PollAllowRevote(props) {\n  if (props.poll.allow_revotes) {\n    return (\n      <li className=\"poll-help-allow-revotes\">\n        {pgettext(\"thread poll\", \"You can change your vote later.\")}\n      </li>\n    )\n  }\n\n  return (\n    <li className=\"poll-help-no-revotes\">\n      {pgettext(\"thread poll\", \"Votes are final.\")}\n    </li>\n  )\n}\n","import React from \"react\"\n\nexport default function (props) {\n  return (\n    <ul className=\"list-unstyled poll-select-choices\">\n      {props.choices.map((choice) => {\n        return (\n          <ChoiceSelect\n            choice={choice}\n            key={choice.hash}\n            toggleChoice={props.toggleChoice}\n          />\n        )\n      })}\n    </ul>\n  )\n}\n\nexport class ChoiceSelect extends React.Component {\n  onClick = () => {\n    this.props.toggleChoice(this.props.choice.hash)\n  }\n\n  render() {\n    return (\n      <li className=\"poll-select-choice\">\n        <button\n          className={this.props.choice.selected ? \"btn btn-selected\" : \"btn\"}\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          <span className=\"material-icon\">\n            {this.props.choice.selected\n              ? \"check_box\"\n              : \"check_box_outline_blank\"}\n          </span>\n          <strong>{this.props.choice.label}</strong>\n        </button>\n      </li>\n    )\n  }\n}\n","export function getChoiceFromHash(choices, hash) {\n  for (const i in choices) {\n    const choice = choices[i]\n    if (choice.hash === hash) {\n      return choice\n    }\n  }\n\n  return null\n}\n\nexport function getChoicesLeft(poll, choices) {\n  let selection = []\n  for (const i in choices) {\n    const choice = choices[i]\n    if (choice.selected) {\n      selection.push(choice)\n    }\n  }\n\n  return poll.allowed_choices - selection.length\n}\n","import React from \"react\"\nimport ChoicesHelp from \"./help\"\nimport ChoicesSelect from \"./select\"\nimport { getChoicesLeft, getChoiceFromHash } from \"./utils\"\nimport PollInfo from \"../info\"\nimport { Delete, Edit, getClassName } from \"../results/options\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      choices: props.poll.choices,\n      choicesLeft: getChoicesLeft(props.poll, props.poll.choices),\n    }\n  }\n\n  toggleChoice = (hash) => {\n    const choice = getChoiceFromHash(this.state.choices, hash)\n\n    let choices = null\n    if (!choice.selected) {\n      choices = this.selectChoice(choice, hash)\n    } else {\n      choices = this.deselectChoice(choice, hash)\n    }\n\n    this.setState({\n      choices,\n      choicesLeft: getChoicesLeft(this.props.poll, choices),\n    })\n  }\n\n  selectChoice = (choice, hash) => {\n    const choicesLeft = getChoicesLeft(this.props.poll, this.state.choices)\n\n    if (!choicesLeft) {\n      for (const i in this.state.choices.slice()) {\n        const item = this.state.choices[i]\n        if (item.selected && item.hash != hash) {\n          item.selected = false\n          break\n        }\n      }\n    }\n\n    return this.state.choices.map((choice) => {\n      return Object.assign({}, choice, {\n        selected: choice.hash == hash ? true : choice.selected,\n      })\n    })\n  }\n\n  deselectChoice = (choice, hash) => {\n    return this.state.choices.map((choice) => {\n      return Object.assign({}, choice, {\n        selected: choice.hash == hash ? false : choice.selected,\n      })\n    })\n  }\n\n  clean() {\n    if (this.state.choicesLeft === this.props.poll.allowed_choices) {\n      snackbar.error(\n        pgettext(\"thread poll vote\", \"You need to select at least one choice.\")\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    let data = []\n    for (const i in this.state.choices.slice()) {\n      const item = this.state.choices[i]\n      if (item.selected) {\n        data.push(item.hash)\n      }\n    }\n\n    return ajax.post(this.props.poll.api.votes, data)\n  }\n\n  handleSuccess(data) {\n    store.dispatch(poll.replace(data))\n    snackbar.success(pgettext(\"thread poll vote\", \"Your vote has been saved.\"))\n\n    this.props.showResults()\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(rejection.detail)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    const controls = []\n\n    if (this.props.poll.acl.can_vote) controls.push(0)\n    if (this.props.poll.is_public || this.props.poll.acl.can_see_votes)\n      controls.push(1)\n    if (this.props.poll.acl.can_edit) controls.push(2)\n    if (this.props.poll.acl.can_delete) controls.push(3)\n\n    return (\n      <div className=\"panel panel-default panel-poll\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"panel-body\">\n            <h2>{this.props.poll.question}</h2>\n            <PollInfo poll={this.props.poll} />\n            <ChoicesSelect\n              choices={this.state.choices}\n              toggleChoice={this.toggleChoice}\n            />\n            <ChoicesHelp\n              choicesLeft={this.state.choicesLeft}\n              poll={this.props.poll}\n            />\n          </div>\n          <div className=\"panel-footer\">\n            <div className=\"row\">\n              <div className={getClassName(controls, 0)}>\n                <Button\n                  className=\"btn-primary btn-block btn-sm\"\n                  loading={this.state.isLoading}\n                >\n                  {pgettext(\"thread poll vote btn\", \"Save your vote\")}\n                </Button>\n              </div>\n              <div className={getClassName(controls, 1)}>\n                <button\n                  className=\"btn btn-default btn-block btn-sm\"\n                  disabled={this.state.isLoading}\n                  onClick={this.props.showResults}\n                  type=\"button\"\n                >\n                  {pgettext(\"thread poll vote btn\", \"See results\")}\n                </button>\n              </div>\n              <Edit\n                controls={controls}\n                poll={this.props.poll}\n                thread={this.props.thread}\n                onClick={this.props.edit}\n              />\n              <Delete controls={controls} poll={this.props.poll} />\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Results from \"./results\"\nimport Voting from \"./voting\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    let showResults = true\n    if (props.user.id && !props.poll.hasSelectedChoices) {\n      showResults = false\n    }\n\n    this.state = {\n      showResults,\n    }\n  }\n\n  showResults = () => {\n    this.setState({\n      showResults: true,\n    })\n  }\n\n  showVoting = () => {\n    this.setState({\n      showResults: false,\n    })\n  }\n\n  render() {\n    if (!this.props.thread.poll) return null\n\n    const isPollOver = getIsPollOver(this.props.poll)\n\n    if (\n      !isPollOver &&\n      this.props.poll.acl.can_vote &&\n      !this.state.showResults\n    ) {\n      return <Voting showResults={this.showResults} {...this.props} />\n    } else {\n      return (\n        <Results\n          isPollOver={isPollOver}\n          showVoting={this.showVoting}\n          {...this.props}\n        />\n      )\n    }\n  }\n}\n\nexport function getIsPollOver(poll) {\n  if (poll.length) {\n    return moment().isAfter(poll.endsOn)\n  }\n  return false\n}\n","import React from \"react\"\nimport getRandomString from \"../../../utils/getRandomString\"\n\nconst HASH_LENGTH = 12\n\nexport default class extends React.Component {\n  onAdd = () => {\n    let choices = this.props.choices.slice()\n    choices.push({\n      hash: getRandomString(HASH_LENGTH),\n      label: \"\",\n    })\n\n    this.props.setChoices(choices)\n  }\n\n  onChange = (hash, label) => {\n    const choices = this.props.choices.map((choice) => {\n      if (choice.hash === hash) {\n        choice.label = label\n      }\n\n      return choice\n    })\n    this.props.setChoices(choices)\n  }\n\n  onDelete = (hash) => {\n    const choices = this.props.choices.filter((choice) => {\n      return choice.hash !== hash\n    })\n    this.props.setChoices(choices)\n  }\n\n  render() {\n    return (\n      <div className=\"poll-choices-control\">\n        <ul className=\"list-group\">\n          {this.props.choices.map((choice) => {\n            return (\n              <PollChoice\n                canDelete={this.props.choices.length > 2}\n                choice={choice}\n                disabled={this.props.disabled}\n                key={choice.hash}\n                onChange={this.onChange}\n                onDelete={this.onDelete}\n              />\n            )\n          })}\n        </ul>\n        <button\n          className=\"btn btn-default btn-sm\"\n          disabled={this.props.disabled}\n          onClick={this.onAdd}\n          type=\"button\"\n        >\n          {pgettext(\"thread poll\", \"Add choice\")}\n        </button>\n      </div>\n    )\n  }\n}\n\nexport class PollChoice extends React.Component {\n  onChange = (event) => {\n    this.props.onChange(this.props.choice.hash, event.target.value)\n  }\n\n  onDelete = () => {\n    const deleteItem =\n      this.props.choice.label.length === 0\n        ? true\n        : window.confirm(\n            pgettext(\n              \"thread poll\",\n              \"Are you sure you want to remove this choice?\"\n            )\n          )\n    if (deleteItem) {\n      this.props.onDelete(this.props.choice.hash)\n    }\n  }\n\n  render() {\n    return (\n      <li className=\"list-group-item\">\n        <button\n          className=\"btn\"\n          disabled={!this.props.canDelete || this.props.disabled}\n          onClick={this.onDelete}\n          title={pgettext(\"thread poll\", \"Remove this choice\")}\n          type=\"button\"\n        >\n          <span className=\"material-icon\">close</span>\n        </button>\n        <input\n          disabled={this.props.disabled}\n          maxLength=\"255\"\n          placeholder={pgettext(\"thread poll\", \"Poll choice\")}\n          type=\"text\"\n          onChange={this.onChange}\n          value={this.props.choice.label}\n        />\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport ChoicesControl from \"./choices-control\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport YesNoSwitch from \"misago/components/yes-no-switch\"\nimport * as poll from \"misago/reducers/poll\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    const poll = props.poll.id\n      ? props.poll\n      : {\n          question: \"\",\n          choices: [\n            {\n              hash: \"choice-10000\",\n              label: \"\",\n            },\n            {\n              hash: \"choice-20000\",\n              label: \"\",\n            },\n          ],\n          length: 0,\n          allowed_choices: 1,\n          allow_revotes: 0,\n          is_public: 0,\n        }\n\n    this.state = {\n      isLoading: false,\n      isEdit: !!poll.id,\n\n      question: poll.question,\n      choices: poll.choices,\n      length: poll.length,\n      allowed_choices: poll.allowed_choices,\n      allow_revotes: poll.allow_revotes,\n      is_public: poll.is_public,\n\n      validators: {\n        question: [],\n        choices: [],\n        length: [],\n        allowed_choices: [],\n      },\n\n      errors: {},\n    }\n  }\n\n  setChoices = (choices) => {\n    this.setState((state) => {\n      return {\n        choices,\n        errors: Object.assign({}, state.errors, { choices: null }),\n      }\n    })\n  }\n\n  onCancel = () => {\n    let cancel = false\n\n    // Nothing added to the poll so no changes to discard\n    const formEmpty = !!(\n      this.state.question === \"\" &&\n      this.state.choices &&\n      this.state.choices.every((choice) => choice.label === \"\") &&\n      this.state.length === 0 &&\n      this.state.allowed_choices === 1\n    )\n\n    if (formEmpty) {\n      return this.props.close()\n    }\n\n    if (!!this.props.poll) {\n      cancel = window.confirm(\n        pgettext(\"thread poll\", \"Are you sure you want to discard changes?\")\n      )\n    } else {\n      cancel = window.confirm(\n        pgettext(\"thread poll\", \"Are you sure you want to discard new poll?\")\n      )\n    }\n\n    if (cancel) {\n      this.props.close()\n    }\n  }\n\n  send() {\n    const data = {\n      question: this.state.question,\n      choices: this.state.choices,\n      length: this.state.length,\n      allowed_choices: this.state.allowed_choices,\n      allow_revotes: this.state.allow_revotes,\n      is_public: this.state.is_public,\n    }\n\n    if (this.state.isEdit) {\n      return ajax.put(this.props.poll.api.index, data)\n    }\n\n    return ajax.post(this.props.thread.api.poll, data)\n  }\n\n  handleSuccess(data) {\n    store.dispatch(poll.replace(data))\n\n    if (this.state.isEdit) {\n      snackbar.success(pgettext(\"thread poll\", \"Poll has been edited.\"))\n    } else {\n      snackbar.success(pgettext(\"thread poll\", \"Poll has been posted.\"))\n    }\n\n    this.props.close()\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      if (rejection.non_field_errors) {\n        rejection.allowed_choices = rejection.non_field_errors\n      }\n\n      this.setState({\n        errors: Object.assign({}, rejection),\n      })\n\n      snackbar.error(gettext(\"Form contains errors.\"))\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"poll-form\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"panel panel-default panel-form\">\n            <div className=\"panel-heading\">\n              <h3 className=\"panel-title\">\n                {this.state.isEdit\n                  ? pgettext(\"thread poll\", \"Edit poll\")\n                  : pgettext(\"thread poll\", \"Add poll\")}\n              </h3>\n            </div>\n            <div className=\"panel-body\">\n              <fieldset>\n                <legend>\n                  {pgettext(\"thread poll\", \"Question and choices\")}\n                </legend>\n\n                <FormGroup\n                  label={pgettext(\"thread poll\", \"Poll question\")}\n                  for=\"id_questions\"\n                  validation={this.state.errors.question}\n                >\n                  <input\n                    className=\"form-control\"\n                    disabled={this.state.isLoading}\n                    id=\"id_questions\"\n                    onChange={this.bindInput(\"question\")}\n                    type=\"text\"\n                    maxLength=\"255\"\n                    value={this.state.question}\n                  />\n                </FormGroup>\n\n                <FormGroup\n                  label={pgettext(\"thread poll\", \"Available choices\")}\n                  validation={this.state.errors.choices}\n                >\n                  <ChoicesControl\n                    choices={this.state.choices}\n                    disabled={this.state.isLoading}\n                    setChoices={this.setChoices}\n                  />\n                </FormGroup>\n              </fieldset>\n\n              <fieldset>\n                <legend>{pgettext(\"thread poll\", \"Voting\")}</legend>\n\n                <div className=\"row\">\n                  <div className=\"col-xs-12 col-sm-6\">\n                    <FormGroup\n                      label={pgettext(\"thread poll\", \"Poll length\")}\n                      helpText={pgettext(\n                        \"thread poll\",\n                        \"Enter number of days for which voting in this poll should be possible or zero to run this poll indefinitely.\"\n                      )}\n                      for=\"id_length\"\n                      validation={this.state.errors.length}\n                    >\n                      <input\n                        className=\"form-control\"\n                        disabled={this.state.isLoading}\n                        id=\"id_length\"\n                        onChange={this.bindInput(\"length\")}\n                        type=\"text\"\n                        value={this.state.length}\n                      />\n                    </FormGroup>\n                  </div>\n                  <div className=\"col-xs-12 col-sm-6\">\n                    <FormGroup\n                      label={pgettext(\"thread poll\", \"Allowed choices\")}\n                      for=\"id_allowed_choices\"\n                      validation={this.state.errors.allowed_choices}\n                    >\n                      <input\n                        className=\"form-control\"\n                        disabled={this.state.isLoading}\n                        id=\"id_allowed_choices\"\n                        onChange={this.bindInput(\"allowed_choices\")}\n                        type=\"text\"\n                        maxLength=\"255\"\n                        value={this.state.allowed_choices}\n                      />\n                    </FormGroup>\n                  </div>\n                </div>\n\n                <div className=\"row\">\n                  <PollPublicSwitch\n                    bindInput={this.bindInput}\n                    disabled={this.state.isLoading}\n                    isEdit={this.state.isEdit}\n                    value={this.state.is_public}\n                  />\n                  <div className=\"col-xs-12 col-sm-6\">\n                    <FormGroup\n                      label={pgettext(\"thread poll\", \"Allow vote changes\")}\n                      for=\"id_allow_revotes\"\n                    >\n                      <YesNoSwitch\n                        id=\"id_allow_revotes\"\n                        disabled={this.state.isLoading}\n                        iconOn=\"check\"\n                        iconOff=\"close\"\n                        labelOn={pgettext(\n                          \"thread poll\",\n                          \"Allow participants to change their vote\"\n                        )}\n                        labelOff={pgettext(\n                          \"thread poll\",\n                          \"Don't allow participants to change their vote\"\n                        )}\n                        onChange={this.bindInput(\"allow_revotes\")}\n                        value={this.state.allow_revotes}\n                      />\n                    </FormGroup>\n                  </div>\n                </div>\n              </fieldset>\n            </div>\n            <div className=\"panel-footer text-right\">\n              <button\n                className=\"btn btn-default\"\n                disabled={this.state.isLoading}\n                onClick={this.onCancel}\n                type=\"button\"\n              >\n                {pgettext(\"thread poll\", \"Cancel\")}\n              </button>{\" \"}\n              <Button className=\"btn-primary\" loading={this.state.isLoading}>\n                {this.state.isEdit\n                  ? pgettext(\"thread poll\", \"Save changes\")\n                  : pgettext(\"thread poll\", \"Post poll\")}\n              </Button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function PollPublicSwitch(props) {\n  if (props.isEdit) return null\n\n  return (\n    <div className=\"col-xs-12 col-sm-6\">\n      <FormGroup\n        label={pgettext(\"thread poll\", \"Make voting public\")}\n        helpText={pgettext(\n          \"thread poll\",\n          \"Making voting public will allow everyone to access detailed list of votes, showing which users voted for which choices and at which times. This option can't be changed after poll's creation. Moderators may see voting details for all polls.\"\n        )}\n        for=\"id_is_public\"\n      >\n        <YesNoSwitch\n          id=\"id_is_public\"\n          disabled={props.disabled}\n          iconOn=\"visibility\"\n          iconOff=\"visibility_off\"\n          labelOn={pgettext(\"thread poll\", \"Votes are public\")}\n          labelOff={pgettext(\"thread poll\", \"Votes are hidden\")}\n          onChange={props.bindInput(\"is_public\")}\n          value={props.value}\n        />\n      </FormGroup>\n    </div>\n  )\n}\n","import React from \"react\"\n\nconst ICON = {\n  changed_title: \"edit\",\n\n  pinned_globally: \"bookmark\",\n  pinned_locally: \"bookmark_border\",\n  unpinned: \"panorama_fish_eye\",\n\n  moved: \"arrow_forward\",\n  merged: \"call_merge\",\n\n  approved: \"done\",\n\n  opened: \"lock_open\",\n  closed: \"lock_outline\",\n\n  unhid: \"visibility\",\n  hid: \"visibility_off\",\n\n  changed_owner: \"grade\",\n  tookover: \"grade\",\n\n  added_participant: \"person_add\",\n\n  owner_left: \"person_outline\",\n  participant_left: \"person_outline\",\n  removed_participant: \"remove_circle_outline\",\n}\n\nconst EventIcon = (props) => (\n  <span className=\"event-icon-bg\">\n    <span className=\"material-icon\">{ICON[props.post.event_type]}</span>\n  </span>\n)\n\nexport default EventIcon\n","import React from \"react\"\nimport moment from \"moment\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function (props) {\n  if (isVisible(props.post.acl)) {\n    return (\n      <li className=\"event-controls\">\n        <Hide {...props} />\n        <Unhide {...props} />\n        <Delete {...props} />\n      </li>\n    )\n  } else {\n    return null\n  }\n}\n\nexport function isVisible(acl) {\n  return acl.can_hide\n}\n\nexport class Hide extends React.Component {\n  onClick = () => {\n    store.dispatch(\n      post.patch(this.props.post, {\n        is_hidden: true,\n        hidden_on: moment(),\n        hidden_by_name: this.props.user.username,\n        url: Object.assign(this.props.post.url, {\n          hidden_by: this.props.user.url,\n        }),\n      })\n    )\n\n    const op = { op: \"replace\", path: \"is-hidden\", value: true }\n\n    ajax.patch(this.props.post.api.index, [op]).then(\n      (patch) => {\n        store.dispatch(post.patch(this.props.post, patch))\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail[0])\n        } else {\n          snackbar.apiError(rejection)\n        }\n\n        store.dispatch(\n          post.patch(this.props.post, {\n            is_hidden: false,\n          })\n        )\n      }\n    )\n  }\n\n  render() {\n    if (!this.props.post.is_hidden) {\n      return (\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          {pgettext(\"event hide btn\", \"Hide\")}\n        </button>\n      )\n    } else {\n      return null\n    }\n  }\n}\n\nexport class Unhide extends React.Component {\n  onClick = () => {\n    store.dispatch(\n      post.patch(this.props.post, {\n        is_hidden: false,\n      })\n    )\n\n    const op = { op: \"replace\", path: \"is-hidden\", value: false }\n\n    ajax.patch(this.props.post.api.index, [op]).then(\n      (patch) => {\n        store.dispatch(post.patch(this.props.post, patch))\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail[0])\n        } else {\n          snackbar.apiError(rejection)\n        }\n\n        store.dispatch(\n          post.patch(this.props.post, {\n            is_hidden: true,\n          })\n        )\n      }\n    )\n  }\n\n  render() {\n    if (this.props.post.is_hidden) {\n      return (\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          {pgettext(\"event reveal btn\", \"Unhide\")}\n        </button>\n      )\n    } else {\n      return null\n    }\n  }\n}\n\nexport class Delete extends React.Component {\n  onClick = () => {\n    const decision = window.confirm(\n      pgettext(\n        \"event delete\",\n        \"Are you sure you wish to delete this event? This action is not reversible!\"\n      )\n    )\n    if (decision) {\n      this.delete()\n    }\n  }\n\n  delete = () => {\n    store.dispatch(\n      post.patch(this.props.post, {\n        isDeleted: true,\n      })\n    )\n\n    ajax.delete(this.props.post.api.index).then(\n      () => {\n        snackbar.success(pgettext(\"event delete\", \"Event has been deleted.\"))\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail[0])\n        } else {\n          snackbar.apiError(rejection)\n        }\n\n        store.dispatch(\n          post.patch(this.props.post, {\n            isDeleted: false,\n          })\n        )\n      }\n    )\n  }\n\n  render() {\n    return (\n      <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n        {pgettext(\"event delete btn\", \"Delete\")}\n      </button>\n    )\n  }\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport Controls from \"./controls\"\n\nconst DATE_ABBR = '<abbr title=\"%(absolute)s\">%(relative)s</abbr>'\nconst DATE_URL = '<a href=\"%(url)s\" title=\"%(absolute)s\">%(relative)s</a>'\nconst USER_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst USER_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\n\nexport default function (props) {\n  return (\n    <ul className=\"list-inline event-info\">\n      <Hidden {...props} />\n      <Poster {...props} />\n      <Controls {...props} />\n    </ul>\n  )\n}\n\nexport function Hidden(props) {\n  if (props.post.is_hidden) {\n    let user = null\n    if (props.post.url.hidden_by) {\n      user = interpolate(\n        USER_URL,\n        {\n          url: escapeHtml(props.post.url.hidden_by),\n          user: escapeHtml(props.post.hidden_by_name),\n        },\n        true\n      )\n    } else {\n      user = interpolate(\n        USER_SPAN,\n        {\n          user: escapeHtml(props.post.hidden_by_name),\n        },\n        true\n      )\n    }\n\n    const date = interpolate(\n      DATE_ABBR,\n      {\n        absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n        relative: escapeHtml(props.post.hidden_on.fromNow()),\n      },\n      true\n    )\n\n    const message = interpolate(\n      escapeHtml(\n        pgettext(\"event info\", \"Hidden by %(event_by)s %(event_on)s.\")\n      ),\n      {\n        event_by: user,\n        event_on: date,\n      },\n      true\n    )\n\n    return (\n      <li\n        className=\"event-hidden-message\"\n        dangerouslySetInnerHTML={{ __html: message }}\n      />\n    )\n  } else {\n    return null\n  }\n}\n\nexport function Poster(props) {\n  let user = null\n  if (props.post.poster) {\n    user = interpolate(\n      USER_URL,\n      {\n        url: escapeHtml(props.post.poster.url),\n        user: escapeHtml(props.post.poster_name),\n      },\n      true\n    )\n  } else {\n    user = interpolate(\n      USER_SPAN,\n      {\n        user: escapeHtml(props.post.poster_name),\n      },\n      true\n    )\n  }\n\n  const date = interpolate(\n    DATE_URL,\n    {\n      url: escapeHtml(props.post.url.index),\n      absolute: escapeHtml(props.post.posted_on.format(\"LLL\")),\n      relative: escapeHtml(props.post.posted_on.fromNow()),\n    },\n    true\n  )\n\n  const message = interpolate(\n    escapeHtml(pgettext(\"event info\", \"By %(event_by)s %(event_on)s.\")),\n    {\n      event_by: user,\n      event_on: date,\n    },\n    true\n  )\n\n  return (\n    <li\n      className=\"event-posters\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n","import React from \"react\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst MESSAGE = {\n  pinned_globally: pgettext(\n    \"event message\",\n    \"Thread has been pinned globally.\"\n  ),\n  pinned_locally: pgettext(\n    \"event message\",\n    \"Thread has been pinned in category.\"\n  ),\n  unpinned: pgettext(\"event message\", \"Thread has been unpinned.\"),\n\n  approved: pgettext(\"event message\", \"Thread has been approved.\"),\n\n  opened: pgettext(\"event message\", \"Thread has been opened.\"),\n  closed: pgettext(\"event message\", \"Thread has been closed.\"),\n\n  unhid: pgettext(\"event message\", \"Thread has been revealed.\"),\n  hid: pgettext(\"event message\", \"Thread has been made hidden.\"),\n\n  tookover: pgettext(\"event message\", \"Took thread over.\"),\n\n  owner_left: pgettext(\n    \"event message\",\n    \"Owner has left thread. This thread is now closed.\"\n  ),\n  participant_left: pgettext(\"event message\", \"Participant has left thread.\"),\n}\n\nconst ITEM_LINK = '<a href=\"%(url)s\" class=\"item-title\">%(name)s</a>'\nconst ITEM_SPAN = '<span class=\"item-title\">%(name)s</span>'\n\nexport default function (props) {\n  if (MESSAGE[props.post.event_type]) {\n    return <p className=\"event-message\">{MESSAGE[props.post.event_type]}</p>\n  } else if (props.post.event_type === \"changed_title\") {\n    return <ChangedTitle {...props} />\n  } else if (props.post.event_type === \"moved\") {\n    return <Moved {...props} />\n  } else if (props.post.event_type === \"merged\") {\n    return <Merged {...props} />\n  } else if (props.post.event_type === \"changed_owner\") {\n    return <ChangedOwner {...props} />\n  } else if (props.post.event_type === \"added_participant\") {\n    return <AddedParticipant {...props} />\n  } else if (props.post.event_type === \"removed_participant\") {\n    return <RemovedParticipant {...props} />\n  } else {\n    return null\n  }\n}\n\nexport function ChangedTitle(props) {\n  const msgstring = escapeHtml(\n    pgettext(\n      \"event message\",\n      \"Thread title has been changed from %(old_title)s.\"\n    )\n  )\n  const oldTitle = interpolate(\n    ITEM_SPAN,\n    {\n      name: escapeHtml(props.post.event_context.old_title),\n    },\n    true\n  )\n  const message = interpolate(\n    msgstring,\n    {\n      old_title: oldTitle,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function Moved(props) {\n  const msgstring = escapeHtml(\n    pgettext(\"event message\", \"Thread has been moved from %(from_category)s.\")\n  )\n  const fromCategory = interpolate(\n    ITEM_LINK,\n    {\n      url: escapeHtml(props.post.event_context.from_category.url),\n      name: escapeHtml(props.post.event_context.from_category.name),\n    },\n    true\n  )\n\n  const message = interpolate(\n    msgstring,\n    {\n      from_category: fromCategory,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function Merged(props) {\n  const msgstring = escapeHtml(\n    pgettext(\n      \"event message\",\n      \"The %(merged_thread)s thread has been merged into this thread.\"\n    )\n  )\n  const mergedThread = interpolate(\n    ITEM_SPAN,\n    {\n      name: escapeHtml(props.post.event_context.merged_thread),\n    },\n    true\n  )\n\n  const message = interpolate(\n    msgstring,\n    {\n      merged_thread: mergedThread,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function ChangedOwner(props) {\n  const msgstring = escapeHtml(\n    pgettext(\"event message\", \"Changed thread owner to %(user)s.\")\n  )\n  const newOwner = interpolate(\n    ITEM_LINK,\n    {\n      url: escapeHtml(props.post.event_context.user.url),\n      name: escapeHtml(props.post.event_context.user.username),\n    },\n    true\n  )\n\n  const message = interpolate(\n    msgstring,\n    {\n      user: newOwner,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function AddedParticipant(props) {\n  const msgstring = escapeHtml(\n    pgettext(\"event message\", \"Added %(user)s to thread.\")\n  )\n  const newOwner = interpolate(\n    ITEM_LINK,\n    {\n      url: escapeHtml(props.post.event_context.user.url),\n      name: escapeHtml(props.post.event_context.user.username),\n    },\n    true\n  )\n\n  const message = interpolate(\n    msgstring,\n    {\n      user: newOwner,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n\nexport function RemovedParticipant(props) {\n  const msgstring = escapeHtml(\n    pgettext(\"event message\", \"Removed %(user)s from thread.\")\n  )\n  const newOwner = interpolate(\n    ITEM_LINK,\n    {\n      url: escapeHtml(props.post.event_context.user.url),\n      name: escapeHtml(props.post.event_context.user.username),\n    },\n    true\n  )\n\n  const message = interpolate(\n    msgstring,\n    {\n      user: newOwner,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"event-message\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n","import React from \"react\"\n\nexport default function ({ post }) {\n  if (post.is_read) return null\n\n  return (\n    <div className=\"event-label\">\n      <span className=\"label label-unread\">\n        {pgettext(\"event unread label\", \"New event\")}\n      </span>\n    </div>\n  )\n}\n","import React from \"react\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.initialized = false\n    this.primed = false\n    this.observer = null\n  }\n\n  initialize = (element) => {\n    this.initialized = true\n\n    this.observer = new IntersectionObserver((entries) =>\n      entries.forEach(this.callback)\n    )\n    this.observer.observe(element)\n  }\n\n  callback = (entry) => {\n    if (!entry.isIntersecting || this.props.post.is_read || this.primed) {\n      return\n    }\n\n    window.setTimeout(() => {\n      ajax.post(this.props.post.api.read)\n    }, 0)\n\n    this.primed = true\n    this.destroy()\n  }\n\n  destroy() {\n    if (this.observer) {\n      this.observer.disconnect()\n      this.observer = null\n    }\n  }\n\n  componentWillUnmount() {\n    this.destroy()\n  }\n\n  render() {\n    const ready = !this.initialized && !this.primed && !this.props.post.is_read\n\n    return (\n      <div\n        className={this.props.className}\n        ref={(node) => {\n          if (node && ready) {\n            this.initialize(node)\n          }\n        }}\n      >\n        {this.props.children}\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Icon from \"./icon\"\nimport Info from \"./info\"\nimport Message from \"./message\"\nimport UnreadLabel from \"./unread-label\"\nimport Waypoint from \"../waypoint\"\n\nexport default function (props) {\n  let className = \"event\"\n  if (props.post.isDeleted) {\n    className = \"hide\"\n  } else if (props.post.is_hidden) {\n    className = \"event post-hidden\"\n  }\n\n  return (\n    <li id={\"post-\" + props.post.id} className={className}>\n      <UnreadLabel post={props.post} />\n      <div className=\"event-body\">\n        <div className=\"event-icon\">\n          <Icon {...props} />\n        </div>\n        <Waypoint className=\"event-content\" post={props.post}>\n          <Message {...props} />\n          <Info {...props} />\n        </Waypoint>\n      </div>\n    </li>\n  )\n}\n","import React from \"react\"\nimport misago from \"misago\"\nimport escapeHtml from \"misago/utils/escape-html\"\nimport formatFilesize from \"misago/utils/file-size\"\n\nconst DATE_ABBR = '<abbr title=\"%(absolute)s\">%(relative)s</abbr>'\nconst USER_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst USER_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\n\nexport default function (props) {\n  return (\n    <div className=\"col-xs-12 col-md-6\">\n      <AttachmentPreview {...props} />\n      <div className=\"post-attachment\">\n        <a\n          href={props.attachment.url.index}\n          className=\"attachment-name item-title\"\n          target=\"_blank\"\n        >\n          {props.attachment.filename}\n        </a>\n        <AttachmentDetails {...props} />\n      </div>\n    </div>\n  )\n}\n\nexport function AttachmentPreview(props) {\n  if (props.attachment.is_image) {\n    return (\n      <div className=\"post-attachment-preview\">\n        <AttachmentThumbnail {...props} />\n      </div>\n    )\n  } else {\n    return (\n      <div className=\"post-attachment-preview\">\n        <AttachmentIcon {...props} />\n      </div>\n    )\n  }\n}\n\nexport function AttachmentIcon(props) {\n  return (\n    <a href={props.attachment.url.index} className=\"material-icon\">\n      insert_drive_file\n    </a>\n  )\n}\n\nexport function AttachmentThumbnail(props) {\n  const url = props.attachment.url.thumb || props.attachment.url.index\n  return (\n    <a\n      className=\"post-thumbnail\"\n      href={props.attachment.url.index}\n      target=\"_blank\"\n      style={{ backgroundImage: 'url(\"' + escapeHtml(url) + '\")' }}\n    />\n  )\n}\n\nexport function AttachmentDetails(props) {\n  let user = null\n  if (props.attachment.url.uploader) {\n    user = interpolate(\n      USER_URL,\n      {\n        url: escapeHtml(props.attachment.url.uploader),\n        user: escapeHtml(props.attachment.uploader_name),\n      },\n      true\n    )\n  } else {\n    user = interpolate(\n      USER_SPAN,\n      {\n        user: escapeHtml(props.attachment.uploader_name),\n      },\n      true\n    )\n  }\n\n  const date = interpolate(\n    DATE_ABBR,\n    {\n      absolute: escapeHtml(props.attachment.uploaded_on.format(\"LLL\")),\n      relative: escapeHtml(props.attachment.uploaded_on.fromNow()),\n    },\n    true\n  )\n\n  const message = interpolate(\n    escapeHtml(\n      pgettext(\n        \"post attachment\",\n        \"%(filetype)s, %(size)s, uploaded by %(uploader)s %(uploaded_on)s.\"\n      )\n    ),\n    {\n      filetype: props.attachment.filetype,\n      size: formatFilesize(props.attachment.size),\n      uploader: user,\n      uploaded_on: date,\n    },\n    true\n  )\n\n  return (\n    <p\n      className=\"post-attachment-description\"\n      dangerouslySetInnerHTML={{ __html: message }}\n    />\n  )\n}\n","import React from \"react\"\nimport batch from \"misago/utils/batch\"\nimport Attachment from \"./attachment\"\n\nexport default function (props) {\n  if (!isVisible(props.post)) {\n    return null\n  }\n\n  return (\n    <div className=\"post-attachments\">\n      {batch(props.post.attachments, 2).map((row) => {\n        const key = row\n          .map((a) => {\n            return a ? a.id : 0\n          })\n          .join(\"_\")\n        return <Row key={key} row={row} />\n      })}\n    </div>\n  )\n}\n\nexport function isVisible(post) {\n  return (!post.is_hidden || post.acl.can_see_hidden) && post.attachments\n}\n\nexport function Row(props) {\n  return (\n    <div className=\"row\">\n      {props.row.map((attachment) => {\n        return (\n          <Attachment\n            attachment={attachment}\n            key={attachment ? attachment.id : 0}\n          />\n        )\n      })}\n    </div>\n  )\n}\n","import React from \"react\"\nimport Waypoint from \"../waypoint\"\nimport MisagoMarkup from \"misago/components/misago-markup\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst HIDDEN_BY_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\nconst HIDDEN_BY_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst HIDDEN_ON =\n  '<abbr class=\"last-title\" title=\"%(absolute)s\">%(relative)s</abbr>'\n\nexport default function (props) {\n  if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n    return <Hidden {...props} />\n  } else if (props.post.content) {\n    return <Default {...props} />\n  } else {\n    return <Invalid {...props} />\n  }\n}\n\nexport function Default({ post }) {\n  const poster = \"@\" + (post.poster ? post.poster.username : post.poster_name)\n\n  return (\n    <Waypoint className=\"post-body\" post={post}>\n      <MisagoMarkup author={poster} markup={post.content} />\n    </Waypoint>\n  )\n}\n\nexport function Hidden(props) {\n  let user = null\n  if (props.post.hidden_by) {\n    user = interpolate(\n      HIDDEN_BY_URL,\n      {\n        url: escapeHtml(props.post.url.hidden_by),\n        user: escapeHtml(props.post.hidden_by_name),\n      },\n      true\n    )\n  } else {\n    user = interpolate(\n      HIDDEN_BY_SPAN,\n      {\n        user: escapeHtml(props.post.hidden_by_name),\n      },\n      true\n    )\n  }\n\n  const date = interpolate(\n    HIDDEN_ON,\n    {\n      absolute: escapeHtml(props.post.hidden_on.format(\"LLL\")),\n      relative: escapeHtml(props.post.hidden_on.fromNow()),\n    },\n    true\n  )\n\n  const message = interpolate(\n    escapeHtml(\n      pgettext(\"post body hidden\", \"Hidden by %(hidden_by)s %(hidden_on)s.\")\n    ),\n    {\n      hidden_by: user,\n      hidden_on: date,\n    },\n    true\n  )\n\n  return (\n    <Waypoint className=\"post-body post-body-hidden\" post={props.post}>\n      <p className=\"lead\">\n        {pgettext(\n          \"post body hidden\",\n          \"This post is hidden. You cannot see its contents.\"\n        )}\n      </p>\n      <p className=\"text-muted\" dangerouslySetInnerHTML={{ __html: message }} />\n    </Waypoint>\n  )\n}\n\nexport function Invalid(props) {\n  return (\n    <Waypoint className=\"post-body post-body-invalid\" post={props.post}>\n      <p className=\"lead\">\n        {pgettext(\n          \"post body invalid\",\n          \"This post's contents cannot be displayed.\"\n        )}\n      </p>\n      <p className=\"text-muted\">\n        {pgettext(\n          \"post body invalid\",\n          \"This error is caused by invalid post content manipulation.\"\n        )}\n      </p>\n    </Waypoint>\n  )\n}\n","import React from \"react\"\n\nexport function FlagBestAnswer({ post, thread, user }) {\n  if (!(isVisible(post) && post.id === thread.best_answer)) {\n    return null\n  }\n\n  let message = null\n  if (user.id && thread.best_answer_marked_by === user.id) {\n    message = interpolate(\n      pgettext(\n        \"post best answer flag\",\n        \"Marked as best answer by you %(marked_on)s.\"\n      ),\n      {\n        marked_on: thread.best_answer_marked_on.fromNow(),\n      },\n      true\n    )\n  } else {\n    message = interpolate(\n      pgettext(\n        \"post best answer flag\",\n        \"Marked as best answer by %(marked_by)s %(marked_on)s.\"\n      ),\n      {\n        marked_by: thread.best_answer_marked_by_name,\n        marked_on: thread.best_answer_marked_on.fromNow(),\n      },\n      true\n    )\n  }\n\n  return (\n    <div className=\"post-status-message post-status-best-answer\">\n      <span className=\"material-icon\">check_box</span>\n      <p>{message}</p>\n    </div>\n  )\n}\n\nexport function FlagHidden(props) {\n  if (!(isVisible(props.post) && props.post.is_hidden)) {\n    return null\n  }\n\n  return (\n    <div className=\"post-status-message post-status-hidden\">\n      <span className=\"material-icon\">visibility_off</span>\n      <p>\n        {pgettext(\n          \"post hidden flag\",\n          \"This post is hidden. Only users with permission may see its contents.\"\n        )}\n      </p>\n    </div>\n  )\n}\n\nexport function FlagUnapproved(props) {\n  if (!(isVisible(props.post) && props.post.is_unapproved)) {\n    return null\n  }\n\n  return (\n    <div className=\"post-status-message post-status-unapproved\">\n      <span className=\"material-icon\">remove_circle_outline</span>\n      <p>\n        {pgettext(\n          \"post unapproved flag\",\n          \"This post is unapproved. Only users with permission to approve posts and its author may see its contents.\"\n        )}\n      </p>\n    </div>\n  )\n}\n\nexport function FlagProtected(props) {\n  if (!(isVisible(props.post) && props.post.is_protected)) {\n    return null\n  }\n\n  return (\n    <div className=\"post-status-message post-status-protected visible-xs-block\">\n      <span className=\"material-icon\">lock_outline</span>\n      <p>\n        {pgettext(\n          \"post protected flag\",\n          \"This post is protected. Only moderators may change it.\"\n        )}\n      </p>\n    </div>\n  )\n}\n\nexport function isVisible(post) {\n  return !post.is_hidden || post.acl.can_see_hidden\n}\n","import moment from \"moment\"\nimport * as thread from \"misago/reducers/thread\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport function approve(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_unapproved: false,\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n  const previousState = {\n    is_unapproved: props.post.is_unapproved,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function protect(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_protected: true,\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n  const previousState = {\n    is_protected: props.post.is_protected,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function unprotect(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_protected: false,\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n  const previousState = {\n    is_protected: props.post.is_protected,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function hide(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_hidden: true,\n      hidden_on: moment(),\n      hidden_by_name: props.user.username,\n      url: Object.assign(props.post.url, {\n        hidden_by: props.user.url,\n      }),\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n  const previousState = {\n    is_hidden: props.post.is_hidden,\n    hidden_on: props.post.hidden_on,\n    hidden_by_name: props.post.hidden_by_name,\n    url: props.post.url,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function unhide(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_hidden: false,\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n  const previousState = {\n    is_hidden: props.post.is_hidden,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function like(props) {\n  const lastLikes = props.post.last_likes || []\n  const concatedLikes = [props.user].concat(lastLikes)\n  const finalLikes =\n    concatedLikes.length > 3 ? concatedLikes.slice(0, -1) : concatedLikes\n\n  store.dispatch(\n    post.patch(props.post, {\n      is_liked: true,\n      likes: props.post.likes + 1,\n      last_likes: finalLikes,\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-liked\", value: true }]\n\n  const previousState = {\n    is_liked: props.post.is_liked,\n    likes: props.post.likes,\n    last_likes: props.post.last_likes,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function unlike(props) {\n  store.dispatch(\n    post.patch(props.post, {\n      is_liked: false,\n      likes: props.post.likes - 1,\n      last_likes: props.post.last_likes.filter((user) => {\n        return !user.id || user.id !== props.user.id\n      }),\n    })\n  )\n\n  const ops = [{ op: \"replace\", path: \"is-liked\", value: false }]\n\n  const previousState = {\n    is_liked: props.post.is_liked,\n    likes: props.post.likes,\n    last_likes: props.post.last_likes,\n  }\n\n  patch(props, ops, previousState)\n}\n\nexport function patch(props, ops, previousState) {\n  ajax.patch(props.post.api.index, ops).then(\n    (newState) => {\n      store.dispatch(post.patch(props.post, newState))\n    },\n    (rejection) => {\n      if (rejection.status === 400) {\n        snackbar.error(rejection.detail[0])\n      } else {\n        snackbar.apiError(rejection)\n      }\n\n      store.dispatch(post.patch(props.post, previousState))\n    }\n  )\n}\n\nexport function remove(props) {\n  let confirmed = window.confirm(\n    pgettext(\n      \"post delete\",\n      \"Are you sure you want to delete this post? This action is not reversible!\"\n    )\n  )\n  if (!confirmed) {\n    return\n  }\n\n  store.dispatch(\n    post.patch(props.post, {\n      isDeleted: true,\n    })\n  )\n\n  ajax.delete(props.post.api.index).then(\n    () => {\n      snackbar.success(pgettext(\"post delete\", \"Post has been deleted.\"))\n    },\n    (rejection) => {\n      if (rejection.status === 400) {\n        snackbar.error(rejection.detail)\n      } else {\n        snackbar.apiError(rejection)\n      }\n\n      store.dispatch(\n        post.patch(props.post, {\n          isDeleted: false,\n        })\n      )\n    }\n  )\n}\n\nexport function markAsBestAnswer(props) {\n  const { post, user } = props\n\n  store.dispatch(\n    thread.update({\n      best_answer: post.id,\n      best_answer_is_protected: post.is_protected,\n      best_answer_marked_on: moment(),\n      best_answer_marked_by: user.id,\n      best_answer_marked_by_name: user.username,\n      best_answer_marked_by_slug: user.slug,\n    })\n  )\n\n  const ops = [\n    { op: \"replace\", path: \"best-answer\", value: post.id },\n    { op: \"add\", path: \"acl\", value: true },\n  ]\n\n  const previousState = {\n    best_answer: props.thread.best_answer,\n    best_answer_is_protected: props.thread.best_answer_is_protected,\n    best_answer_marked_on: props.thread.best_answer_marked_on,\n    best_answer_marked_by: props.thread.best_answer_marked_by,\n    best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n    best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n  }\n\n  patchThread(props, ops, previousState)\n}\n\nexport function unmarkBestAnswer(props) {\n  const { post } = props\n\n  store.dispatch(\n    thread.update({\n      best_answer: null,\n      best_answer_is_protected: false,\n      best_answer_marked_on: null,\n      best_answer_marked_by: null,\n      best_answer_marked_by_name: null,\n      best_answer_marked_by_slug: null,\n    })\n  )\n\n  const ops = [\n    { op: \"remove\", path: \"best-answer\", value: post.id },\n    { op: \"add\", path: \"acl\", value: true },\n  ]\n\n  const previousState = {\n    best_answer: props.thread.best_answer,\n    best_answer_is_protected: props.thread.best_answer_is_protected,\n    best_answer_marked_on: props.thread.best_answer_marked_on,\n    best_answer_marked_by: props.thread.best_answer_marked_by,\n    best_answer_marked_by_name: props.thread.best_answer_marked_by_name,\n    best_answer_marked_by_slug: props.thread.best_answer_marked_by_slug,\n  }\n\n  patchThread(props, ops, previousState)\n}\n\nexport function patchThread(props, ops, previousState) {\n  ajax.patch(props.thread.api.index, ops).then(\n    (newState) => {\n      if (newState.best_answer_marked_on) {\n        newState.best_answer_marked_on = moment(newState.best_answer_marked_on)\n      }\n      store.dispatch(thread.update(newState))\n    },\n    (rejection) => {\n      if (rejection.status === 400) {\n        snackbar.error(rejection.detail[0])\n      } else {\n        snackbar.apiError(rejection)\n      }\n\n      store.dispatch(thread.update(previousState))\n    }\n  )\n}\n","import React from \"react\"\nimport moment from \"moment\"\nimport Avatar from \"misago/components/avatar\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport ajax from \"misago/services/ajax\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n\n      error: null,\n      likes: [],\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(this.props.post.api.likes).then(\n      (data) => {\n        this.setState({\n          isReady: true,\n          likes: data.map(hydrateLike),\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isReady: true,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  render() {\n    if (this.state.error) {\n      return (\n        <ModalDialog className=\"modal-message\">\n          <Message message={this.state.error} />\n        </ModalDialog>\n      )\n    } else if (this.state.isReady) {\n      if (this.state.likes.length) {\n        return (\n          <ModalDialog className=\"modal-sm\" likes={this.state.likes}>\n            <LikesList likes={this.state.likes} />\n          </ModalDialog>\n        )\n      }\n\n      return (\n        <ModalDialog className=\"modal-message\">\n          <Message\n            message={pgettext(\n              \"post likes modal\",\n              \"No users have liked this post.\"\n            )}\n          />\n        </ModalDialog>\n      )\n    }\n\n    return (\n      <ModalDialog className=\"modal-sm\">\n        <Loader />\n      </ModalDialog>\n    )\n  }\n}\n\nexport function hydrateLike(data) {\n  return Object.assign({}, data, {\n    liked_on: moment(data.liked_on),\n  })\n}\n\nexport function ModalDialog({ className, children, likes }) {\n  let title = pgettext(\"post likes modal title\", \"Post Likes\")\n  if (likes) {\n    const likesCount = likes.length\n    const message = npgettext(\n      \"post likes modal\",\n      \"%(likes)s like\",\n      \"%(likes)s likes\",\n      likesCount\n    )\n\n    title = interpolate(message, { likes: likesCount }, true)\n  }\n\n  return (\n    <div className={\"modal-dialog \" + (className || \"\")} role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">{title}</h4>\n        </div>\n        {children}\n      </div>\n    </div>\n  )\n}\n\nexport function LikesList(props) {\n  return (\n    <div className=\"modal-body modal-post-likers\">\n      <ul className=\"media-list\">\n        {props.likes.map((like) => {\n          return <LikeDetails key={like.id} {...like} />\n        })}\n      </ul>\n    </div>\n  )\n}\n\nexport function LikeDetails(props) {\n  if (props.url) {\n    const user = {\n      id: props.liker_id,\n      avatars: props.avatars,\n    }\n\n    return (\n      <li className=\"media\">\n        <div className=\"media-left\">\n          <a className=\"user-avatar\" href={props.url}>\n            <Avatar size=\"50\" user={user} />\n          </a>\n        </div>\n        <div className=\"media-body\">\n          <a className=\"item-title\" href={props.url}>\n            {props.username}\n          </a>{\" \"}\n          <LikeDate likedOn={props.liked_on} />\n        </div>\n      </li>\n    )\n  }\n\n  return (\n    <li className=\"media\">\n      <div className=\"media-left\">\n        <span className=\"user-avatar\">\n          <Avatar size=\"50\" />\n        </span>\n      </div>\n      <div className=\"media-body\">\n        <strong>{props.username}</strong> <LikeDate likedOn={props.liked_on} />\n      </div>\n    </li>\n  )\n}\n\nexport function LikeDate(props) {\n  return (\n    <span className=\"text-muted\" title={props.likedOn.format(\"LLL\")}>\n      {props.likedOn.fromNow()}\n    </span>\n  )\n}\n","import React from \"react\"\nimport * as actions from \"./controls/actions\"\nimport LikesModal from \"misago/components/post-likes\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\n\nexport default function (props) {\n  if (!isVisible(props.post)) return null\n\n  return (\n    <div className=\"post-footer\">\n      <MarkAsBestAnswer {...props} />\n      <MarkAsBestAnswerCompact {...props} />\n      <Like {...props} />\n      <Likes\n        lastLikes={props.post.last_likes}\n        likes={props.post.likes}\n        {...props}\n      />\n      <LikesCompact likes={props.post.likes} {...props} />\n      <Reply {...props} />\n      <Quote {...props} />\n      <Edit {...props} />\n    </div>\n  )\n}\n\nexport function isVisible(post) {\n  return (\n    (!post.is_hidden || post.acl.can_see_hidden) &&\n    (post.acl.can_reply ||\n      post.acl.can_edit ||\n      (post.acl.can_see_likes && (post.last_likes || []).length) ||\n      post.acl.can_like)\n  )\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n  onClick = () => {\n    actions.markAsBestAnswer(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (!thread.acl.can_mark_best_answer) return null\n    if (!post.acl.can_mark_as_best_answer) return null\n    if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n    return (\n      <button\n        className=\"hidden-xs btn btn-default btn-sm pull-left\"\n        disabled={this.props.post.isBusy || post.id === thread.best_answer}\n        onClick={this.onClick}\n        type=\"button\"\n      >\n        <span className=\"material-icon\">check_box</span>\n        {pgettext(\"post footer btn\", \"Best answer\")}\n      </button>\n    )\n  }\n}\n\nexport class MarkAsBestAnswerCompact extends React.Component {\n  onClick = () => {\n    actions.markAsBestAnswer(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (!thread.acl.can_mark_best_answer) return null\n    if (!post.acl.can_mark_as_best_answer) return null\n    if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n    return (\n      <button\n        className=\"visible-xs-inline-block btn btn-default btn-sm pull-left\"\n        disabled={this.props.post.isBusy || post.id === thread.best_answer}\n        onClick={this.onClick}\n        type=\"button\"\n      >\n        <span className=\"material-icon\">check_box</span>\n      </button>\n    )\n  }\n}\n\nexport class Like extends React.Component {\n  onClick = () => {\n    if (this.props.post.is_liked) {\n      actions.unlike(this.props)\n    } else {\n      actions.like(this.props)\n    }\n  }\n\n  render() {\n    if (!this.props.post.acl.can_like) return null\n\n    let className = \"btn btn-default btn-sm pull-left\"\n    if (this.props.post.is_liked) {\n      className = \"btn btn-success btn-sm pull-left\"\n    }\n\n    return (\n      <button\n        className={className}\n        disabled={this.props.post.isBusy}\n        onClick={this.onClick}\n        type=\"button\"\n      >\n        {this.props.post.is_liked\n          ? pgettext(\"post footer btn\", \"Liked\")\n          : pgettext(\"post footer btn\", \"Like\")}\n      </button>\n    )\n  }\n}\n\nexport class Likes extends React.Component {\n  onClick = () => {\n    modal.show(<LikesModal post={this.props.post} />)\n  }\n\n  render() {\n    const hasLikes = (this.props.post.last_likes || []).length > 0\n    if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n    if (this.props.post.acl.can_see_likes === 2) {\n      return (\n        <button\n          className=\"btn btn-link btn-sm pull-left hidden-xs\"\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          {getLikesMessage(this.props.likes, this.props.lastLikes)}\n        </button>\n      )\n    }\n\n    return (\n      <p className=\"pull-left hidden-xs\">\n        {getLikesMessage(this.props.likes, this.props.lastLikes)}\n      </p>\n    )\n  }\n}\n\nexport class LikesCompact extends Likes {\n  render() {\n    const hasLikes = (this.props.post.last_likes || []).length > 0\n    if (!this.props.post.acl.can_see_likes || !hasLikes) return null\n\n    if (this.props.post.acl.can_see_likes === 2) {\n      return (\n        <button\n          className=\"btn btn-link btn-sm likes-compact pull-left visible-xs-block\"\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          <span className=\"material-icon\">favorite</span>\n          {this.props.likes}\n        </button>\n      )\n    }\n\n    return (\n      <p className=\"likes-compact pull-left visible-xs-block\">\n        <span className=\"material-icon\">favorite</span>\n        {this.props.likes}\n      </p>\n    )\n  }\n}\n\nexport function getLikesMessage(likes, users) {\n  const usernames = users.slice(0, 3).map((u) => u.username)\n\n  if (usernames.length == 1) {\n    return interpolate(\n      pgettext(\"post likes\", \"%(user)s likes this.\"),\n      {\n        user: usernames[0],\n      },\n      true\n    )\n  }\n\n  const hiddenLikes = likes - usernames.length\n\n  const otherUsers = usernames.slice(0, -1).join(\", \")\n  const lastUser = usernames.slice(-1)[0]\n\n  const usernamesList = interpolate(\n    pgettext(\"post likes\", \"%(users)s and %(last_user)s\"),\n    {\n      users: otherUsers,\n      last_user: lastUser,\n    },\n    true\n  )\n\n  if (hiddenLikes === 0) {\n    return interpolate(\n      pgettext(\"post likes\", \"%(users)s like this.\"),\n      {\n        users: usernamesList,\n      },\n      true\n    )\n  }\n\n  const message = npgettext(\n    \"post likes\",\n    \"%(users)s and %(likes)s other user like this.\",\n    \"%(users)s and %(likes)s other users like this.\",\n    hiddenLikes\n  )\n\n  return interpolate(\n    message,\n    {\n      users: usernames.join(\", \"),\n      likes: hiddenLikes,\n    },\n    true\n  )\n}\n\nexport class Reply extends React.Component {\n  onClick = () => {\n    posting.open({\n      mode: \"REPLY\",\n\n      thread: this.props.thread,\n      config: this.props.thread.api.editor,\n      submit: this.props.thread.api.posts.index,\n    })\n  }\n\n  render() {\n    if (this.props.post.acl.can_reply) {\n      return (\n        <button\n          className=\"btn btn-default btn-sm pull-right\"\n          type=\"button\"\n          onClick={this.onClick}\n        >\n          {pgettext(\"post footer btn\", \"Reply\")}\n        </button>\n      )\n    } else {\n      return null\n    }\n  }\n}\n\nexport class Quote extends React.Component {\n  onClick = () => {\n    posting.open({\n      mode: \"QUOTE\",\n\n      thread: this.props.thread,\n      config: this.props.thread.api.editor,\n      submit: this.props.thread.api.posts.index,\n\n      context: {\n        reply: this.props.post.id,\n      },\n    })\n  }\n\n  render() {\n    if (this.props.post.acl.can_reply) {\n      return (\n        <button\n          className=\"btn btn-default btn-sm pull-right\"\n          type=\"button\"\n          onClick={this.onClick}\n        >\n          {pgettext(\"post footer btn\", \"Quote\")}\n        </button>\n      )\n    } else {\n      return null\n    }\n  }\n}\n\nexport class Edit extends React.Component {\n  onClick = () => {\n    posting.open({\n      mode: \"EDIT\",\n\n      thread: this.props.thread,\n      post: this.props.post,\n      config: this.props.post.api.editor,\n      submit: this.props.post.api.index,\n    })\n  }\n\n  render() {\n    if (this.props.post.acl.can_edit) {\n      return (\n        <button\n          className=\"hidden-xs btn btn-default btn-sm pull-right\"\n          type=\"button\"\n          onClick={this.onClick}\n        >\n          {pgettext(\"post footer btn\", \"Edit\")}\n        </button>\n      )\n    } else {\n      return null\n    }\n  }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      url: \"\",\n\n      validators: {\n        url: [],\n      },\n      errors: {},\n    }\n  }\n\n  clean() {\n    if (!this.state.url.trim().length) {\n      snackbar.error(\n        pgettext(\n          \"post move modal\",\n          \"You have to enter link to the other thread.\"\n        )\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.thread.api.posts.move, {\n      new_thread: this.state.url,\n      posts: [this.props.post.id],\n    })\n  }\n\n  handleSuccess(success) {\n    store.dispatch(\n      post.patch(this.props.post, {\n        isDeleted: true,\n      })\n    )\n\n    modal.hide()\n\n    snackbar.success(\n      pgettext(\n        \"post move modal\",\n        \"Selected post was moved to the other thread.\"\n      )\n    )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(rejection.detail)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onUrlChange = (event) => {\n    this.changeValue(\"url\", event.target.value)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-content\">\n            <ModalHeader />\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"id_url\"\n                label={pgettext(\n                  \"post move modal field\",\n                  \"Link to thread you want to move post to\"\n                )}\n              >\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  id=\"id_url\"\n                  onChange={this.onUrlChange}\n                  value={this.state.url}\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-primary\"\n                disabled={this.state.isLoading}\n              >\n                {pgettext(\"post move modal btn\", \"Move post\")}\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\"post move modal title\", \"Move post\")}\n      </h4>\n    </div>\n  )\n}\n","import React from \"react\"\n\nexport default function (props) {\n  return (\n    <div className=\"modal-body post-changelog-diff\">\n      <ul className=\"list-unstyled\">\n        {props.diff.map((item, i) => {\n          return <DiffItem item={item} key={i} />\n        })}\n      </ul>\n    </div>\n  )\n}\n\nexport function DiffItem(props) {\n  if (props.item[0] === \"?\") return null\n\n  return (\n    <li className={getItemClassName(props.item)}>{cleanItem(props.item)}</li>\n  )\n}\n\nexport function getItemClassName(item) {\n  let className = \"diff-item\"\n  if (item[0] === \"-\") {\n    className += \" diff-item-sub\"\n  } else if (item[0] === \"+\") {\n    className += \" diff-item-add\"\n  }\n  return className\n}\n\nexport function cleanItem(item) {\n  return item.substr(2)\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\n\nexport default class extends React.Component {\n  onClick = () => {\n    this.props.revertEdit(this.props.edit.id)\n  }\n\n  render() {\n    if (!this.props.canRevert) return null\n\n    return (\n      <div className=\"modal-footer visible-xs-block\">\n        <Button\n          className=\"btn-default btn-sm btn-block\"\n          disabled={this.props.disabled}\n          onClick={this.onClick}\n          title={pgettext(\n            \"post revert btn\",\n            \"Revert post to state from before this edit.\"\n          )}\n        >\n          {pgettext(\"post revert btn\", \"Revert\")}\n        </Button>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport escapeHtml from \"misago/utils/escape-html\"\n\nconst DATE_ABBR = '<abbr title=\"%(absolute)s\">%(relative)s</abbr>'\nconst USER_SPAN = '<span class=\"item-title\">%(user)s</span>'\nconst USER_URL = '<a href=\"%(url)s\" class=\"item-title\">%(user)s</a>'\n\nexport default class extends React.Component {\n  goLast = () => {\n    this.props.goToEdit()\n  }\n\n  goForward = () => {\n    this.props.goToEdit(this.props.edit.next)\n  }\n\n  goBack = () => {\n    this.props.goToEdit(this.props.edit.previous)\n  }\n\n  revertEdit = () => {\n    this.props.revertEdit(this.props.edit.id)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-toolbar post-changelog-toolbar\">\n        <div className=\"row\">\n          <div className=\"col-xs-12 col-sm-4\">\n            <div className=\"row\">\n              <div className=\"col-xs-4\">\n                <GoBackBtn\n                  disabled={this.props.disabled}\n                  edit={this.props.edit}\n                  onClick={this.goBack}\n                />\n              </div>\n              <div className=\"col-xs-4\">\n                <GoForwardBtn\n                  disabled={this.props.disabled}\n                  edit={this.props.edit}\n                  onClick={this.goForward}\n                />\n              </div>\n              <div className=\"col-xs-4\">\n                <GoLastBtn\n                  disabled={this.props.disabled}\n                  edit={this.props.edit}\n                  onClick={this.goLast}\n                />\n              </div>\n            </div>\n          </div>\n          <div className=\"col-xs-12 col-sm-5 xs-margin-top-half post-change-label\">\n            <Label edit={this.props.edit} />\n          </div>\n          <RevertBtn\n            canRevert={this.props.canRevert}\n            disabled={this.props.disabled}\n            onClick={this.revertEdit}\n          />\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function GoBackBtn(props) {\n  return (\n    <Button\n      className=\"btn-default btn-block btn-icon btn-sm\"\n      disabled={props.disabled || !props.edit.previous}\n      onClick={props.onClick}\n      title={pgettext(\"post history modal btn\", \"See previous change\")}\n    >\n      <span className=\"material-icon\">chevron_left</span>\n    </Button>\n  )\n}\n\nexport function GoForwardBtn(props) {\n  return (\n    <Button\n      className=\"btn-default btn-block btn-icon btn-sm\"\n      disabled={props.disabled || !props.edit.next}\n      onClick={props.onClick}\n      title={pgettext(\"post history modal btn\", \"See next change\")}\n    >\n      <span className=\"material-icon\">chevron_right</span>\n    </Button>\n  )\n}\n\nexport function GoLastBtn(props) {\n  return (\n    <Button\n      className=\"btn-default btn-block btn-icon btn-sm\"\n      disabled={props.disabled || !props.edit.next}\n      onClick={props.onClick}\n      title={pgettext(\"post history modal btn\", \"See previous change\")}\n    >\n      <span className=\"material-icon\">last_page</span>\n    </Button>\n  )\n}\n\nexport function RevertBtn(props) {\n  if (!props.canRevert) return null\n\n  return (\n    <div className=\"col-sm-3 hidden-xs\">\n      <Button\n        className=\"btn-default btn-sm btn-block\"\n        disabled={props.disabled}\n        onClick={props.onClick}\n        title={pgettext(\n          \"post revert btn\",\n          \"Revert post to state from before this edit.\"\n        )}\n      >\n        {pgettext(\"post revert btn\", \"Revert\")}\n      </Button>\n    </div>\n  )\n}\n\nexport function Label(props) {\n  let user = null\n  if (props.edit.url.editor) {\n    user = interpolate(\n      USER_URL,\n      {\n        url: escapeHtml(props.edit.url.editor),\n        user: escapeHtml(props.edit.editor_name),\n      },\n      true\n    )\n  } else {\n    user = interpolate(\n      USER_SPAN,\n      {\n        user: escapeHtml(props.edit.editor_name),\n      },\n      true\n    )\n  }\n\n  const date = interpolate(\n    DATE_ABBR,\n    {\n      absolute: escapeHtml(props.edit.edited_on.format(\"LLL\")),\n      relative: escapeHtml(props.edit.edited_on.fromNow()),\n    },\n    true\n  )\n\n  const message = interpolate(\n    escapeHtml(\n      pgettext(\"post history modal\", \"By %(edited_by)s %(edited_on)s.\")\n    ),\n    {\n      edited_by: user,\n      edited_on: date,\n    },\n    true\n  )\n\n  return <p dangerouslySetInnerHTML={{ __html: message }} />\n}\n","import moment from \"moment\"\n\nexport function hydrateEdit(json) {\n  return Object.assign({}, json, {\n    edited_on: moment(json.edited_on),\n  })\n}\n","import React from \"react\"\nimport Diff from \"./diff\"\nimport Footer from \"./footer\"\nimport Toolbar from \"./toolbar\"\nimport { hydrateEdit } from \"./utils\"\nimport Message from \"misago/components/modal-message\"\nimport Loader from \"misago/components/modal-loader\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n      isBusy: true,\n\n      canRevert: props.post.acl.can_edit,\n\n      error: null,\n      edit: null,\n    }\n  }\n\n  componentDidMount() {\n    this.goToEdit()\n  }\n\n  goToEdit = (edit = null) => {\n    this.setState({\n      isBusy: true,\n    })\n\n    let url = this.props.post.api.edits\n    if (edit !== null) {\n      url += \"?edit=\" + edit\n    }\n\n    ajax.get(url).then(\n      (data) => {\n        this.setState({\n          isReady: true,\n          isBusy: false,\n          edit: hydrateEdit(data),\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isReady: true,\n          isBusy: false,\n          error: rejection.detail,\n        })\n      }\n    )\n  }\n\n  revertEdit = (edit) => {\n    if (this.state.isBusy) return\n\n    const confirmation = window.confirm(\n      pgettext(\n        \"post revert\",\n        \"Are you sure you with to revert this post to the state from before this edit?\"\n      )\n    )\n    if (!confirmation) return\n\n    this.setState({\n      isBusy: true,\n    })\n\n    const url = this.props.post.api.edits + \"?edit=\" + edit\n    ajax.post(url).then(\n      (data) => {\n        const hydratedPost = post.hydrate(data)\n        store.dispatch(post.patch(data, hydratedPost))\n\n        snackbar.success(\n          pgettext(\"post revert\", \"Post has been reverted to previous state.\")\n        )\n        modal.hide()\n      },\n      (rejection) => {\n        snackbar.apiError(rejection)\n\n        this.setState({\n          isBusy: false,\n        })\n      }\n    )\n  }\n\n  render() {\n    if (this.state.error) {\n      return (\n        <ModalDialog className=\"modal-dialog modal-message\">\n          <Message message={this.state.error} />\n        </ModalDialog>\n      )\n    } else if (this.state.isReady) {\n      return (\n        <ModalDialog>\n          <Toolbar\n            canRevert={this.state.canRevert}\n            disabled={this.state.isBusy}\n            edit={this.state.edit}\n            goToEdit={this.goToEdit}\n            revertEdit={this.revertEdit}\n          />\n          <Diff diff={this.state.edit.diff} />\n          <Footer\n            canRevert={this.state.canRevert}\n            disabled={this.state.isBusy}\n            edit={this.state.edit}\n            revertEdit={this.revertEdit}\n          />\n        </ModalDialog>\n      )\n    }\n\n    return (\n      <ModalDialog>\n        <Loader />\n      </ModalDialog>\n    )\n  }\n}\n\nexport function ModalDialog(props) {\n  return (\n    <div className={props.className || \"modal-dialog\"} role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\"post history modal title\", \"Post edits history\")}\n          </h4>\n        </div>\n        {props.children}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default function (props) {\n  return <PostingConfig {...props} Form={ModerationForm} />\n}\n\nexport class PostingConfig extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      isError: false,\n\n      categories: [],\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n      (data) => {\n        // hydrate categories, extract posting options\n        const categories = data.map((item) => {\n          return Object.assign(item, {\n            disabled: item.post === false,\n            label: item.name,\n            value: item.id,\n            post: item.post,\n          })\n        })\n\n        this.setState({\n          isLoaded: true,\n          categories,\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isError: rejection.detail,\n        })\n      }\n    )\n  }\n\n  render() {\n    if (this.state.isError) {\n      return <Error message={this.state.isError} />\n    } else if (this.state.isLoaded) {\n      return (\n        <ModerationForm {...this.props} categories={this.state.categories} />\n      )\n    } else {\n      return <Loader />\n    }\n  }\n}\n\nexport class ModerationForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      title: \"\",\n      category: null,\n      categories: props.categories,\n      weight: 0,\n      is_hidden: 0,\n      is_closed: false,\n\n      validators: {\n        title: [validators.required()],\n      },\n\n      errors: {},\n    }\n\n    this.isHiddenChoices = [\n      {\n        value: 0,\n        icon: \"visibility\",\n        label: pgettext(\"thread hidden switch choice\", \"No\"),\n      },\n      {\n        value: 1,\n        icon: \"visibility_off\",\n        label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n      },\n    ]\n\n    this.isClosedChoices = [\n      {\n        value: false,\n        icon: \"lock_outline\",\n        label: pgettext(\"thread closed switch choice\", \"No\"),\n      },\n      {\n        value: true,\n        icon: \"lock\",\n        label: pgettext(\"thread closed switch choice\", \"Yes\"),\n      },\n    ]\n\n    this.acl = {}\n    this.props.categories.forEach((category) => {\n      if (category.post) {\n        if (!this.state.category) {\n          this.state.category = category.id\n        }\n\n        this.acl[category.id] = {\n          can_pin_threads: category.post.pin,\n          can_close_threads: category.post.close,\n          can_hide_threads: category.post.hide,\n        }\n      }\n    })\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(gettext(\"Form contains errors.\"))\n      this.setState({\n        errors: this.validate(),\n      })\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(this.props.thread.api.posts.split, {\n      title: this.state.title,\n      category: this.state.category,\n      weight: this.state.weight,\n      is_hidden: this.state.is_hidden,\n      is_closed: this.state.is_closed,\n      posts: [this.props.post.id],\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    store.dispatch(\n      post.patch(this.props.post, {\n        isDeleted: true,\n      })\n    )\n\n    modal.hide()\n\n    snackbar.success(\n      pgettext(\"post split modal\", \"Selected post was split into new thread.\")\n    )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      this.setState({\n        errors: Object.assign({}, this.state.errors, rejection),\n      })\n      snackbar.error(gettext(\"Form contains errors.\"))\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onCategoryChange = (ev) => {\n    const categoryId = ev.target.value\n    const newState = {\n      category: categoryId,\n    }\n\n    if (this.acl[categoryId].can_pin_threads < newState.weight) {\n      newState.weight = 0\n    }\n\n    if (!this.acl[categoryId].can_hide_threads) {\n      newState.is_hidden = 0\n    }\n\n    if (!this.acl[categoryId].can_close_threads) {\n      newState.is_closed = false\n    }\n\n    this.setState(newState)\n  }\n\n  getWeightChoices() {\n    const choices = [\n      {\n        value: 0,\n        icon: \"remove\",\n        label: pgettext(\"thread weight choice\", \"Not pinned\"),\n      },\n      {\n        value: 1,\n        icon: \"bookmark_border\",\n        label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n      },\n    ]\n\n    if (this.acl[this.state.category].can_pin_threads == 2) {\n      choices.push({\n        value: 2,\n        icon: \"bookmark\",\n        label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n      })\n    }\n\n    return choices\n  }\n\n  renderWeightField() {\n    if (this.acl[this.state.category].can_pin_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts split modal field\", \"Thread weight\")}\n          for=\"id_weight\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_weight\"\n            onChange={this.bindInput(\"weight\")}\n            value={this.state.weight}\n            choices={this.getWeightChoices()}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderHiddenField() {\n    if (this.acl[this.state.category].can_hide_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts split modal field\", \"Hide thread\")}\n          for=\"id_is_hidden\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_hidden\")}\n            value={this.state.is_hidden}\n            choices={this.isHiddenChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderClosedField() {\n    if (this.acl[this.state.category].can_close_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts split modal field\", \"Close thread\")}\n          for=\"id_is_closed\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_closed\")}\n            value={this.state.is_closed}\n            choices={this.isClosedChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <Modal className=\"modal-dialog\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-body\">\n            <FormGroup\n              label={pgettext(\"posts split modal field\", \"Thread title\")}\n              for=\"id_title\"\n              labelClass=\"col-sm-4\"\n              controlClass=\"col-sm-8\"\n              validation={this.state.errors.title}\n            >\n              <input\n                id=\"id_title\"\n                className=\"form-control\"\n                type=\"text\"\n                onChange={this.bindInput(\"title\")}\n                value={this.state.title}\n              />\n            </FormGroup>\n            <div className=\"clearfix\" />\n\n            <FormGroup\n              label={pgettext(\"posts split modal field\", \"Category\")}\n              for=\"id_category\"\n              labelClass=\"col-sm-4\"\n              controlClass=\"col-sm-8\"\n              validation={this.state.errors.category}\n            >\n              <CategorySelect\n                id=\"id_category\"\n                onChange={this.onCategoryChange}\n                value={this.state.category}\n                choices={this.state.categories}\n              />\n            </FormGroup>\n            <div className=\"clearfix\" />\n\n            {this.renderWeightField()}\n            {this.renderHiddenField()}\n            {this.renderClosedField()}\n          </div>\n          <div className=\"modal-footer\">\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"posts split modal btn\", \"Split post\")}\n            </Button>\n          </div>\n        </form>\n      </Modal>\n    )\n  }\n}\n\nexport function Loader() {\n  return (\n    <Modal className=\"modal-dialog\">\n      <ModalLoader />\n    </Modal>\n  )\n}\n\nexport function Error(props) {\n  return (\n    <Modal className=\"modal-dialog modal-message\">\n      <div className=\"message-icon\">\n        <span className=\"material-icon\">info_outline</span>\n      </div>\n      <div className=\"message-body\">\n        <p className=\"lead\">\n          {pgettext(\n            \"post split modal\",\n            \"You can't move this post at the moment.\"\n          )}\n        </p>\n        <p>{props.message}</p>\n      </div>\n    </Modal>\n  )\n}\n\nexport function Modal(props) {\n  return (\n    <div className={props.className} role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\"posts split modal title\", \"Split post into new thread\")}\n          </h4>\n        </div>\n        {props.children}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport posting from \"misago/services/posting\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n  return (\n    <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n      <Permalink {...props} />\n      <Edit {...props} />\n      <MarkAsBestAnswer {...props} />\n      <UnmarkMarkBestAnswer {...props} />\n      <PostEdits {...props} />\n      <Approve {...props} />\n      <Move {...props} />\n      <Split {...props} />\n      <Protect {...props} />\n      <Unprotect {...props} />\n      <Hide {...props} />\n      <Unhide {...props} />\n      <Delete {...props} />\n    </ul>\n  )\n}\n\nexport class Permalink extends React.Component {\n  onClick = () => {\n    let permaUrl = window.location.protocol + \"//\"\n    permaUrl += window.location.host\n    permaUrl += this.props.post.url.index\n\n    prompt(pgettext(\"post permalink\", \"Permament link to this post:\"), permaUrl)\n  }\n\n  render() {\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">link</span>\n          {pgettext(\"post options permalink btn\", \"Permament link\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Edit extends React.Component {\n  onClick = () => {\n    posting.open({\n      mode: \"EDIT\",\n\n      thread: this.props.thread,\n      post: this.props.post,\n      config: this.props.post.api.editor,\n      submit: this.props.post.api.index,\n    })\n  }\n\n  render() {\n    if (!this.props.post.acl.can_edit) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">edit</span>\n          {pgettext(\"post options edit btn\", \"Edit\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class MarkAsBestAnswer extends React.Component {\n  onClick = () => {\n    moderation.markAsBestAnswer(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (!thread.acl.can_mark_best_answer) return null\n    if (!post.acl.can_mark_as_best_answer) return null\n    if (post.id === thread.best_answer) return null\n    if (thread.best_answer && !thread.acl.can_change_best_answer) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">check_box</span>\n          {pgettext(\"post options best answer btn\", \"Mark as best answer\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class UnmarkMarkBestAnswer extends React.Component {\n  onClick = () => {\n    moderation.unmarkBestAnswer(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (post.id !== thread.best_answer) return null\n    if (!thread.acl.can_unmark_best_answer) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">check_box_outline_blank</span>\n          {pgettext(\"post options best answer btn\", \"Unmark best answer\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class PostEdits extends React.Component {\n  onClick = () => {\n    modal.show(<PostChangelog post={this.props.post} />)\n  }\n\n  render() {\n    const isHidden =\n      this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n    const isUnedited = this.props.post.edits === 0\n    if (isHidden || isUnedited) return null\n\n    const message = npgettext(\n      \"post edits\",\n      \"This post was edited %(edits)s time.\",\n      \"This post was edited %(edits)s times.\",\n      this.props.post.edits\n    )\n\n    const title = interpolate(\n      message,\n      {\n        edits: this.props.post.edits,\n      },\n      true\n    )\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">edit</span>\n          {pgettext(\"post options edit btn\", \"Changes history\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Approve extends React.Component {\n  onClick = () => {\n    moderation.approve(this.props)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_approve) return null\n    if (!this.props.post.is_unapproved) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">done</span>\n          {pgettext(\"post options approve btn\", \"Approve\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Move extends React.Component {\n  onClick = () => {\n    modal.show(<MoveModal {...this.props} />)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_move) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">arrow_forward</span>\n          {pgettext(\"post options move btn\", \"Move\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Split extends React.Component {\n  onClick = () => {\n    modal.show(<SplitModal {...this.props} />)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_move) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">call_split</span>\n          {pgettext(\"post options split btn\", \"Split\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Protect extends React.Component {\n  onClick = () => {\n    moderation.protect(this.props)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_protect) return null\n    if (this.props.post.is_protected) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">lock_outline</span>\n          {pgettext(\"post options protect btn\", \"Protect\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Unprotect extends React.Component {\n  onClick = () => {\n    moderation.unprotect(this.props)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_protect) return null\n    if (!this.props.post.is_protected) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">lock_open</span>\n          {pgettext(\"post options protect btn\", \"Remove protection\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Hide extends React.Component {\n  onClick = () => {\n    moderation.hide(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (post.id === thread.best_answer) return null\n    if (!post.acl.can_hide) return null\n    if (post.is_hidden) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">visibility_off</span>\n          {pgettext(\"post options hide btn\", \"Hide\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Unhide extends React.Component {\n  onClick = () => {\n    moderation.unhide(this.props)\n  }\n\n  render() {\n    if (!this.props.post.acl.can_unhide) return null\n    if (!this.props.post.is_hidden) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">visibility</span>\n          {pgettext(\"post options hide btn\", \"Unhide\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Delete extends React.Component {\n  onClick = () => {\n    moderation.remove(this.props)\n  }\n\n  render() {\n    const { post, thread } = this.props\n\n    if (post.id === thread.best_answer) return null\n    if (!post.acl.can_delete) return null\n\n    return (\n      <li>\n        <button className=\"btn btn-link\" onClick={this.onClick} type=\"button\">\n          <span className=\"material-icon\">clear</span>\n          {pgettext(\"post options delete btn\", \"Delete\")}\n        </button>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport Dropdown from \"./dropdown\"\n\nexport default function (props) {\n  return (\n    <div className=\"pull-right dropdown\">\n      <button\n        aria-expanded=\"true\"\n        aria-haspopup=\"true\"\n        className=\"btn btn-default btn-icon dropdown-toggle\"\n        data-toggle=\"dropdown\"\n        type=\"button\"\n      >\n        <span className=\"material-icon\">expand_more</span>\n      </button>\n      <Dropdown {...props} />\n    </div>\n  )\n}\n","import React from \"react\"\nimport * as posts from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n  onClick = () => {\n    if (this.props.post.isSelected) {\n      store.dispatch(posts.deselect(this.props.post))\n    } else {\n      store.dispatch(posts.select(this.props.post))\n    }\n  }\n\n  render() {\n    if (\n      !(this.props.thread.acl.can_merge_posts || isVisible(this.props.post.acl))\n    ) {\n      return null\n    }\n\n    return (\n      <div className=\"pull-right\">\n        <button\n          className=\"btn btn-default btn-icon\"\n          onClick={this.onClick}\n          type=\"button\"\n        >\n          <span className=\"material-icon\">\n            {this.props.post.isSelected\n              ? \"check_box\"\n              : \"check_box_outline_blank\"}\n          </span>\n        </button>\n      </div>\n    )\n  }\n}\n\nexport function isVisible(acl) {\n  return (\n    acl.can_approve ||\n    acl.can_hide ||\n    acl.can_protect ||\n    acl.can_unhide ||\n    acl.can_delete ||\n    acl.can_move\n  )\n}\n","import React from \"react\"\nimport Controls from \"./controls\"\nimport Select from \"./select\"\nimport {\n  StatusIcon,\n  getStatusClassName,\n  getStatusDescription,\n} from \"misago/components/user-status\"\nimport PostChangelog from \"misago/components/post-changelog\"\nimport modal from \"misago/services/modal\"\n\nexport default function (props) {\n  return (\n    <div className=\"post-heading\">\n      <UnreadLabel {...props} />\n      <UnreadCompact {...props} />\n      <PostedOn {...props} />\n      <PostedOnCompact {...props} />\n      <PostEdits {...props} />\n      <PostEditsCompacts {...props} />\n      <ProtectedLabel {...props} />\n      <Select {...props} />\n      <Controls {...props} />\n    </div>\n  )\n}\n\nexport function UnreadLabel(props) {\n  if (props.post.is_read) return null\n\n  return (\n    <span className=\"label label-unread hidden-xs\">\n      {pgettext(\"post unread label\", \"New post\")}\n    </span>\n  )\n}\n\nexport function UnreadCompact(props) {\n  if (props.post.is_read) return null\n\n  return (\n    <span className=\"label label-unread visible-xs-inline-block\">\n      {pgettext(\"post unread label\", \"New\")}\n    </span>\n  )\n}\n\nexport function PostedOn(props) {\n  const tooltip = interpolate(\n    pgettext(\"post timestamp\", \"posted %(posted_on)s\"),\n    {\n      posted_on: props.post.posted_on.format(\"LL, LT\"),\n    },\n    true\n  )\n\n  return (\n    <a\n      href={props.post.url.index}\n      className=\"btn btn-link posted-on hidden-xs\"\n      title={tooltip}\n    >\n      {props.post.posted_on.fromNow()}\n    </a>\n  )\n}\n\nexport function PostedOnCompact(props) {\n  return (\n    <a\n      href={props.post.url.index}\n      className=\"btn btn-link posted-on visible-xs-inline-block\"\n    >\n      {props.post.posted_on.fromNow()}\n    </a>\n  )\n}\n\nexport class PostEdits extends React.Component {\n  onClick = () => {\n    modal.show(<PostChangelog post={this.props.post} />)\n  }\n\n  render() {\n    const isHidden =\n      this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n    const isUnedited = this.props.post.edits === 0\n    if (isHidden || isUnedited) return null\n\n    const tooltip = npgettext(\n      \"post edits stat\",\n      \"This post was edited %(edits)s time.\",\n      \"This post was edited %(edits)s times.\",\n      this.props.post.edits\n    )\n\n    const title = interpolate(\n      tooltip,\n      {\n        edits: this.props.post.edits,\n      },\n      true\n    )\n\n    const label = npgettext(\n      \"post edits stat\",\n      \"edited %(edits)s time\",\n      \"edited %(edits)s times\",\n      this.props.post.edits\n    )\n\n    return (\n      <button\n        className=\"btn btn-link btn-see-edits hidden-xs\"\n        onClick={this.onClick}\n        title={title}\n        type=\"button\"\n      >\n        {interpolate(\n          label,\n          {\n            edits: this.props.post.edits,\n          },\n          true\n        )}\n      </button>\n    )\n  }\n}\n\nexport class PostEditsCompacts extends PostEdits {\n  render() {\n    const isHidden =\n      this.props.post.is_hidden && !this.props.post.acl.can_see_hidden\n    const isUnedited = this.props.post.edits === 0\n    if (isHidden || isUnedited) return null\n\n    const label = npgettext(\n      \"post edits stat\",\n      \"%(edits)s edit\",\n      \"%(edits)s edits\",\n      this.props.post.edits\n    )\n\n    return (\n      <button\n        className=\"btn btn-link btn-see-edits visible-xs-inline-block\"\n        onClick={this.onClick}\n        type=\"button\"\n      >\n        {interpolate(\n          label,\n          {\n            edits: this.props.post.edits,\n          },\n          true\n        )}\n      </button>\n    )\n  }\n}\n\nexport function ProtectedLabel(props) {\n  const postAuthor = props.post.poster && props.post.poster.id === props.user.id\n  const hasAcl = props.post.acl.can_protect\n  const isVisible =\n    props.user.id && props.post.is_protected && (postAuthor || hasAcl)\n\n  if (!isVisible) {\n    return null\n  }\n\n  return (\n    <span\n      className=\"label label-protected hidden-xs\"\n      title={pgettext(\n        \"post protected label\",\n        \"This post is protected and may not be edited.\"\n      )}\n    >\n      <span className=\"material-icon\">lock_outline</span>\n      {pgettext(\"post protected label\", \"protected\")}\n    </span>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\n\nexport default function ({ post, thread }) {\n  return (\n    <div className=\"post-side post-side-anonymous\">\n      <Select post={post} thread={thread} />\n      <Controls post={post} thread={thread} />\n      <div className=\"media\">\n        <div className=\"media-left\">\n          <span>\n            <Avatar className=\"poster-avatar\" size={100} />\n          </span>\n        </div>\n        <div className=\"media-body\">\n          <span className=\"media-heading item-title\">{post.poster_name}</span>\n\n          <span className=\"user-title user-title-anonymous\">\n            {pgettext(\"post removed poster username\", \"Removed user\")}\n          </span>\n        </div>\n      </div>\n    </div>\n  )\n}\n","export default function ({ title, rank }) {\n  return rank.is_tab || !!title || !!rank.title\n}\n","import React from \"react\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n  const message = npgettext(\n    \"poster stats\",\n    \"%(posts)s post\",\n    \"%(posts)s posts\",\n    poster.posts\n  )\n\n  let className = \"user-postcount\"\n  if (hasVisibleTitle(poster)) {\n    className += \" hidden-xs hidden-sm\"\n  }\n\n  return (\n    <span className={className}>\n      {interpolate(\n        message,\n        {\n          posts: poster.posts,\n        },\n        true\n      )}\n    </span>\n  )\n}\n","import React from \"react\"\nimport UserStatus, { StatusLabel } from \"misago/components/user-status\"\nimport hasVisibleTitle from \"./has-visible-title\"\n\nexport default function ({ poster }) {\n  let className = \"hidden-xs\"\n  if (hasVisibleTitle(poster)) {\n    className += \" hidden-sm\"\n  }\n\n  return (\n    <span className={className}>\n      <UserStatus status={poster.status}>\n        <StatusLabel status={poster.status} user={poster} />\n      </UserStatus>\n    </span>\n  )\n}\n","import React from \"react\"\n\nexport default function ({ rank, title }) {\n  let userTitle = title || rank.title\n  if (!userTitle && rank.is_tab) {\n    userTitle = rank.name\n  }\n\n  if (!userTitle) return null\n\n  let className = \"user-title\"\n  if (rank.css_class) {\n    className += \" user-title-\" + rank.css_class\n  }\n\n  if (rank.is_tab) {\n    return (\n      <div className={className}>\n        <a href={rank.url}>{userTitle}</a>\n      </div>\n    )\n  }\n\n  return <div className={className}>{userTitle}</div>\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport Controls from \"misago/components/posts-list/post/controls\"\nimport Select from \"misago/components/posts-list/post/select\"\nimport UserStatus, { StatusIcon } from \"misago/components/user-status\"\nimport UserPostcount from \"./user-postcount\"\nimport UserStatusLabel from \"./user-status\"\nimport UserTitle from \"./user-title\"\n\nexport default function ({ post, thread }) {\n  const { poster } = post\n\n  return (\n    <div className=\"post-side post-side-registered\">\n      <Select post={post} thread={thread} />\n      <Controls post={post} thread={thread} />\n      <div className=\"media\">\n        <div className=\"media-left\">\n          <a href={poster.url}>\n            <Avatar className=\"poster-avatar\" size={100} user={poster} />\n          </a>\n        </div>\n        <div className=\"media-body\">\n          <div className=\"media-heading\">\n            <a className=\"item-title\" href={poster.url}>\n              {poster.username}\n            </a>\n            <UserStatus status={poster.status}>\n              <StatusIcon status={poster.status} />\n            </UserStatus>\n          </div>\n\n          <UserTitle rank={poster.rank} title={poster.title} />\n\n          <UserStatusLabel poster={poster} />\n          <UserPostcount poster={poster} />\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Anonymous from \"./anonymous\"\nimport Registered from \"./registered\"\n\nexport default function (props) {\n  if (props.post.poster) {\n    return <Registered {...props} />\n  }\n\n  return <Anonymous {...props} />\n}\n","import React from \"react\"\nimport Attachments from \"./attachments\"\nimport Body from \"./body\"\nimport {\n  FlagBestAnswer,\n  FlagHidden,\n  FlagUnapproved,\n  FlagProtected,\n} from \"./flags\"\nimport Footer from \"./footer\"\nimport Header from \"./header\"\nimport PostSide from \"./post-side\"\n\nexport default function (props) {\n  let className = \"post\"\n  if (props.post.isDeleted) {\n    className = \"hide\"\n  } else if (props.post.is_hidden && !props.post.acl.can_see_hidden) {\n    className = \"post post-hidden\"\n  }\n\n  if (props.post.poster && props.post.poster.rank.css_class) {\n    className += \" post-\" + props.post.poster.rank.css_class\n  }\n\n  if (!props.post.is_read) {\n    className += \" post-new\"\n  }\n\n  return (\n    <li id={\"post-\" + props.post.id} className={className}>\n      <div className=\"panel panel-default panel-post\">\n        <div className=\"panel-body\">\n          <PostSide {...props} />\n          <div className=\"panel-content\">\n            <Header {...props} />\n            <FlagBestAnswer {...props} />\n            <FlagUnapproved {...props} />\n            <FlagProtected {...props} />\n            <FlagHidden {...props} />\n            <Body {...props} />\n            <Attachments {...props} />\n            <Footer {...props} />\n          </div>\n        </div>\n      </div>\n    </li>\n  )\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nconst PostPreview = () => (\n  <li className=\"post\">\n    <div className=\"panel panel-default panel-post\">\n      <div className=\"panel-body\">\n        <div className=\"post-side post-side-registered\">\n          <div className=\"media\">\n            <div className=\"media-left\">\n              <span>\n                <Avatar className=\"poster-avatar\" size=\"100\" />\n              </span>\n            </div>\n            <div className=\"media-body\">\n              <span className=\"media-heading item-title\">\n                <span className=\"ui-preview-text\" style={{ width: \"80px\" }}>\n                  &nbsp;\n                </span>\n              </span>\n              <span className=\"user-title user-title-anonymous\">\n                <span className=\"ui-preview-text\" style={{ width: \"60px\" }}>\n                  &nbsp;\n                </span>\n              </span>\n            </div>\n          </div>\n        </div>\n        <div className=\"panel-content\">\n          <div className=\"post-body\">\n            <article className=\"misago-markup\">\n              <p className=\"ui-preview-text\" style={{ width: \"100%\" }}>\n                &nbsp;\n              </p>\n              <p className=\"ui-preview-text\" style={{ width: \"70%\" }}>\n                &nbsp;\n              </p>\n              <p\n                className=\"ui-preview-text hidden-xs hidden-sm\"\n                style={{ width: \"85%\" }}\n              >\n                &nbsp;\n              </p>\n            </article>\n          </div>\n        </div>\n      </div>\n    </div>\n  </li>\n)\n\nexport default PostPreview\n","import React from \"react\"\nimport Event from \"./event\"\nimport Post from \"./post\"\nimport PostPreview from \"./post/preview\"\n\nexport default function (props) {\n  if (!props.posts.isLoaded) {\n    return (\n      <ul className=\"posts-list ui-preview\">\n        <PostPreview />\n      </ul>\n    )\n  }\n\n  return (\n    <ul className=\"posts-list ui-ready\">\n      {props.posts.results.map((post) => {\n        return <ListItem key={post.id} post={post} {...props} />\n      })}\n    </ul>\n  )\n}\n\nexport function ListItem(props) {\n  if (props.post.is_event) {\n    return <Event {...props} />\n  }\n\n  return <Post {...props} />\n}\n","import React from \"react\"\nimport Avatar from \"./avatar\"\n\nconst ThreadStarterCard = ({ thread }) => (\n  <div className=\"thread-user-card\">\n    <div className=\"thread-user-card-media\">\n      {thread.starter ? (\n        <a href={thread.url.starter}>\n          <Avatar size={40} user={thread.starter} />\n        </a>\n      ) : (\n        <Avatar size={40} />\n      )}\n    </div>\n    <div className=\"thread-user-card-body\">\n      <div className=\"thread-user-card-header\">\n        {thread.starter ? (\n          <a\n            className=\"item-title\"\n            href={thread.url.starter}\n            title={pgettext(\"thread starter info\", \"Thread author\")}\n          >\n            {thread.starter.username}\n          </a>\n        ) : (\n          <span\n            className=\"item-title\"\n            title={pgettext(\"thread starter info\", \"Thread author\")}\n          >\n            {thread.starter_name}\n          </span>\n        )}\n      </div>\n      <div>\n        <span\n          className=\"text-muted\"\n          title={interpolate(\n            pgettext(\"thread starter info\", \"Started on: %(timestamp)s\"),\n            {\n              timestamp: thread.started_on.format(\"LLL\"),\n            },\n            true\n          )}\n        >\n          {thread.started_on.fromNow()}\n        </span>\n      </div>\n    </div>\n  </div>\n)\n\nexport default ThreadStarterCard\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport { getTitleValidators } from \"misago/components/posting/utils/validators\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      title: props.thread.title,\n\n      validators: {\n        title: getTitleValidators(),\n      },\n      errors: {},\n    }\n  }\n\n  clean() {\n    if (!this.state.title.trim().length) {\n      snackbar.error(\n        pgettext(\"thread title form\", \"You have to enter thread title.\")\n      )\n      return false\n    }\n\n    const errors = this.validate()\n\n    if (errors.title) {\n      snackbar.error(errors.title[0])\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    // freeze thread\n    store.dispatch(thread.busy())\n\n    return ajax.patch(this.props.thread.api.index, [\n      { op: \"replace\", path: \"title\", value: this.state.title },\n    ])\n  }\n\n  handleSuccess = (data) => {\n    this.handleSuccessUnmounted(data)\n\n    // keep form loading\n    this.setState({\n      isLoading: true,\n    })\n\n    modal.hide()\n  }\n\n  handleSuccessUnmounted = (data) => {\n    store.dispatch(thread.release())\n    store.dispatch(thread.update(data))\n  }\n\n  handleError = (rejection) => {\n    store.dispatch(thread.release())\n\n    if (rejection.status === 400) {\n      snackbar.error(rejection.detail[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onChange = (event) => {\n    this.changeValue(\"title\", event.target.value)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog modal-lg\" role=\"document\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-content\">\n            <ModalHeader />\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"id_modal_title\"\n                label={pgettext(\"thread title form field\", \"Thread title\")}\n              >\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading || this.props.thread.isBusy}\n                  id=\"id_modal_title\"\n                  onChange={this.onChange}\n                  value={this.state.title}\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"thread title form btn\", \"Cancel\")}\n              </button>\n              <button\n                className=\"btn btn-primary\"\n                disabled={this.state.isLoading || this.props.thread.isBusy}\n              >\n                {pgettext(\"thread title form btn\", \"Change title\")}\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\"thread title form title\", \"Change title\")}\n      </h4>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      url: \"\",\n\n      validators: {\n        url: [],\n      },\n      errors: {},\n    }\n  }\n\n  clean() {\n    if (!this.state.url.trim().length) {\n      snackbar.error(\n        pgettext(\n          \"thread merge form\",\n          \"You have to enter link to the other thread.\"\n        )\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    // freeze thread\n    store.dispatch(thread.busy())\n\n    return ajax.post(this.props.thread.api.merge, {\n      other_thread: this.state.url,\n    })\n  }\n\n  handleSuccess = (success) => {\n    this.handleSuccessUnmounted(success)\n\n    // keep form loading\n    this.setState({\n      isLoading: true,\n    })\n  }\n\n  handleSuccessUnmounted = (success) => {\n    snackbar.success(\n      pgettext(\"thread merge form\", \"Thread has been merged with other one.\")\n    )\n    window.location = success.url\n  }\n\n  handleError = (rejection) => {\n    store.dispatch(thread.release())\n\n    if (rejection.status === 400) {\n      if (rejection.best_answers || rejection.polls) {\n        modal.show(\n          <MergeConflict\n            api={this.props.thread.api.merge}\n            bestAnswers={rejection.best_answers}\n            data={{ other_thread: this.state.url }}\n            polls={rejection.polls}\n            onError={this.handleError}\n            onSuccess={this.handleSuccessUnmounted}\n          />\n        )\n      } else if (rejection.best_answer) {\n        snackbar.error(rejection.best_answer[0])\n      } else if (rejection.poll) {\n        snackbar.error(rejection.poll[0])\n      } else {\n        snackbar.error(rejection.detail)\n      }\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onUrlChange = (event) => {\n    this.changeValue(\"url\", event.target.value)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-content\">\n            <ModalHeader />\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"id_url\"\n                label={pgettext(\n                  \"thread merge form field\",\n                  \"Link to thread you want to merge with\"\n                )}\n                help_text={pgettext(\n                  \"thread merge form field\",\n                  \"Merge will delete current thread and move its contents to the thread specified here.\"\n                )}\n              >\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading || this.props.thread.isBusy}\n                  id=\"id_url\"\n                  onChange={this.onUrlChange}\n                  value={this.state.url}\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"thread merge form btn\", \"Cancel\")}\n              </button>\n              <button\n                className=\"btn btn-primary\"\n                disabled={this.state.isLoading || this.props.thread.isBusy}\n              >\n                {pgettext(\"thread merge form btn\", \"Merge thread\")}\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\"thread merge form title\", \"Merge thread\")}\n      </h4>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport misago from \"misago\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isReady: false,\n      isLoading: false,\n      isError: false,\n\n      category: null,\n      categories: [],\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n      (data) => {\n        let category = null\n\n        // hydrate categories, extract posting options\n        const categories = data.map((item) => {\n          // pick first category that allows posting and if it may, override it with initial one\n          if (item.post !== false && !category) {\n            category = item.id\n          }\n\n          return Object.assign(item, {\n            disabled: item.post === false,\n            label: item.name,\n            value: item.id,\n          })\n        })\n\n        this.setState({\n          isReady: true,\n\n          category,\n          categories,\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isError: rejection.detail,\n        })\n      }\n    )\n  }\n\n  send() {\n    // freeze thread\n    store.dispatch(thread.busy())\n\n    return ajax.patch(this.props.thread.api.index, [\n      { op: \"replace\", path: \"category\", value: this.state.category },\n    ])\n  }\n\n  handleSuccess() {\n    // refresh thread and displayed posts\n    ajax\n      .get(this.props.thread.api.posts.index, { page: this.props.posts.page })\n      .then(\n        (data) => {\n          store.dispatch(thread.replace(data))\n          store.dispatch(posts.load(data.post_set))\n          store.dispatch(thread.release())\n\n          snackbar.success(\n            pgettext(\"thread move form\", \"Thread has been moved.\")\n          )\n          modal.hide()\n        },\n        (rejection) => {\n          store.dispatch(thread.release())\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(rejection.detail[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onCategoryChange = (event) => {\n    this.changeValue(\"category\", event.target.value)\n  }\n\n  render() {\n    if (this.state.isReady) {\n      return (\n        <div className=\"modal-dialog\" role=\"document\">\n          <form onSubmit={this.handleSubmit}>\n            <div className=\"modal-content\">\n              <ModalHeader />\n              <div className=\"modal-body\">\n                <FormGroup\n                  for=\"id_category\"\n                  label={pgettext(\"thread move form field\", \"New category\")}\n                >\n                  <CategorySelect\n                    choices={this.state.categories}\n                    disabled={this.state.isLoading || this.props.thread.isBusy}\n                    id=\"id_category\"\n                    onChange={this.onCategoryChange}\n                    value={this.state.category}\n                  />\n                </FormGroup>\n              </div>\n              <div className=\"modal-footer\">\n                <button\n                  className=\"btn btn-default\"\n                  data-dismiss=\"modal\"\n                  disabled={this.state.isLoading}\n                  type=\"button\"\n                >\n                  {pgettext(\"thread move form btn\", \"Cancel\")}\n                </button>\n                <button\n                  className=\"btn btn-primary\"\n                  disabled={this.state.isLoading || this.props.thread.isBusy}\n                >\n                  {pgettext(\"thread move form btn\", \"Move thread\")}\n                </button>\n              </div>\n            </div>\n          </form>\n        </div>\n      )\n    } else if (this.state.isError) {\n      return <ModalMessage message={this.state.isError} />\n    } else {\n      return <ModalLoading />\n    }\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\"thread move form title\", \"Move thread\")}\n      </h4>\n    </div>\n  )\n}\n\nexport function ModalLoading(props) {\n  return (\n    <div className=\"modal-dialog\" role=\"document\">\n      <div className=\"modal-content\">\n        <ModalHeader />\n        <ModalLoader />\n      </div>\n    </div>\n  )\n}\n\nexport function ModalMessage(props) {\n  return (\n    <div className=\"modal-dialog modal-message\" role=\"document\">\n      <div className=\"modal-content\">\n        <ModalHeader />\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">info_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">\n            {pgettext(\n              \"thread move form\",\n              \"You can't move this thread at the moment.\"\n            )}\n          </p>\n          <p>{props.message}</p>\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"thread move form dismiss btn\", \"Ok\")}\n          </button>\n        </div>\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ThreadChangeTitleModal from \"./ThreadChangeTitleModal\"\nimport MergeModal from \"./merge\"\nimport MoveModal from \"./move\"\n\nexport default class extends React.Component {\n  callApi = (ops, successMessage) => {\n    store.dispatch(thread.busy())\n\n    // by the chance update thread acl too\n    ops.push({ op: \"add\", path: \"acl\", value: true })\n\n    ajax.patch(this.props.thread.api.index, ops).then(\n      (data) => {\n        store.dispatch(thread.update(data))\n        store.dispatch(thread.release())\n        snackbar.success(successMessage)\n      },\n      (rejection) => {\n        store.dispatch(thread.release())\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail[0])\n        } else {\n          snackbar.apiError(rejection)\n        }\n      }\n    )\n  }\n\n  changeTitle = () => {\n    modal.show(<ThreadChangeTitleModal thread={this.props.thread} />)\n  }\n\n  pinGlobally = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 2,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been pinned globally.\")\n    )\n  }\n\n  pinLocally = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 1,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been pinned in category.\")\n    )\n  }\n\n  unpin = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 0,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been unpinned.\")\n    )\n  }\n\n  approve = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-unapproved\",\n          value: false,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been approved.\")\n    )\n  }\n\n  open = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-closed\",\n          value: false,\n        },\n      ],\n      gettext(\"Thread has been opened.\")\n    )\n  }\n\n  close = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-closed\",\n          value: true,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been closed.\")\n    )\n  }\n\n  unhide = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-hidden\",\n          value: false,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been made visible.\")\n    )\n  }\n\n  hide = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-hidden\",\n          value: true,\n        },\n      ],\n      pgettext(\"thread moderation\", \"Thread has been made hidden.\")\n    )\n  }\n\n  move = () => {\n    modal.show(\n      <MoveModal posts={this.props.posts} thread={this.props.thread} />\n    )\n  }\n\n  merge = () => {\n    modal.show(<MergeModal thread={this.props.thread} />)\n  }\n\n  delete = () => {\n    if (\n      !window.confirm(\n        pgettext(\n          \"thread moderation\",\n          \"Are you sure you want to delete this thread?\"\n        )\n      )\n    ) {\n      return\n    }\n\n    store.dispatch(thread.busy())\n\n    ajax.delete(this.props.thread.api.index).then(\n      (data) => {\n        snackbar.success(\n          pgettext(\"thread moderation\", \"Thread has been deleted.\")\n        )\n        window.location = this.props.thread.category.url.index\n      },\n      (rejection) => {\n        store.dispatch(thread.release())\n        snackbar.apiError(rejection)\n      }\n    )\n  }\n\n  render() {\n    const { moderation } = this.props\n\n    return (\n      <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n        {!!moderation.edit && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.changeTitle}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">edit</span>\n              {pgettext(\"thread moderation btn\", \"Change title\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.pinGlobally && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.pinGlobally}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">bookmark</span>\n              {pgettext(\"thread moderation btn\", \"Pin globally\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.pinLocally && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.pinLocally}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">bookmark_border</span>\n              {pgettext(\"thread moderation btn\", \"Pin in category\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.unpin && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.unpin} type=\"button\">\n              <span className=\"material-icon\">panorama_fish_eye</span>\n              {pgettext(\"thread moderation btn\", \"Unpin\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.move && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.move} type=\"button\">\n              <span className=\"material-icon\">arrow_forward</span>\n              {pgettext(\"thread moderation btn\", \"Move\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.merge && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.merge} type=\"button\">\n              <span className=\"material-icon\">call_merge</span>\n              {pgettext(\"thread moderation btn\", \"Merge\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.approve && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.approve}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">done</span>\n              {pgettext(\"thread moderation btn\", \"Approve\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.open && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.open} type=\"button\">\n              <span className=\"material-icon\">lock_open</span>\n              {pgettext(\"thread moderation btn\", \"Open\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.close && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.close} type=\"button\">\n              <span className=\"material-icon\">lock_outline</span>\n              {pgettext(\"thread moderation btn\", \"Close\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.unhide && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.unhide}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">visibility</span>\n              {pgettext(\"thread moderation btn\", \"Unhide\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.hide && (\n          <li>\n            <button className=\"btn btn-link\" onClick={this.hide} type=\"button\">\n              <span className=\"material-icon\">visibility_off</span>\n              {pgettext(\"thread moderation btn\", \"Hide\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.delete && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              onClick={this.delete}\n              type=\"button\"\n            >\n              <span className=\"material-icon\">clear</span>\n              {pgettext(\"thread moderation btn\", \"Delete\")}\n            </button>\n          </li>\n        )}\n      </ul>\n    )\n  }\n}\n","import ThreadModerationOptions from \"./controls\"\n\nexport default ThreadModerationOptions\n","import React from \"react\"\nimport ThreadModerationOptions from \"./moderation/thread\"\n\nconst ThreadModeration = ({ thread, posts, moderation }) => (\n  <div className=\"dropdown\">\n    <button\n      type=\"button\"\n      className=\"btn btn-default btn-outline btn-icon dropdown-toggle\"\n      title={pgettext(\"thread options btn\", \"Thread options\")}\n      data-toggle=\"dropdown\"\n      aria-haspopup=\"true\"\n      aria-expanded=\"false\"\n      disabled={thread.isBusy}\n    >\n      <span className=\"material-icon\">settings</span>\n    </button>\n    <ThreadModerationOptions\n      thread={thread}\n      posts={posts}\n      moderation={moderation}\n    />\n  </div>\n)\n\nexport default ThreadModeration\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport { connect } from \"react-redux\"\nimport { update } from \"../../reducers/thread\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadWatchButton = ({ dispatch, dropup, stickToBottom, thread }) => (\n  <ApiMutation url={thread.api.watch}>\n    {(mutate, { loading }) => {\n      function setNotifications(notifications) {\n        if (thread.notifications !== notifications) {\n          dispatch(update({ notifications }))\n          mutate({\n            json: { notifications },\n            onError: (error) => {\n              snackbar.apiError(error)\n              dispatch(update({ notifications: thread.notifications }))\n            },\n          })\n        }\n      }\n\n      return (\n        <div className={dropup ? \"dropup\" : \"dropdown\"}>\n          <button\n            className=\"btn btn-default btn-outline btn-block\"\n            aria-expanded=\"true\"\n            aria-haspopup=\"true\"\n            data-toggle=\"dropdown\"\n            type=\"button\"\n          >\n            <span className=\"material-icon\">\n              {getIcon(thread.notifications)}\n            </span>\n            {getLabel(thread.notifications)}\n          </button>\n          <ul\n            className={classnames(\"dropdown-menu dropdown-menu-right\", {\n              \"stick-to-bottom\": stickToBottom,\n            })}\n          >\n            <DropdownSubheader>\n              {pgettext(\"watch thread\", \"Notify about new replies\")}\n            </DropdownSubheader>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={loading}\n                onClick={() => setNotifications(2)}\n              >\n                <span className=\"material-icon\">mail</span>\n                {pgettext(\"watch thread\", \"On site and with e-mail\")}\n              </button>\n            </li>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={loading}\n                onClick={() => setNotifications(1)}\n              >\n                <span className=\"material-icon\">notifications_active</span>\n                {pgettext(\"watch thread\", \"On site only\")}\n              </button>\n            </li>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={loading}\n                onClick={() => setNotifications(0)}\n              >\n                <span className=\"material-icon\">notifications_none</span>\n                {pgettext(\"watch thread\", \"Don't notify\")}\n              </button>\n            </li>\n          </ul>\n        </div>\n      )\n    }}\n  </ApiMutation>\n)\n\nfunction getIcon(notifications) {\n  if (notifications === 2) return \"mail\"\n  if (notifications === 1) return \"notifications_active\"\n\n  return \"notifications_none\"\n}\n\nfunction getLabel(notifications) {\n  if (notifications) {\n    return pgettext(\"watch thread\", \"Watching\")\n  }\n\n  return pgettext(\"watch thread\", \"Watch\")\n}\n\nconst ThreadWatchButtonConnected = connect()(ThreadWatchButton)\n\nexport default ThreadWatchButtonConnected\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst Breadcrumbs = ({ children, className }) => (\n  <ul className={classnames(\"breadcrumbs\", className)}>{children}</ul>\n)\n\nexport default Breadcrumbs\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsCategory = ({ category, className }) => (\n  <li className={classnames(\"breadcrumbs-item\", className)}>\n    <a href={category.url.index}>\n      <span\n        className=\"material-icon\"\n        style={{ color: category.color || \"inherit\" }}\n      >\n        label\n      </span>\n      {!!category.short_name && (\n        <span\n          className=\"breadcrumbs-item-name hidden-sm hidden-md hidden-lg\"\n          title={category.name}\n        >\n          {category.short_name}\n        </span>\n      )}\n      {!!category.short_name && (\n        <span className=\"breadcrumbs-item-name hidden-xs\">{category.name}</span>\n      )}\n      {!category.short_name && (\n        <span className=\"breadcrumbs-item-name\">{category.name}</span>\n      )}\n    </a>\n  </li>\n)\n\nexport default BreadcrumbsCategory\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst BreadcrumbsRootCategory = ({ category, className }) => (\n  <li className={classnames(\"breadcrumbs-item\", className)}>\n    <a href={category.url.index}>\n      <span className=\"material-icon\">chevron_right</span>\n      <span className=\"breadcrumbs-item-name\">\n        {category.special_role === \"root_category\"\n          ? pgettext(\"breadcrumb\", \"Threads\")\n          : pgettext(\"breadcrumb\", \"Private threads\")}\n      </span>\n    </a>\n  </li>\n)\n\nexport default BreadcrumbsRootCategory\n","import React from \"react\"\nimport {\n  Breadcrumbs,\n  BreadcrumbsCategory,\n  BreadcrumbsRootCategory,\n} from \"../../Breadcrumbs\"\n\nconst ThreadHeaderBreadcrumbs = ({ breadcrumbs }) => (\n  <Breadcrumbs>\n    {breadcrumbs.map((category) =>\n      category.special_role ? (\n        <BreadcrumbsRootCategory key={category.id} category={category} />\n      ) : (\n        <BreadcrumbsCategory key={category.id} category={category} />\n      )\n    )}\n  </Breadcrumbs>\n)\n\nexport default ThreadHeaderBreadcrumbs\n","import React from \"react\"\nimport { FlexRow, FlexRowCol, FlexRowSection } from \"../../FlexRow\"\nimport ThreadFlags from \"../../ThreadFlags\"\nimport ThreadReplies from \"../../ThreadReplies\"\nimport ThreadStarterCard from \"../../ThreadStarterCard\"\nimport {\n  PageHeader,\n  PageHeaderBanner,\n  PageHeaderContainer,\n  PageHeaderDetails,\n} from \"../../PageHeader\"\nimport ThreadModeration from \"../ThreadModeration\"\nimport ThreadWatchButton from \"../ThreadWatchButton\"\nimport ThreadHeaderBreadcrumbs from \"./ThreadHeaderBreadcrumbs\"\n\nconst ThreadHeader = ({ styleName, thread, posts, user, moderation }) => (\n  <PageHeaderContainer>\n    <PageHeader styleName={styleName}>\n      <PageHeaderBanner styleName={styleName}>\n        <ThreadHeaderBreadcrumbs breadcrumbs={thread.path} />\n        <h1>{thread.title}</h1>\n      </PageHeaderBanner>\n      <PageHeaderDetails className=\"page-header-thread-details\">\n        <FlexRow>\n          <FlexRowSection auto>\n            <FlexRowCol shrink>\n              <ThreadStarterCard thread={thread} />\n            </FlexRowCol>\n            <FlexRowCol auto />\n            {thread.replies > 0 && (\n              <FlexRowCol shrink>\n                <ThreadReplies thread={thread} />\n              </FlexRowCol>\n            )}\n            {hasFlags(thread) && (\n              <FlexRowCol shrink>\n                <ThreadFlags thread={thread} />\n              </FlexRowCol>\n            )}\n          </FlexRowSection>\n          {user.is_authenticated && (\n            <FlexRowSection>\n              <FlexRowCol>\n                <ThreadWatchButton thread={thread} />\n              </FlexRowCol>\n              {moderation.enabled && (\n                <FlexRowCol shrink>\n                  <ThreadModeration\n                    thread={thread}\n                    posts={posts}\n                    moderation={moderation}\n                  />\n                </FlexRowCol>\n              )}\n            </FlexRowSection>\n          )}\n        </FlexRow>\n      </PageHeaderDetails>\n    </PageHeader>\n  </PageHeaderContainer>\n)\n\nconst hasFlags = (thread) => {\n  return (\n    thread.is_closed ||\n    thread.is_hidden ||\n    thread.is_unapproved ||\n    thread.weight > 0 ||\n    thread.best_answer ||\n    thread.has_poll ||\n    thread.has_unapproved_posts\n  )\n}\n\nexport default ThreadHeader\n","import ThreadHeader from \"./ThreadHeader\"\n\nexport default ThreadHeader\n","import React from \"react\"\nimport { Link, withRouter } from \"react-router\"\nimport { Dropdown } from \"../Dropdown\"\n\nconst ThreadPaginator = ({ router, baseUrl, posts, scrollToTop }) => (\n  <div className=\"thread-paginator\">\n    {posts.isLoaded && posts.first ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl}\n        title={pgettext(\"paginator\", \"Go to first page\")}\n        onClick={scrollToTop ? resetScroll : null}\n      >\n        <span className=\"material-icon\">first_page</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"paginator\", \"Go to first page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">first_page</span>\n      </button>\n    )}\n    {posts.isLoaded && posts.previous ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + (posts.previous > 1 ? posts.previous + \"/\" : \"\")}\n        title={pgettext(\"paginator\", \"Go to previous page\")}\n        onClick={scrollToTop ? resetScroll : null}\n      >\n        <span className=\"material-icon\">chevron_left</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"paginator\", \"Go to previous page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">chevron_left</span>\n      </button>\n    )}\n    <Dropdown\n      toggle={({ aria, toggle }) => (\n        <button\n          {...aria}\n          className=\"btn btn-default btn-block btn-outline\"\n          type=\"button\"\n          disabled={!posts.isLoaded}\n          onClick={toggle}\n        >\n          {getLabel(posts.page, posts.pages)}\n        </button>\n      )}\n      onOpen={(dropdown) => {\n        dropdown.querySelector(\"input\").focus()\n      }}\n    >\n      {({ close }) => (\n        <form\n          className=\"thread-paginator-form\"\n          onSubmit={(event) => {\n            if (posts.isLoaded) {\n              const formData = new FormData(event.target)\n              const page = parseInt(formData.get(\"page\"))\n\n              if (\n                page &&\n                page != posts.page &&\n                page >= 1 &&\n                page <= posts.pages\n              ) {\n                const url = page > 1 ? baseUrl + page + \"/\" : baseUrl\n                router.push({ pathname: url })\n              }\n            }\n\n            event.preventDefault()\n            close()\n\n            if (scrollToTop) {\n              resetScroll()\n            }\n          }}\n        >\n          <input\n            className=\"form-control\"\n            name=\"page\"\n            type=\"number\"\n            min={1}\n            max={posts.pages}\n            placeholder={pgettext(\"paginator input\", \"Page\")}\n            disabled={!posts.isLoaded}\n          />\n          <button\n            className=\"btn btn-primary\"\n            type=\"submit\"\n            disabled={!posts.isLoaded}\n          >\n            {pgettext(\"paginator\", \"Go\")}\n          </button>\n        </form>\n      )}\n    </Dropdown>\n    {posts.isLoaded && posts.next ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + posts.next + \"/\"}\n        title={pgettext(\"paginator\", \"Go to next page\")}\n        onClick={scrollToTop ? resetScroll : null}\n      >\n        <span className=\"material-icon\">chevron_right</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"paginator\", \"Go to next page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">chevron_right</span>\n      </button>\n    )}\n    {posts.isLoaded && posts.last ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + posts.last + \"/\"}\n        title={pgettext(\"paginator\", \"Go to last page\")}\n        onClick={scrollToTop ? resetScroll : null}\n      >\n        <span className=\"material-icon\">last_page</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"paginator\", \"Go to last page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">last_page</span>\n      </button>\n    )}\n  </div>\n)\n\nfunction getLabel(page, pages) {\n  return pgettext(\"paginator\", \"Page %(page)s of %(pages)s\")\n    .replace(\"%(page)s\", page)\n    .replace(\"%(pages)s\", pages)\n}\n\nfunction resetScroll() {\n  window.scrollTo(0, 0)\n}\n\nconst ThreadPaginatorConnected = withRouter(ThreadPaginator)\n\nexport default ThreadPaginatorConnected\n","import React from \"react\"\n\nexport default function ({ errors, posts }) {\n  return (\n    <div className=\"modal-dialog\" role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\"thread posts moderation modal title\", \"Moderation\")}\n          </h4>\n        </div>\n        <div className=\"modal-body\">\n          <p className=\"lead\">\n            {pgettext(\n              \"thread posts moderation modal\",\n              \"One or more posts could not be changed:\"\n            )}\n          </p>\n\n          <ul className=\"list-unstyled list-errored-items\">\n            {errors.map((post) => {\n              return (\n                <PostErrors\n                  errors={post.detail}\n                  key={post.id}\n                  post={posts[post.id]}\n                />\n              )\n            })}\n          </ul>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport function PostErrors({ errors, post }) {\n  const heading = interpolate(\n    pgettext(\"thread posts moderation modal\", \"%(username)s on %(posted_on)s\"),\n    {\n      posted_on: post.posted_on.format(\"LL, LT\"),\n      username: post.poster_name,\n    },\n    true\n  )\n\n  return (\n    <li>\n      <h5>{heading}:</h5>\n      {errors.map((error, i) => {\n        return <p key={i}>{error}</p>\n      })}\n    </li>\n  )\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport * as post from \"misago/reducers/post\"\nimport * as posts from \"misago/reducers/posts\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport ErrorsList from \"./errors-list\"\n\nexport function approve(props) {\n  const { selection } = props\n\n  const ops = [{ op: \"replace\", path: \"is-unapproved\", value: false }]\n\n  const newState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_unapproved: false,\n    }\n  })\n\n  const previousState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_unapproved: post.is_unapproved,\n    }\n  })\n\n  patch(props, ops, newState, previousState)\n}\n\nexport function protect(props) {\n  const { selection } = props\n\n  const ops = [{ op: \"replace\", path: \"is-protected\", value: true }]\n\n  const newState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_protected: true,\n    }\n  })\n\n  const previousState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_protected: post.is_protected,\n    }\n  })\n\n  patch(props, ops, newState, previousState)\n}\n\nexport function unprotect(props) {\n  const { selection } = props\n\n  const ops = [{ op: \"replace\", path: \"is-protected\", value: false }]\n\n  const newState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_protected: false,\n    }\n  })\n\n  const previousState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_protected: post.is_protected,\n    }\n  })\n\n  patch(props, ops, newState, previousState)\n}\n\nexport function hide(props) {\n  const { selection } = props\n\n  const ops = [{ op: \"replace\", path: \"is-hidden\", value: true }]\n\n  const newState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_hidden: true,\n      hidden_on: moment(),\n      hidden_by_name: props.user.username,\n      url: Object.assign(post.url, {\n        hidden_by: props.user.url,\n      }),\n    }\n  })\n\n  const previousState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_hidden: post.is_hidden,\n      hidden_on: post.hidden_on,\n      hidden_by_name: post.hidden_by_name,\n      url: post.url,\n    }\n  })\n\n  patch(props, ops, newState, previousState)\n}\n\nexport function unhide(props) {\n  const { selection } = props\n\n  const ops = [{ op: \"replace\", path: \"is-hidden\", value: false }]\n\n  const newState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_hidden: false,\n      hidden_on: moment(),\n      hidden_by_name: props.user.username,\n      url: Object.assign(post.url, {\n        hidden_by: props.user.url,\n      }),\n    }\n  })\n\n  const previousState = selection.map((post) => {\n    return {\n      id: post.id,\n      is_hidden: post.is_hidden,\n      hidden_on: post.hidden_on,\n      hidden_by_name: post.hidden_by_name,\n      url: post.url,\n    }\n  })\n\n  patch(props, ops, newState, previousState)\n}\n\nexport function patch(props, ops, newState, previousState) {\n  const { selection, thread } = props\n\n  // patch selected items\n  newState.forEach((item) => {\n    post.patch(item, item)\n  })\n\n  // deselect all the things\n  store.dispatch(posts.deselectAll())\n\n  // call ajax\n  const data = {\n    ops,\n\n    ids: selection.map((post) => {\n      return post.id\n    }),\n  }\n\n  ajax.patch(thread.api.posts.index, data).then(\n    (data) => {\n      data.forEach((item) => {\n        store.dispatch(post.patch(item, item))\n      })\n    },\n    (rejection) => {\n      if (rejection.status !== 400) {\n        // rollback all\n        previousState.forEach((item) => {\n          store.dispatch(post.patch(item, item))\n        })\n        return snackbar.apiError(rejection)\n      }\n\n      let errors = []\n      let rollback = []\n\n      rejection.forEach((item) => {\n        if (item.detail) {\n          errors.push(item)\n          rollback.push(item.id)\n        } else {\n          store.dispatch(post.patch(item, item))\n        }\n\n        previousState.forEach((item) => {\n          if (rollback.indexOf(item) !== -1) {\n            store.dispatch(post.patch(item, item))\n          }\n        })\n      })\n\n      let posts = {}\n      selection.forEach((item) => {\n        posts[item.id] = item\n      })\n\n      modal.show(<ErrorsList errors={errors} posts={posts} />)\n    }\n  )\n}\n\nexport function merge(props) {\n  let confirmed = window.confirm(\n    pgettext(\n      \"merge posts\",\n      \"Are you sure you want to merge selected posts? This action is not reversible!\"\n    )\n  )\n  if (!confirmed) {\n    return\n  }\n\n  props.selection.slice(1).map((selection) => {\n    store.dispatch(\n      post.patch(selection, {\n        isDeleted: true,\n      })\n    )\n  })\n\n  ajax\n    .post(props.thread.api.posts.merge, {\n      posts: props.selection.map((post) => post.id),\n    })\n    .then(\n      (data) => {\n        store.dispatch(post.patch(data, post.hydrate(data)))\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          snackbar.error(rejection.detail)\n        } else {\n          snackbar.apiError(rejection)\n        }\n\n        props.selection.slice(1).map((selection) => {\n          store.dispatch(\n            post.patch(selection, {\n              isDeleted: false,\n            })\n          )\n        })\n      }\n    )\n\n  store.dispatch(posts.deselectAll())\n}\n\nexport function remove(props) {\n  let confirmed = window.confirm(\n    pgettext(\n      \"delete posts\",\n      \"Are you sure you want to delete selected posts? This action is not reversible!\"\n    )\n  )\n  if (!confirmed) {\n    return\n  }\n\n  props.selection.map((selection) => {\n    store.dispatch(\n      post.patch(selection, {\n        isDeleted: true,\n      })\n    )\n  })\n\n  const ids = props.selection.map((post) => {\n    return post.id\n  })\n\n  ajax.delete(props.thread.api.posts.index, ids).then(\n    () => {\n      return\n    },\n    (rejection) => {\n      if (rejection.status === 400) {\n        snackbar.error(rejection.detail)\n      } else {\n        snackbar.apiError(rejection)\n      }\n\n      props.selection.map((selection) => {\n        store.dispatch(\n          post.patch(selection, {\n            isDeleted: false,\n          })\n        )\n      })\n    }\n  )\n\n  store.dispatch(posts.deselectAll())\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      url: \"\",\n\n      validators: {\n        url: [],\n      },\n      errors: {},\n    }\n  }\n\n  clean() {\n    if (!this.state.url.trim().length) {\n      snackbar.error(\n        pgettext(\n          \"thread posts moderation move\",\n          \"You have to enter link to the other thread.\"\n        )\n      )\n      return false\n    }\n\n    return true\n  }\n\n  send() {\n    return ajax.post(this.props.thread.api.posts.move, {\n      new_thread: this.state.url,\n      posts: this.props.selection.map((post) => post.id),\n    })\n  }\n\n  handleSuccess(success) {\n    this.props.selection.forEach((selection) => {\n      store.dispatch(\n        post.patch(selection, {\n          isDeleted: true,\n        })\n      )\n    })\n\n    modal.hide()\n\n    snackbar.success(\n      pgettext(\n        \"thread posts moderation move\",\n        \"Selected posts were moved to the other thread.\"\n      )\n    )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      snackbar.error(rejection.detail)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onUrlChange = (event) => {\n    this.changeValue(\"url\", event.target.value)\n  }\n\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-content\">\n            <ModalHeader />\n            <div className=\"modal-body\">\n              <FormGroup\n                for=\"id_url\"\n                label={pgettext(\n                  \"thread posts moderation move\",\n                  \"Link to thread you want to move posts to\"\n                )}\n              >\n                <input\n                  className=\"form-control\"\n                  disabled={this.state.isLoading}\n                  id=\"id_url\"\n                  onChange={this.onUrlChange}\n                  value={this.state.url}\n                />\n              </FormGroup>\n            </div>\n            <div className=\"modal-footer\">\n              <button\n                className=\"btn btn-default\"\n                data-dismiss=\"modal\"\n                disabled={this.state.isLoading}\n                type=\"button\"\n              >\n                {pgettext(\"thread posts moderation move btn\", \"Cancel\")}\n              </button>\n              <button\n                className=\"btn btn-primary\"\n                disabled={this.state.isLoading}\n              >\n                {pgettext(\"thread posts moderation move btn\", \"Move posts\")}\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    )\n  }\n}\n\nexport function ModalHeader(props) {\n  return (\n    <div className=\"modal-header\">\n      <button\n        aria-label={pgettext(\"modal\", \"Close\")}\n        className=\"close\"\n        data-dismiss=\"modal\"\n        type=\"button\"\n      >\n        <span aria-hidden=\"true\">&times;</span>\n      </button>\n      <h4 className=\"modal-title\">\n        {pgettext(\"thread posts moderation move title\", \"Move posts\")}\n      </h4>\n    </div>\n  )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport ModalLoader from \"misago/components/modal-loader\"\nimport Select from \"misago/components/select\"\nimport * as post from \"misago/reducers/post\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\nimport ErrorsModal from \"./errors-list\"\n\nexport default function (props) {\n  return <PostingConfig {...props} Form={ModerationForm} />\n}\n\nexport class PostingConfig extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoaded: false,\n      isError: false,\n\n      categories: [],\n    }\n  }\n\n  componentDidMount() {\n    ajax.get(misago.get(\"THREAD_EDITOR_API\")).then(\n      (data) => {\n        // hydrate categories, extract posting options\n        const categories = data.map((item) => {\n          return Object.assign(item, {\n            disabled: item.post === false,\n            label: item.name,\n            value: item.id,\n            post: item.post,\n          })\n        })\n\n        this.setState({\n          isLoaded: true,\n          categories,\n        })\n      },\n      (rejection) => {\n        this.setState({\n          isError: rejection.detail,\n        })\n      }\n    )\n  }\n\n  render() {\n    if (this.state.isError) {\n      return <Error message={this.state.isError} />\n    } else if (this.state.isLoaded) {\n      return (\n        <ModerationForm {...this.props} categories={this.state.categories} />\n      )\n    } else {\n      return <Loader />\n    }\n  }\n}\n\nexport class ModerationForm extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      title: \"\",\n      category: null,\n      categories: props.categories,\n      weight: 0,\n      is_hidden: 0,\n      is_closed: false,\n\n      validators: {\n        title: [validators.required()],\n      },\n\n      errors: {},\n    }\n\n    this.isHiddenChoices = [\n      {\n        value: 0,\n        icon: \"visibility\",\n        label: pgettext(\"thread hidden switch choice\", \"No\"),\n      },\n      {\n        value: 1,\n        icon: \"visibility_off\",\n        label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n      },\n    ]\n\n    this.isClosedChoices = [\n      {\n        value: false,\n        icon: \"lock_outline\",\n        label: pgettext(\"thread closed switch choice\", \"No\"),\n      },\n      {\n        value: true,\n        icon: \"lock\",\n        label: pgettext(\"thread closed switch choice\", \"Yes\"),\n      },\n    ]\n\n    this.acl = {}\n    this.props.categories.forEach((category) => {\n      if (category.post) {\n        if (!this.state.category) {\n          this.state.category = category.id\n        }\n\n        this.acl[category.id] = {\n          can_pin_threads: category.post.pin,\n          can_close_threads: category.post.close,\n          can_hide_threads: category.post.hide,\n        }\n      }\n    })\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(gettext(\"Form contains errors.\"))\n      this.setState({\n        errors: this.validate(),\n      })\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(this.props.thread.api.posts.split, {\n      title: this.state.title,\n      category: this.state.category,\n      weight: this.state.weight,\n      is_hidden: this.state.is_hidden,\n      is_closed: this.state.is_closed,\n      posts: this.props.selection.map((post) => post.id),\n    })\n  }\n\n  handleSuccess(apiResponse) {\n    this.props.selection.forEach((selection) => {\n      store.dispatch(\n        post.patch(selection, {\n          isDeleted: true,\n        })\n      )\n    })\n\n    modal.hide()\n\n    snackbar.success(\n      pgettext(\n        \"posts moderation split\",\n        \"Selected posts were split into new thread.\"\n      )\n    )\n  }\n\n  handleError(rejection) {\n    if (rejection.status === 400) {\n      this.setState({\n        errors: Object.assign({}, this.state.errors, rejection),\n      })\n      snackbar.error(gettext(\"Form contains errors.\"))\n    } else if (rejection.status === 403 && Array.isArray(rejection)) {\n      modal.show(<ErrorsModal errors={rejection} />)\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onCategoryChange = (ev) => {\n    const categoryId = ev.target.value\n    const newState = {\n      category: categoryId,\n    }\n\n    if (this.acl[categoryId].can_pin_threads < newState.weight) {\n      newState.weight = 0\n    }\n\n    if (!this.acl[categoryId].can_hide_threads) {\n      newState.is_hidden = 0\n    }\n\n    if (!this.acl[categoryId].can_close_threads) {\n      newState.is_closed = false\n    }\n\n    this.setState(newState)\n  }\n\n  getWeightChoices() {\n    const choices = [\n      {\n        value: 0,\n        icon: \"remove\",\n        label: pgettext(\"thread weight choice\", \"Not pinned\"),\n      },\n      {\n        value: 1,\n        icon: \"bookmark_border\",\n        label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n      },\n    ]\n\n    if (this.acl[this.state.category].can_pin_threads == 2) {\n      choices.push({\n        value: 2,\n        icon: \"bookmark\",\n        label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n      })\n    }\n\n    return choices\n  }\n\n  renderWeightField() {\n    if (this.acl[this.state.category].can_pin_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts moderation split field\", \"Thread weight\")}\n          for=\"id_weight\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_weight\"\n            onChange={this.bindInput(\"weight\")}\n            value={this.state.weight}\n            choices={this.getWeightChoices()}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderHiddenField() {\n    if (this.acl[this.state.category].can_hide_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts moderation split field\", \"Hide thread\")}\n          for=\"id_is_hidden\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_hidden\")}\n            value={this.state.is_hidden}\n            choices={this.isHiddenChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderClosedField() {\n    if (this.acl[this.state.category].can_close_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"posts moderation split field\", \"Close thread\")}\n          for=\"id_is_closed\"\n          labelClass=\"col-sm-4\"\n          controlClass=\"col-sm-8\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_closed\")}\n            value={this.state.is_closed}\n            choices={this.isClosedChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  render() {\n    return (\n      <Modal className=\"modal-dialog\">\n        <form onSubmit={this.handleSubmit}>\n          <div className=\"modal-body\">\n            <FormGroup\n              label={pgettext(\"posts moderation split field\", \"Thread title\")}\n              for=\"id_title\"\n              labelClass=\"col-sm-4\"\n              controlClass=\"col-sm-8\"\n              validation={this.state.errors.title}\n            >\n              <input\n                id=\"id_title\"\n                className=\"form-control\"\n                type=\"text\"\n                onChange={this.bindInput(\"title\")}\n                value={this.state.title}\n              />\n            </FormGroup>\n            <div className=\"clearfix\" />\n\n            <FormGroup\n              label={pgettext(\"posts moderation split field\", \"Category\")}\n              for=\"id_category\"\n              labelClass=\"col-sm-4\"\n              controlClass=\"col-sm-8\"\n              validation={this.state.errors.category}\n            >\n              <CategorySelect\n                id=\"id_category\"\n                onChange={this.onCategoryChange}\n                value={this.state.category}\n                choices={this.state.categories}\n              />\n            </FormGroup>\n            <div className=\"clearfix\" />\n\n            {this.renderWeightField()}\n            {this.renderHiddenField()}\n            {this.renderClosedField()}\n          </div>\n          <div className=\"modal-footer\">\n            <button\n              className=\"btn btn-default\"\n              data-dismiss=\"modal\"\n              disabled={this.state.isLoading}\n              type=\"button\"\n            >\n              {pgettext(\"posts moderation split btn\", \"Cancel\")}\n            </button>\n            <Button className=\"btn-primary\" loading={this.state.isLoading}>\n              {pgettext(\"posts moderation split btn\", \"Split posts\")}\n            </Button>\n          </div>\n        </form>\n      </Modal>\n    )\n  }\n}\n\nexport function Loader() {\n  return (\n    <Modal className=\"modal-dialog\">\n      <ModalLoader />\n    </Modal>\n  )\n}\n\nexport function Error(props) {\n  return (\n    <Modal className=\"modal-dialog modal-message\">\n      <div className=\"message-icon\">\n        <span className=\"material-icon\">info_outline</span>\n      </div>\n      <div className=\"message-body\">\n        <p className=\"lead\">\n          {pgettext(\n            \"posts moderation split\",\n            \"You can't move selected posts at the moment.\"\n          )}\n        </p>\n        <p>{props.message}</p>\n        <button className=\"btn btn-default\" data-dismiss=\"modal\" type=\"button\">\n          {pgettext(\"posts moderation split dismiss btn\", \"Ok\")}\n        </button>\n      </div>\n    </Modal>\n  )\n}\n\nexport function Modal(props) {\n  return (\n    <div className={props.className} role=\"document\">\n      <div className=\"modal-content\">\n        <div className=\"modal-header\">\n          <button\n            aria-label={pgettext(\"modal\", \"Close\")}\n            className=\"close\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">&times;</span>\n          </button>\n          <h4 className=\"modal-title\">\n            {pgettext(\n              \"posts moderation split title\",\n              \"Split posts into new thread\"\n            )}\n          </h4>\n        </div>\n        {props.children}\n      </div>\n    </div>\n  )\n}\n","import React from \"react\"\nimport modal from \"misago/services/modal\"\nimport * as moderation from \"./actions\"\nimport MoveModal from \"./move\"\nimport SplitModal from \"./split\"\n\nexport default function (props) {\n  return (\n    <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n      <Approve {...props} />\n      <Merge {...props} />\n      <Move {...props} />\n      <Split {...props} />\n      <Protect {...props} />\n      <Unprotect {...props} />\n      <Unhide {...props} />\n      <Hide {...props} />\n      <Delete {...props} />\n    </ul>\n  )\n}\n\nexport class Approve extends React.Component {\n  onClick = () => {\n    moderation.approve(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_approve && post.is_unapproved\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">done</span>\n          {pgettext(\"thread posts moderation\", \"Approve\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Merge extends React.Component {\n  onClick = () => {\n    moderation.merge(this.props)\n  }\n\n  render() {\n    const isVisible =\n      this.props.selection.length > 1 &&\n      this.props.selection.find((post) => {\n        return post.acl.can_merge\n      })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">call_merge</span>\n          {pgettext(\"thread posts moderation\", \"Merge\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Move extends React.Component {\n  onClick = () => {\n    modal.show(<MoveModal {...this.props} />)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_move\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">arrow_forward</span>\n          {pgettext(\"thread posts moderation\", \"Move\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Split extends React.Component {\n  onClick = () => {\n    modal.show(<SplitModal {...this.props} />)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_move\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">call_split</span>\n          {pgettext(\"thread posts moderation\", \"Split\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Protect extends React.Component {\n  onClick = () => {\n    moderation.protect(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return !post.is_protected && post.acl.can_protect\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">lock_outline</span>\n          {pgettext(\"thread posts moderation\", \"Protect\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Unprotect extends React.Component {\n  onClick = () => {\n    moderation.unprotect(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.is_protected && post.acl.can_protect\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">lock_open</span>\n          {pgettext(\"thread posts moderation\", \"Unprotect\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Hide extends React.Component {\n  onClick = () => {\n    moderation.hide(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_hide && !post.is_hidden\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">visibility_off</span>\n          {pgettext(\"thread posts moderation\", \"Hide\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Unhide extends React.Component {\n  onClick = () => {\n    moderation.unhide(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_unhide && post.is_hidden\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">visibility</span>\n          {pgettext(\"thread posts moderation\", \"Unhide\")}\n        </button>\n      </li>\n    )\n  }\n}\n\nexport class Delete extends React.Component {\n  onClick = () => {\n    moderation.remove(this.props)\n  }\n\n  render() {\n    const isVisible = this.props.selection.find((post) => {\n      return post.acl.can_delete\n    })\n\n    if (!isVisible) return null\n\n    return (\n      <li>\n        <button type=\"button\" className=\"btn btn-link\" onClick={this.onClick}>\n          <span className=\"material-icon\">clear</span>\n          {pgettext(\"thread posts moderation\", \"Delete\")}\n        </button>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport { ThreadPostsModerationOptions } from \"./moderation/posts\"\n\nconst ThreadPostsModeration = ({ thread, user, selection, dropup }) => (\n  <div className={dropup ? \"dropup\" : \"dropdown\"}>\n    <button\n      type=\"button\"\n      className=\"btn btn-default btn-outline btn-icon dropdown-toggle\"\n      title={pgettext(\"post options btn\", \"Posts options\")}\n      data-toggle=\"dropdown\"\n      aria-haspopup=\"true\"\n      aria-expanded=\"false\"\n      disabled={selection.length === 0}\n    >\n      <span className=\"material-icon\">settings</span>\n    </button>\n    <ThreadPostsModerationOptions\n      thread={thread}\n      user={user}\n      selection={selection}\n    />\n  </div>\n)\n\nexport default ThreadPostsModeration\n","import React from \"react\"\n\nconst ThreadReplyButton = ({ onClick }) => (\n  <button\n    className=\"btn btn-primary btn-outline btn-block\"\n    type=\"button\"\n    onClick={onClick}\n  >\n    <span className=\"material-icon\">chat</span>\n    {pgettext(\"thread reply btn\", \"Reply\")}\n  </button>\n)\n\nexport default ThreadReplyButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadWatchButton from \"./ThreadWatchButton\"\n\nconst ThreadToolbarBottom = ({\n  thread,\n  posts,\n  user,\n  selection,\n  moderation,\n  onReply,\n}) => (\n  <Toolbar>\n    {posts.pages > 1 && (\n      <ToolbarSection>\n        <ToolbarItem>\n          <ThreadPaginator\n            baseUrl={thread.url.index}\n            posts={posts}\n            scrollToTop\n          />\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n    <ToolbarSpacer />\n    {user.is_authenticated && (\n      <ToolbarSection>\n        <ToolbarItem className=\"hidden-xs\">\n          <ThreadWatchButton thread={thread} dropup />\n        </ToolbarItem>\n        {thread.acl.can_reply && (\n          <ToolbarItem>\n            <ThreadReplyButton onClick={onReply} />\n          </ToolbarItem>\n        )}\n        {moderation.enabled && (\n          <ToolbarItem shrink>\n            <ThreadPostsModeration\n              thread={thread}\n              user={user}\n              selection={selection}\n              dropup\n            />\n          </ToolbarItem>\n        )}\n      </ToolbarSection>\n    )}\n    {user.is_authenticated && (\n      <ToolbarSection className=\"hidden-sm hidden-md hidden-lg\">\n        <ToolbarItem>\n          <ThreadWatchButton thread={thread} dropup />\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n  </Toolbar>\n)\n\nexport default ThreadToolbarBottom\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\n\nconst ThreadToolbarThird = () => (\n  <Toolbar className=\"thread-toolbar-third\">\n    <ToolbarSpacer />\n    <ToolbarSection>\n      <ToolbarItem>\n        <button\n          className=\"btn btn-muted btn-block\"\n          type=\"button\"\n          onClick={() => window.scrollTo(0, 0)}\n        >\n          <span className=\"material-icon\">arrow_upward</span>\n          {pgettext(\"go up\", \"Go to top\")}\n        </button>\n      </ToolbarItem>\n    </ToolbarSection>\n  </Toolbar>\n)\n\nexport default ThreadToolbarThird\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadPollButton = ({ compact, disabled, onClick }) => (\n  <button\n    className={classnames(\"btn btn-default btn-outline\", {\n      \"btn-block\": !compact,\n      \"btn-icon\": compact,\n    })}\n    type=\"button\"\n    title={compact ? pgettext(\"thread poll btn\", \"Add poll\") : null}\n    disabled={disabled}\n    onClick={onClick}\n  >\n    <span className=\"material-icon\">poll</span>\n    {!compact && pgettext(\"thread poll btn\", \"Add poll\")}\n  </button>\n)\n\nexport default ThreadPollButton\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadShortcutsButton = ({ user, thread, posts }) => (\n  <div className=\"dropdown\">\n    <button\n      className=\"btn btn-default btn-outline btn-icon\"\n      title={pgettext(\"thread shortcuts btn\", \"Shortcuts\")}\n      aria-expanded=\"true\"\n      aria-haspopup=\"true\"\n      data-toggle=\"dropdown\"\n      type=\"button\"\n    >\n      <span className=\"material-icon\">bookmark</span>\n    </button>\n    <ul className=\"dropdown-menu\">\n      {!!posts.first && (\n        <li>\n          <Link className=\"btn btn-link\" href={thread.url.index}>\n            <span className=\"material-icon\">place</span>\n            {pgettext(\"thread shortcut btn\", \"Go to first post\")}\n          </Link>\n        </li>\n      )}\n      {user.is_authenticated && thread.is_new && (\n        <li>\n          <a className=\"btn btn-link\" href={thread.url.new_post}>\n            <span className=\"material-icon\">comment</span>\n            {pgettext(\"thread shortcut btn\", \"Go to new post\")}\n          </a>\n        </li>\n      )}\n      {thread.best_answer && (\n        <li>\n          <a className=\"btn btn-link\" href={thread.url.best_answer}>\n            <span className=\"material-icon\">check_circle</span>\n            {pgettext(\"thread shortcut btn\", \"Go to best answer\")}\n          </a>\n        </li>\n      )}\n      {thread.has_unapproved_posts && thread.acl.can_approve && (\n        <li>\n          <a className=\"btn btn-link\" href={thread.url.unapproved_post}>\n            <span className=\"material-icon\">visibility</span>\n            {pgettext(\"thread shortcut btn\", \"Go to unapproved post\")}\n          </a>\n        </li>\n      )}\n      <li>\n        <a className=\"btn btn-link\" href={thread.url.last_post}>\n          <span className=\"material-icon\">reply</span>\n          {pgettext(\"thread shortcut btn\", \"Go to last post\")}\n        </a>\n      </li>\n    </ul>\n  </div>\n)\n\nexport default ThreadShortcutsButton\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadPaginator from \"./ThreadPaginator\"\nimport ThreadPollButton from \"./ThreadPollButton\"\nimport ThreadPostsModeration from \"./ThreadPostsModeration\"\nimport ThreadReplyButton from \"./ThreadReplyButton\"\nimport ThreadShortcutsButton from \"./ThreadShortcutsButton\"\n\nconst ThreadToolbarTop = ({\n  thread,\n  posts,\n  user,\n  pollDisabled,\n  selection,\n  moderation,\n  onPoll,\n  onReply,\n}) => (\n  <Toolbar>\n    <ToolbarSection className=\"hidden-xs\">\n      <ToolbarItem>\n        <ThreadShortcutsButton posts={posts} thread={thread} user={user} />\n      </ToolbarItem>\n      {posts.pages > 1 && (\n        <ToolbarItem>\n          <ThreadPaginator baseUrl={thread.url.index} posts={posts} />\n        </ToolbarItem>\n      )}\n    </ToolbarSection>\n    <ToolbarSpacer />\n    {thread.acl.can_start_poll && !thread.poll && (\n      <ToolbarSection className=\"hidden-xs\">\n        <ToolbarItem>\n          <ThreadPollButton disabled={pollDisabled} onClick={onPoll} />\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n    {thread.acl.can_reply ? (\n      <ToolbarSection>\n        <ToolbarItem className=\"hidden-sm hidden-md hidden-lg\" shrink>\n          <ThreadShortcutsButton posts={posts} thread={thread} user={user} />\n        </ToolbarItem>\n        <ToolbarItem>\n          <ThreadReplyButton onClick={onReply} />\n        </ToolbarItem>\n        {thread.acl.can_start_poll && !thread.poll && (\n          <ToolbarItem className=\"hidden-sm hidden-md hidden-lg\" shrink>\n            <ThreadPollButton\n              disabled={pollDisabled}\n              onClick={onPoll}\n              compact\n            />\n          </ToolbarItem>\n        )}\n        {moderation.enabled && (\n          <ToolbarItem className=\"hidden-xs\" shrink>\n            <ThreadPostsModeration\n              thread={thread}\n              user={user}\n              selection={selection}\n            />\n          </ToolbarItem>\n        )}\n      </ToolbarSection>\n    ) : (\n      <ToolbarSection>\n        <ToolbarItem className=\"hidden-sm hidden-md hidden-lg\" shrink>\n          <ThreadShortcutsButton posts={posts} thread={thread} user={user} />\n        </ToolbarItem>\n        {thread.acl.can_start_poll && !thread.poll && (\n          <ToolbarItem>\n            <ThreadPollButton disabled={pollDisabled} onClick={onPoll} />\n          </ToolbarItem>\n        )}\n        {moderation.enabled && (\n          <ToolbarItem shrink>\n            <ThreadPostsModeration\n              thread={thread}\n              user={user}\n              selection={selection}\n            />\n          </ToolbarItem>\n        )}\n      </ToolbarSection>\n    )}\n    {posts.pages > 1 && (\n      <ToolbarSection className=\"hidden-sm hidden-md hidden-lg\">\n        <ToolbarItem>\n          <ThreadPaginator baseUrl={thread.url.index} posts={posts} />\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n  </Toolbar>\n)\n\nexport default ThreadToolbarTop\n","import React from \"react\"\nimport Participants from \"misago/components/participants\"\nimport { Poll, PollForm } from \"misago/components/poll\"\nimport PostsList from \"misago/components/posts-list\"\nimport * as participants from \"misago/reducers/participants\"\nimport * as poll from \"misago/reducers/poll\"\nimport * as posts from \"misago/reducers/posts\"\nimport * as thread from \"misago/reducers/thread\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport posting from \"misago/services/posting\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport { PostingQuoteSelection } from \"../posting\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadHeader from \"./ThreadHeader\"\nimport ThreadToolbarBottom from \"./ThreadToolbarBottom\"\nimport ThreadToolbarThird from \"./ThreadToolbarThird\"\nimport ThreadToolbarTop from \"./ThreadToolbarTop\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      editPoll: false,\n    }\n  }\n\n  componentDidMount() {\n    if (this.shouldFetchData()) {\n      this.fetchData()\n      this.setPageTitle()\n    }\n\n    this.startPollingApi()\n  }\n\n  componentDidUpdate() {\n    if (this.shouldFetchData()) {\n      this.fetchData()\n      this.startPollingApi()\n      this.setPageTitle()\n    }\n  }\n\n  componentWillUnmount() {\n    this.stopPollingApi()\n  }\n\n  shouldFetchData() {\n    if (this.props.posts.isLoaded) {\n      const page = (this.props.params.page || 1) * 1\n      return page != this.props.posts.page\n    } else {\n      return false\n    }\n  }\n\n  fetchData() {\n    store.dispatch(posts.unload())\n\n    ajax\n      .get(\n        this.props.thread.api.posts.index,\n        {\n          page: this.props.params.page || 1,\n        },\n        \"posts\"\n      )\n      .then(\n        (data) => {\n          this.update(data)\n        },\n        (rejection) => {\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  startPollingApi() {\n    polls.start({\n      poll: \"thread-posts\",\n\n      url: this.props.thread.api.posts.index,\n      data: {\n        page: this.props.params.page || 1,\n      },\n      update: this.update,\n\n      frequency: 120 * 1000,\n      delayed: true,\n    })\n  }\n\n  stopPollingApi() {\n    polls.stop(\"thread-posts\")\n  }\n\n  setPageTitle() {\n    title.set({\n      title: this.props.thread.title,\n      parent: this.props.thread.category.name,\n      page: (this.props.params.page || 1) * 1,\n    })\n  }\n\n  update = (data) => {\n    store.dispatch(thread.replace(data))\n    store.dispatch(posts.load(data.post_set))\n\n    if (data.participants) {\n      store.dispatch(participants.replace(data.participants))\n    }\n\n    if (data.poll) {\n      store.dispatch(poll.replace(data.poll))\n    }\n\n    this.setPageTitle()\n  }\n\n  openPollForm = () => {\n    this.setState({ editPoll: true })\n  }\n\n  closePollForm = () => {\n    this.setState({ editPoll: false })\n  }\n\n  openReplyForm = () => {\n    posting.open({\n      mode: \"REPLY\",\n\n      thread: this.props.thread,\n      config: this.props.thread.api.editor,\n      submit: this.props.thread.api.posts.index,\n    })\n  }\n\n  render() {\n    const category = this.props.thread.category\n\n    let className = \"page page-thread\"\n    if (category.css_class) {\n      className += \" page-thread-\" + category.css_class\n    }\n\n    const styleName =\n      category.special_role === \"private_threads\"\n        ? \"private-threads\"\n        : category.css_class || \"category-threads\"\n\n    const threadModeration = getThreadModeration(\n      this.props.thread,\n      this.props.user\n    )\n\n    const postsModeration = getPostsModeration(\n      this.props.posts.results,\n      this.props.user\n    )\n    const selection = this.props.posts.results.filter((post) => post.isSelected)\n\n    return (\n      <div className={className}>\n        <ThreadHeader\n          styleName={styleName}\n          thread={this.props.thread}\n          posts={this.props.posts}\n          user={this.props.user}\n          moderation={threadModeration}\n        />\n        <PageContainer>\n          <Participants\n            participants={this.props.participants}\n            thread={this.props.thread}\n            user={this.props.user}\n          />\n          <ThreadToolbarTop\n            thread={this.props.thread}\n            posts={this.props.posts}\n            user={this.props.user}\n            selection={selection}\n            moderation={postsModeration}\n            pollDisabled={this.state.editPoll}\n            onPoll={this.openPollForm}\n            onReply={this.openReplyForm}\n          />\n          {this.state.editPoll ? (\n            <PollForm\n              poll={this.props.poll}\n              thread={this.props.thread}\n              close={this.closePollForm}\n            />\n          ) : (\n            <Poll\n              poll={this.props.poll}\n              thread={this.props.thread}\n              user={this.props.user}\n              edit={this.openPollForm}\n            />\n          )}\n          {this.props.thread.acl.can_reply ? (\n            <PostingQuoteSelection\n              posting={{\n                mode: \"REPLY\",\n\n                thread: this.props.thread,\n                config: this.props.thread.api.editor,\n                submit: this.props.thread.api.posts.index,\n              }}\n            >\n              <PostsList {...this.props} />\n            </PostingQuoteSelection>\n          ) : (\n            <PostsList {...this.props} />\n          )}\n          <ThreadToolbarBottom\n            thread={this.props.thread}\n            posts={this.props.posts}\n            user={this.props.user}\n            selection={selection}\n            moderation={postsModeration}\n            onReply={this.openReplyForm}\n          />\n          <ThreadToolbarThird />\n        </PageContainer>\n      </div>\n    )\n  }\n}\n\nconst getThreadModeration = (thread, user) => {\n  const moderation = {\n    enabled: false,\n    edit: false,\n    approve: false,\n    close: false,\n    open: false,\n    hide: false,\n    unhide: false,\n    move: false,\n    merge: false,\n    pinGlobally: false,\n    pinLocally: false,\n    unpin: false,\n    delete: false,\n  }\n\n  if (!user.is_authenticated) return moderation\n\n  moderation.edit = thread.acl.can_edit\n  moderation.approve = thread.acl.can_approve && thread.is_unapproved\n  moderation.close = thread.acl.can_close && !thread.is_closed\n  moderation.open = thread.acl.can_close && thread.is_closed\n  moderation.hide = thread.acl.can_hide && !thread.is_hidden\n  moderation.unhide = thread.acl.can_unhide && thread.is_hidden\n  moderation.move = thread.acl.can_move\n  moderation.merge = thread.acl.can_merge\n  moderation.pinGlobally = thread.acl.can_pin_globally && thread.weight < 2\n  moderation.pinLocally = thread.acl.can_pin && thread.weight !== 1\n  moderation.unpin =\n    (thread.acl.can_pin && thread.weight === 1) ||\n    (thread.acl.can_pin_globally && thread.weight === 2)\n  moderation.delete = thread.acl.can_delete\n\n  moderation.enabled =\n    moderation.edit ||\n    moderation.approve ||\n    moderation.close ||\n    moderation.open ||\n    moderation.hide ||\n    moderation.unhide ||\n    moderation.move ||\n    moderation.merge ||\n    moderation.pinGlobally ||\n    moderation.pinLocally ||\n    moderation.unpin ||\n    moderation.delete\n\n  return moderation\n}\n\nconst getPostsModeration = (posts, user) => {\n  const moderation = {\n    enabled: false,\n    approve: false,\n    move: false,\n    merge: false,\n    protect: false,\n    hide: false,\n    delete: false,\n  }\n\n  if (!user.is_authenticated) return moderation\n\n  posts.forEach((post) => {\n    if (!post.is_event) {\n      if (post.acl.can_approve && post.is_unapproved) {\n        moderation.approve = true\n      }\n      if (post.acl.can_move) moderation.move = true\n      if (post.acl.can_merge) moderation.merge = true\n      if (post.acl.can_protect || post.acl.can_unprotect) {\n        moderation.protect = true\n      }\n      if (post.acl.can_hide || post.acl.can_unhide) {\n        moderation.hide = true\n      }\n      if (post.acl.can_delete) moderation.delete = true\n\n      if (\n        moderation.approve ||\n        moderation.move ||\n        moderation.merge ||\n        moderation.protect ||\n        moderation.hide ||\n        moderation.delete\n      ) {\n        moderation.enabled = true\n      }\n    }\n  })\n\n  return moderation\n}\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/thread/route\"\nimport misago from \"misago/index\"\n\nexport function select(store) {\n  return {\n    participants: store.participants,\n    poll: store.poll,\n    posts: store.posts,\n    thread: store.thread,\n    tick: store.tick.tick,\n    user: store.auth.user,\n  }\n}\n\nexport function paths() {\n  const thread = misago.get(\"THREAD\")\n  const basePath = thread.url.index.replace(\n    thread.slug + \"-\" + thread.pk,\n    \":slug\"\n  )\n  return [\n    {\n      path: basePath,\n      component: connect(select)(Route),\n    },\n    {\n      path: basePath + \":page/\",\n      component: connect(select)(Route),\n    },\n  ]\n}\n","import { paths } from \"misago/components/thread/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n  if (context.has(\"THREAD\") && context.has(\"POSTS\")) {\n    mount({\n      paths: paths(),\n    })\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:thread\",\n  initializer: initializer,\n  after: \"store\",\n})\n","export function compareLastPostAge(a, b) {\n  if (a.last_post > b.last_post) {\n    return -1\n  } else if (a.last_post < b.last_post) {\n    return 1\n  } else {\n    return 0\n  }\n}\n\nexport function compareGlobalWeight(a, b) {\n  if (a.weight === 2 && a.weight > b.weight) {\n    return -1\n  } else if (b.weight === 2 && a.weight < b.weight) {\n    return 1\n  } else {\n    return compareLastPostAge(a, b)\n  }\n}\n\nexport function compareWeight(a, b) {\n  if (a.weight > b.weight) {\n    return -1\n  } else if (a.weight < b.weight) {\n    return 1\n  } else {\n    return compareLastPostAge(a, b)\n  }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadsCategoryPicker = ({\n  allItems,\n  parentUrl,\n  category,\n  categories,\n  list,\n}) => (\n  <div className=\"dropdown threads-category-picker\">\n    <button\n      type=\"button\"\n      className=\"btn btn-default btn-outline dropdown-toggle btn-block text-ellipsis\"\n      data-toggle=\"dropdown\"\n      aria-haspopup=\"true\"\n      aria-expanded=\"false\"\n    >\n      {category && (\n        <span\n          className=\"material-icon\"\n          style={{ color: category.color || \"inherit\" }}\n        >\n          label\n        </span>\n      )}\n      {category && category.short_name && (\n        <span className={category.short_name && \"hidden-md hidden-lg\"}>\n          {category.short_name}\n        </span>\n      )}\n      {category ? (\n        <span className={category.short_name && \"hidden-xs hidden-sm\"}>\n          {category.name}\n        </span>\n      ) : (\n        allItems\n      )}\n    </button>\n    <ul className=\"dropdown-menu\">\n      <li>\n        <Link to={parentUrl + list.path}>{allItems}</Link>\n      </li>\n      <li role=\"separator\" className=\"divider\" />\n      {categories.map((choice) => (\n        <li key={choice.id}>\n          <Link to={choice.url.index + list.path}>\n            <span\n              className=\"material-icon\"\n              style={{ color: choice.color || \"inherit\" }}\n            >\n              label\n            </span>\n            {choice.name}\n          </Link>\n        </li>\n      ))}\n    </ul>\n  </div>\n)\n\nexport default ThreadsCategoryPicker\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst ThreadsListPicker = ({ baseUrl, list, lists }) => (\n  <div className=\"dropdown threads-list-picker\">\n    <button\n      type=\"button\"\n      className=\"btn btn-default btn-outline dropdown-toggle btn-block\"\n      data-toggle=\"dropdown\"\n      aria-haspopup=\"true\"\n      aria-expanded=\"false\"\n    >\n      {list.longName}\n    </button>\n    <ul className=\"dropdown-menu stick-to-bottom\">\n      {lists.map((choice) => (\n        <li key={choice.type}>\n          <Link to={baseUrl + choice.path}>{choice.longName}</Link>\n        </li>\n      ))}\n    </ul>\n  </div>\n)\n\nexport default ThreadsListPicker\n","import React from \"react\"\n\nexport default class extends React.Component {\n  render() {\n    return (\n      <div className=\"modal-dialog\" role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              aria-label={pgettext(\"modal\", \"Close\")}\n              className=\"close\"\n              data-dismiss=\"modal\"\n              type=\"button\"\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"threads moderation title\", \"Threads moderation\")}\n            </h4>\n          </div>\n          <div className=\"modal-body\">\n            <p className=\"lead\">\n              {pgettext(\n                \"threads moderation\",\n                \"One or more threads could not be deleted:\"\n              )}\n            </p>\n\n            <ul className=\"list-unstyled list-errored-items\">\n              {this.props.errors.map((item) => {\n                return (\n                  <ThreadErrors\n                    errors={item.errors}\n                    key={item.thread.id}\n                    thread={item.thread}\n                  />\n                )\n              })}\n            </ul>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n\nexport function ThreadErrors({ errors, thread }) {\n  return (\n    <li>\n      <h5>{thread.title}</h5>\n      {errors.map((message, i) => {\n        return <p>{message}</p>\n      })}\n    </li>\n  )\n}\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport Select from \"misago/components/select\"\nimport misago from \"misago/index\"\nimport { filterThreads } from \"misago/reducers/threads\"\nimport * as select from \"misago/reducers/selection\"\nimport ErrorsModal from \"misago/components/threads/moderation/errors-list\"\nimport MergeConflict from \"misago/components/merge-conflict\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport * as validators from \"misago/utils/validators\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isLoading: false,\n\n      title: \"\",\n      category: null,\n      weight: 0,\n      is_hidden: 0,\n      is_closed: false,\n\n      validators: {\n        title: [validators.required()],\n      },\n\n      errors: {},\n    }\n\n    this.acl = {}\n    for (const i in props.user.acl.categories) {\n      if (!props.user.acl.categories.hasOwnProperty(i)) {\n        continue\n      }\n\n      const acl = props.user.acl.categories[i]\n      this.acl[acl.id] = acl\n    }\n\n    this.categoryChoices = []\n    props.categories.forEach((category) => {\n      if (category.level > 0) {\n        const acl = this.acl[category.id]\n        const disabled =\n          !acl.can_start_threads ||\n          (category.is_closed && !acl.can_close_threads)\n\n        this.categoryChoices.push({\n          value: category.id,\n          disabled: disabled,\n          level: category.level - 1,\n          label: category.name,\n        })\n\n        if (!disabled && !this.state.category) {\n          this.state.category = category.id\n        }\n      }\n    })\n\n    this.isHiddenChoices = [\n      {\n        value: 0,\n        icon: \"visibility\",\n        label: pgettext(\"thread hidden switch choice\", \"No\"),\n      },\n      {\n        value: 1,\n        icon: \"visibility_off\",\n        label: pgettext(\"thread hidden switch choice\", \"Yes\"),\n      },\n    ]\n\n    this.isClosedChoices = [\n      {\n        value: false,\n        icon: \"lock_outline\",\n        label: pgettext(\"thread closed switch choice\", \"No\"),\n      },\n      {\n        value: true,\n        icon: \"lock\",\n        label: pgettext(\"thread closed switch choice\", \"Yes\"),\n      },\n    ]\n  }\n\n  clean() {\n    if (this.isValid()) {\n      return true\n    } else {\n      snackbar.error(gettext(\"Form contains errors.\"))\n      this.setState({\n        errors: this.validate(),\n      })\n      return false\n    }\n  }\n\n  send() {\n    return ajax.post(misago.get(\"MERGE_THREADS_API\"), this.getFormdata())\n  }\n\n  getFormdata = () => {\n    return {\n      threads: this.props.threads.map((thread) => thread.id),\n      title: this.state.title,\n      category: this.state.category,\n      weight: this.state.weight,\n      is_hidden: this.state.is_hidden,\n      is_closed: this.state.is_closed,\n    }\n  }\n\n  handleSuccess = (apiResponse) => {\n    // unfreeze and remove merged threads\n    this.props.threads.forEach((thread) => {\n      this.props.freezeThread(thread.id)\n      this.props.deleteThread(thread)\n    })\n\n    // deselect all threads\n    store.dispatch(select.none())\n\n    // append merged thread, filter threads\n    this.props.addThreads([apiResponse])\n    store.dispatch(\n      filterThreads(this.props.route.category, this.props.categoriesMap)\n    )\n\n    // hide modal\n    modal.hide()\n  }\n\n  handleError = (rejection) => {\n    if (rejection.status === 400) {\n      if (rejection.best_answers || rejection.polls) {\n        modal.show(\n          <MergeConflict\n            api={misago.get(\"MERGE_THREADS_API\")}\n            bestAnswers={rejection.best_answers}\n            data={this.getFormdata()}\n            polls={rejection.polls}\n            onError={this.handleError}\n            onSuccess={this.handleSuccess}\n          />\n        )\n      } else {\n        this.setState({\n          errors: Object.assign({}, this.state.errors, rejection),\n        })\n        snackbar.error(gettext(\"Form contains errors.\"))\n      }\n    } else if (rejection.status === 403 && Array.isArray(rejection)) {\n      modal.show(<ErrorsModal errors={rejection} />)\n    } else if (rejection.best_answer) {\n      snackbar.error(rejection.best_answer[0])\n    } else if (rejection.poll) {\n      snackbar.error(rejection.poll[0])\n    } else {\n      snackbar.apiError(rejection)\n    }\n  }\n\n  onCategoryChange = (ev) => {\n    const categoryId = ev.target.value\n    const newState = {\n      category: categoryId,\n    }\n\n    if (this.acl[categoryId].can_pin_threads < newState.weight) {\n      newState.weight = 0\n    }\n\n    if (!this.acl[categoryId].can_hide_threads) {\n      newState.is_hidden = 0\n    }\n\n    if (!this.acl[categoryId].can_close_threads) {\n      newState.is_closed = false\n    }\n\n    this.setState(newState)\n  }\n\n  getWeightChoices() {\n    const choices = [\n      {\n        value: 0,\n        icon: \"remove\",\n        label: pgettext(\"thread weight choice\", \"Not pinned\"),\n      },\n      {\n        value: 1,\n        icon: \"bookmark_border\",\n        label: pgettext(\"thread weight choice\", \"Pinned in category\"),\n      },\n    ]\n\n    if (this.acl[this.state.category].can_pin_threads == 2) {\n      choices.push({\n        value: 2,\n        icon: \"bookmark\",\n        label: pgettext(\"thread weight choice\", \"Pinned globally\"),\n      })\n    }\n\n    return choices\n  }\n\n  renderWeightField() {\n    if (this.acl[this.state.category].can_pin_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"threads moderation merge field\", \"Thread weight\")}\n          for=\"id_weight\"\n        >\n          <Select\n            id=\"id_weight\"\n            onChange={this.bindInput(\"weight\")}\n            value={this.state.weight}\n            choices={this.getWeightChoices()}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderHiddenField() {\n    if (this.acl[this.state.category].can_hide_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"threads moderation merge field\", \"Hide thread\")}\n          for=\"id_is_hidden\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_hidden\")}\n            value={this.state.is_hidden}\n            choices={this.isHiddenChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderClosedField() {\n    if (this.acl[this.state.category].can_close_threads) {\n      return (\n        <FormGroup\n          label={pgettext(\"threads moderation merge field\", \"Close thread\")}\n          for=\"id_is_closed\"\n        >\n          <Select\n            id=\"id_is_closed\"\n            onChange={this.bindInput(\"is_closed\")}\n            value={this.state.is_closed}\n            choices={this.isClosedChoices}\n          />\n        </FormGroup>\n      )\n    } else {\n      return null\n    }\n  }\n\n  renderForm() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"modal-body\">\n          <FormGroup\n            label={pgettext(\"threads moderation merge field\", \"Thread title\")}\n            for=\"id_title\"\n            validation={this.state.errors.title}\n          >\n            <input\n              id=\"id_title\"\n              className=\"form-control\"\n              type=\"text\"\n              onChange={this.bindInput(\"title\")}\n              value={this.state.title}\n            />\n          </FormGroup>\n          <div className=\"clearfix\" />\n\n          <FormGroup\n            label={pgettext(\"threads moderation merge field\", \"Category\")}\n            for=\"id_category\"\n            validation={this.state.errors.category}\n          >\n            <CategorySelect\n              id=\"id_category\"\n              onChange={this.onCategoryChange}\n              value={this.state.category}\n              choices={this.categoryChoices}\n            />\n          </FormGroup>\n          <div className=\"clearfix\" />\n\n          {this.renderWeightField()}\n          {this.renderHiddenField()}\n          {this.renderClosedField()}\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            disabled={this.state.isLoading}\n            type=\"button\"\n          >\n            {pgettext(\"threads moderation merge btn\", \"Cancel\")}\n          </button>\n          <Button className=\"btn-primary\" loading={this.state.isLoading}>\n            {pgettext(\"threads moderation merge btn\", \"Merge threads\")}\n          </Button>\n        </div>\n      </form>\n    )\n  }\n\n  renderCantMergeMessage() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">info_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">\n            {pgettext(\n              \"threads moderation merge\",\n              \"You can't merge threads because there are no categories you are allowed to move them to.\"\n            )}\n          </p>\n          <p>\n            {pgettext(\n              \"threads moderation merge\",\n              \"You need permission to start threads in category to be able to merge threads to it.\"\n            )}\n          </p>\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"threads moderation merge dismiss btn\", \"Ok\")}\n          </button>\n        </div>\n      </div>\n    )\n  }\n\n  getClassName() {\n    if (!this.state.category) {\n      return \"modal-dialog modal-message\"\n    } else {\n      return \"modal-dialog\"\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"threads moderation merge title\", \"Merge threads\")}\n            </h4>\n          </div>\n          {this.state.category\n            ? this.renderForm()\n            : this.renderCantMergeMessage()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Form from \"misago/components/form\"\nimport FormGroup from \"misago/components/form-group\"\nimport CategorySelect from \"misago/components/category-select\"\nimport * as select from \"misago/reducers/selection\"\nimport { filterThreads } from \"misago/reducers/threads\"\nimport modal from \"misago/services/modal\"\nimport store from \"misago/services/store\"\n\nexport default class extends Form {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      category: null,\n    }\n\n    const acls = {}\n    for (const i in props.user.acl.categories) {\n      if (!props.user.acl.categories.hasOwnProperty(i)) {\n        continue\n      }\n\n      const acl = props.user.acl.categories[i]\n      acls[acl.id] = acl\n    }\n\n    this.categoryChoices = []\n    props.categories.forEach((category) => {\n      if (category.level > 0) {\n        const acl = acls[category.id]\n        const disabled =\n          !acl.can_start_threads ||\n          (category.is_closed && !acl.can_close_threads)\n\n        this.categoryChoices.push({\n          value: category.id,\n          disabled: disabled,\n          level: category.level - 1,\n          label: category.name,\n        })\n\n        if (!disabled && !this.state.category) {\n          this.state.category = category.id\n        }\n      }\n    })\n  }\n\n  handleSubmit = (event) => {\n    // we don't reload page on submissions\n    event.preventDefault()\n\n    modal.hide()\n\n    const onSuccess = () => {\n      store.dispatch(\n        filterThreads(this.props.route.category, this.props.categoriesMap)\n      )\n\n      // deselect threads moved outside of visible scope\n      const storeState = store.getState()\n      const leftThreads = storeState.threads.map((thread) => thread.id)\n      store.dispatch(\n        select.all(\n          storeState.selection.filter((thread) => {\n            return leftThreads.indexOf(thread) !== -1\n          })\n        )\n      )\n    }\n\n    this.props.callApi(\n      [\n        { op: \"replace\", path: \"category\", value: this.state.category },\n        { op: \"replace\", path: \"flatten-categories\", value: null },\n        { op: \"add\", path: \"acl\", value: true },\n      ],\n      pgettext(\"threads moderation move\", \"Selected threads were moved.\"),\n      onSuccess\n    )\n  }\n\n  getClassName() {\n    if (!this.state.category) {\n      return \"modal-dialog modal-message\"\n    } else {\n      return \"modal-dialog\"\n    }\n  }\n\n  renderForm() {\n    return (\n      <form onSubmit={this.handleSubmit}>\n        <div className=\"modal-body\">\n          <FormGroup\n            label={pgettext(\"threads moderation move field\", \"New category\")}\n            for=\"id_new_category\"\n          >\n            <CategorySelect\n              id=\"id_new_category\"\n              onChange={this.bindInput(\"category\")}\n              value={this.state.category}\n              choices={this.categoryChoices}\n            />\n          </FormGroup>\n        </div>\n        <div className=\"modal-footer\">\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            disabled={this.state.isLoading}\n            type=\"button\"\n          >\n            {pgettext(\"threads moderation move btn\", \"Cancel\")}\n          </button>\n          <button className=\"btn btn-primary\">\n            {pgettext(\"threads moderation move btn\", \"Move threads\")}\n          </button>\n        </div>\n      </form>\n    )\n  }\n\n  renderCantMoveMessage() {\n    return (\n      <div className=\"modal-body\">\n        <div className=\"message-icon\">\n          <span className=\"material-icon\">info_outline</span>\n        </div>\n        <div className=\"message-body\">\n          <p className=\"lead\">\n            {pgettext(\n              \"threads moderation move\",\n              \"You can't move threads because there are no categories you are allowed to move them to.\"\n            )}\n          </p>\n          <p>\n            {pgettext(\n              \"threads moderation move\",\n              \"You need permission to start threads in category to be able to move threads to it.\"\n            )}\n          </p>\n          <button\n            className=\"btn btn-default\"\n            data-dismiss=\"modal\"\n            type=\"button\"\n          >\n            {pgettext(\"threads moderation move dismiss btn\", \"Ok\")}\n          </button>\n        </div>\n      </div>\n    )\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()} role=\"document\">\n        <div className=\"modal-content\">\n          <div className=\"modal-header\">\n            <button\n              type=\"button\"\n              className=\"close\"\n              data-dismiss=\"modal\"\n              aria-label={pgettext(\"modal\", \"Close\")}\n            >\n              <span aria-hidden=\"true\">&times;</span>\n            </button>\n            <h4 className=\"modal-title\">\n              {pgettext(\"threads moderation move title\", \"Move threads\")}\n            </h4>\n          </div>\n          {this.state.category\n            ? this.renderForm()\n            : this.renderCantMoveMessage()}\n        </div>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport ErrorsModal from \"misago/components/threads/moderation/errors-list\"\nimport MergeThreads from \"misago/components/threads/moderation/merge\"\nimport MoveThreads from \"misago/components/threads/moderation/move\"\nimport * as select from \"misago/reducers/selection\"\nimport ajax from \"misago/services/ajax\"\nimport modal from \"misago/services/modal\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default class extends React.Component {\n  callApi = (ops, successMessage, onSuccess = null) => {\n    // freeze threads\n    this.props.threads.forEach((thread) => {\n      this.props.freezeThread(thread.id)\n    })\n\n    // list ids\n    const ids = this.props.threads.map((thread) => {\n      return thread.id\n    })\n\n    // always return current acl\n    ops.push({ op: \"add\", path: \"acl\", value: true })\n\n    ajax.patch(this.props.api, { ids, ops }).then(\n      (data) => {\n        // unfreeze\n        this.props.threads.forEach((thread) => {\n          this.props.freezeThread(thread.id)\n        })\n\n        // update threads\n        data.forEach((thread) => {\n          this.props.updateThread(thread)\n        })\n\n        // show success message and call callback\n        snackbar.success(successMessage)\n        if (onSuccess) {\n          onSuccess()\n        }\n      },\n      (rejection) => {\n        // unfreeze\n        this.props.threads.forEach((thread) => {\n          this.props.freezeThread(thread.id)\n        })\n\n        // escape on non-400 error\n        if (rejection.status !== 400) {\n          return snackbar.apiError(rejection)\n        }\n\n        // build errors list\n        let errors = []\n        let threadsMap = {}\n\n        this.props.threads.forEach((thread) => {\n          threadsMap[thread.id] = thread\n        })\n\n        rejection.forEach(({ id, detail }) => {\n          if (typeof threadsMap[id] !== \"undefined\") {\n            errors.push({\n              errors: detail,\n              thread: threadsMap[id],\n            })\n          }\n        })\n\n        modal.show(<ErrorsModal errors={errors} />)\n      }\n    )\n  }\n\n  pinGlobally = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 2,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were pinned globally.\")\n    )\n  }\n\n  pinLocally = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 1,\n        },\n      ],\n      pgettext(\n        \"threads moderation\",\n        \"Selected threads were pinned in category.\"\n      )\n    )\n  }\n\n  unpin = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"weight\",\n          value: 0,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were unpinned.\")\n    )\n  }\n\n  approve = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-unapproved\",\n          value: false,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were approved.\")\n    )\n  }\n\n  open = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-closed\",\n          value: false,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were opened.\")\n    )\n  }\n\n  close = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-closed\",\n          value: true,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were closed.\")\n    )\n  }\n\n  unhide = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-hidden\",\n          value: false,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were unhidden.\")\n    )\n  }\n\n  hide = () => {\n    this.callApi(\n      [\n        {\n          op: \"replace\",\n          path: \"is-hidden\",\n          value: true,\n        },\n      ],\n      pgettext(\"threads moderation\", \"Selected threads were hidden.\")\n    )\n  }\n\n  move = () => {\n    modal.show(\n      <MoveThreads\n        callApi={this.callApi}\n        categories={this.props.categories}\n        categoriesMap={this.props.categoriesMap}\n        route={this.props.route}\n        user={this.props.user}\n      />\n    )\n  }\n\n  merge = () => {\n    const errors = []\n    this.props.threads.forEach((thread) => {\n      if (!thread.acl.can_merge) {\n        errors.append({\n          id: thread.id,\n          title: thread.title,\n          errors: [\n            pgettext(\n              \"threads moderation\",\n              \"You don't have permission to merge this thread with others.\"\n            ),\n          ],\n        })\n      }\n    })\n\n    if (this.props.threads.length < 2) {\n      snackbar.info(\n        pgettext(\n          \"threads moderation\",\n          \"You have to select at least two threads to merge.\"\n        )\n      )\n    } else if (errors.length) {\n      modal.show(<ErrorsModal errors={errors} />)\n      return\n    } else {\n      modal.show(<MergeThreads {...this.props} />)\n    }\n  }\n\n  delete = () => {\n    if (\n      !window.confirm(\n        pgettext(\n          \"threads moderation\",\n          \"Are you sure you want to delete selected threads?\"\n        )\n      )\n    ) {\n      return\n    }\n\n    this.props.threads.map((thread) => {\n      this.props.freezeThread(thread.id)\n    })\n\n    const ids = this.props.threads.map((thread) => {\n      return thread.id\n    })\n\n    ajax.delete(this.props.api, ids).then(\n      () => {\n        this.props.threads.map((thread) => {\n          this.props.freezeThread(thread.id)\n          this.props.deleteThread(thread)\n        })\n\n        snackbar.success(\n          pgettext(\"threads moderation\", \"Selected threads were deleted.\")\n        )\n      },\n      (rejection) => {\n        if (rejection.status === 400) {\n          const failedThreads = rejection.map((thread) => {\n            return thread.id\n          })\n\n          this.props.threads.map((thread) => {\n            this.props.freezeThread(thread.id)\n            if (failedThreads.indexOf(thread.id) === -1) {\n              this.props.deleteThread(thread)\n            }\n          })\n\n          modal.show(<ErrorsModal errors={rejection} />)\n        } else {\n          snackbar.apiError(rejection)\n        }\n      }\n    )\n  }\n\n  render() {\n    const { moderation, threads } = this.props\n    const noSelection = this.props.selection.length == 0\n\n    return (\n      <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n        <li>\n          <button\n            className=\"btn btn-link\"\n            type=\"button\"\n            onClick={() => store.dispatch(select.all(threads.map((t) => t.id)))}\n          >\n            <span className=\"material-icon\">check_box</span>\n            {pgettext(\"threads moderation btn\", \"Select all\")}\n          </button>\n        </li>\n        <li>\n          <button\n            className=\"btn btn-link\"\n            type=\"button\"\n            disabled={noSelection}\n            onClick={() => store.dispatch(select.none())}\n          >\n            <span className=\"material-icon\">check_box_outline_blank</span>\n            {pgettext(\"threads moderation btn\", \"Select none\")}\n          </button>\n        </li>\n        <li role=\"separator\" className=\"divider\" />\n        {!!moderation.can_pin_globally && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.pinGlobally}\n            >\n              <span className=\"material-icon\">bookmark</span>\n              {pgettext(\"threads moderation btn\", \"Pin threads globally\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_pin && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.pinLocally}\n            >\n              <span className=\"material-icon\">bookmark_border</span>\n              {pgettext(\"threads moderation btn\", \"Pin threads in categories\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_pin && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.unpin}\n            >\n              <span className=\"material-icon\">panorama_fish_eye</span>\n              {pgettext(\"threads moderation btn\", \"Unpin threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_move && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.move}\n            >\n              <span className=\"material-icon\">arrow_forward</span>\n              {pgettext(\"threads moderation btn\", \"Move threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_merge && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.merge}\n            >\n              <span className=\"material-icon\">call_merge</span>\n              {pgettext(\"threads moderation btn\", \"Merge threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_approve && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.approve}\n            >\n              <span className=\"material-icon\">done</span>\n              {pgettext(\"threads moderation btn\", \"Approve threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_close && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.open}\n            >\n              <span className=\"material-icon\">lock_open</span>\n              {pgettext(\"threads moderation btn\", \"Open threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_close && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.close}\n            >\n              <span className=\"material-icon\">lock_outline</span>\n              {pgettext(\"threads moderation btn\", \"Close threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_unhide && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.unhide}\n            >\n              <span className=\"material-icon\">visibility</span>\n              {pgettext(\"threads moderation btn\", \"Unhide threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_hide && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.hide}\n            >\n              <span className=\"material-icon\">visibility_off</span>\n              {pgettext(\"threads moderation btn\", \"Hide threads\")}\n            </button>\n          </li>\n        )}\n        {!!moderation.can_delete && (\n          <li>\n            <button\n              className=\"btn btn-link\"\n              type=\"button\"\n              disabled={noSelection}\n              onClick={this.delete}\n            >\n              <span className=\"material-icon\">clear</span>\n              {pgettext(\"threads moderation btn\", \"Delete threads\")}\n            </button>\n          </li>\n        )}\n      </ul>\n    )\n  }\n}\n","import React from \"react\"\nimport ModerationControls from \"./moderation/controls\"\n\nconst ThreadsToolbarModeration = ({\n  api,\n  categoriesMap,\n  categories,\n  threads,\n  addThreads,\n  freezeThread,\n  updateThread,\n  deleteThread,\n  selection,\n  moderation,\n  route,\n  user,\n  disabled,\n}) => (\n  <div className=\"dropdown threads-moderation\">\n    <button\n      type=\"button\"\n      className=\"btn btn-default btn-outline btn-icon dropdown-toggle\"\n      title={pgettext(\"threads list nav\", \"Moderation\")}\n      data-toggle=\"dropdown\"\n      aria-haspopup=\"true\"\n      aria-expanded=\"false\"\n      disabled={disabled}\n    >\n      <span className=\"material-icon\">settings</span>\n    </button>\n    <ModerationControls\n      api={api}\n      categories={categories}\n      categoriesMap={categoriesMap}\n      threads={threads}\n      addThreads={addThreads}\n      freezeThread={freezeThread}\n      updateThread={updateThread}\n      deleteThread={deleteThread}\n      selection={selection}\n      moderation={moderation}\n      route={route}\n      user={user}\n      disabled={disabled}\n    />\n  </div>\n)\n\nexport default ThreadsToolbarModeration\n","import React from \"react\"\nimport posting from \"../../services/posting\"\nimport Button from \"../button\"\nimport { Toolbar, ToolbarItem, ToolbarSection, ToolbarSpacer } from \"../Toolbar\"\nimport ThreadsCategoryPicker from \"./ThreadsCategoryPicker\"\nimport ThreadsListPicker from \"./ThreadsListPicker\"\nimport ThreadsToolbarModeration from \"./ThreadsToolbarModeration\"\n\nconst ThreadsToolbar = ({\n  api,\n  baseUrl,\n  category,\n  categories,\n  categoriesMap,\n  topCategory,\n  topCategories,\n  subCategory,\n  subCategories,\n  list,\n  lists,\n  threads,\n  addThreads,\n  startThread,\n  freezeThread,\n  updateThread,\n  deleteThread,\n  selection,\n  moderation,\n  route,\n  user,\n  disabled,\n}) => (\n  <Toolbar>\n    {topCategories.length > 0 && (\n      <ToolbarSection>\n        <ToolbarItem>\n          <ThreadsCategoryPicker\n            allItems={pgettext(\"threads list nav\", \"All categories\")}\n            parentUrl={list.path}\n            category={topCategory}\n            categories={topCategories}\n            list={list}\n          />\n        </ToolbarItem>\n        {topCategory && subCategories.length > 0 && (\n          <ToolbarItem>\n            <ThreadsCategoryPicker\n              allItems={pgettext(\"threads list nav\", \"All subcategories\")}\n              parentUrl={topCategory.url.index}\n              category={subCategory}\n              categories={subCategories}\n              list={list}\n            />\n          </ToolbarItem>\n        )}\n      </ToolbarSection>\n    )}\n    {lists.length > 1 && (\n      <ToolbarSection className=\"hidden-xs\">\n        <ToolbarItem>\n          <ThreadsListPicker baseUrl={baseUrl} list={list} lists={lists} />\n        </ToolbarItem>\n      </ToolbarSection>\n    )}\n    <ToolbarSpacer />\n    {!!user.id && (\n      <ToolbarSection>\n        <ToolbarItem>\n          <Button\n            className=\"btn-primary btn-outline btn-block\"\n            disabled={disabled}\n            onClick={() => {\n              posting.open(\n                startThread || {\n                  mode: \"START\",\n\n                  config: misago.get(\"THREAD_EDITOR_API\"),\n                  submit: misago.get(\"THREADS_API\"),\n\n                  category: category.id,\n                }\n              )\n            }}\n          >\n            <span className=\"material-icon\">chat</span>\n            {pgettext(\"threads list nav\", \"Start thread\")}\n          </Button>\n        </ToolbarItem>\n        {!!moderation.allow && (\n          <ToolbarItem shrink>\n            <ThreadsToolbarModeration\n              api={api}\n              categories={categories}\n              categoriesMap={categoriesMap}\n              threads={threads.filter(\n                (thread) => selection.indexOf(thread.id) !== -1\n              )}\n              addThreads={addThreads}\n              freezeThread={freezeThread}\n              updateThread={updateThread}\n              deleteThread={deleteThread}\n              selection={selection}\n              moderation={moderation}\n              route={route}\n              user={user}\n              disabled={disabled}\n            />\n          </ToolbarItem>\n        )}\n      </ToolbarSection>\n    )}\n  </Toolbar>\n)\n\nexport default ThreadsToolbar\n","import React from \"react\"\nimport PageContainer from \"../PageContainer\"\nimport ThreadsToolbar from \"./ThreadsToolbar\"\n\nexport default class extends React.Component {\n  render() {\n    const { root } = this.props\n    const { category, categories, categoriesMap } = this.props.route\n    const topCategory = getTopCategory(root, category, categoriesMap)\n\n    return (\n      <PageContainer>\n        <ThreadsToolbar\n          api={this.props.api}\n          baseUrl={category.url.index}\n          category={category}\n          categories={categories}\n          categoriesMap={categoriesMap}\n          topCategory={topCategory}\n          topCategories={categories.filter((cat) => cat.parent === root.id)}\n          subCategories={\n            !!topCategory\n              ? categories.filter((cat) => cat.parent === topCategory.id)\n              : []\n          }\n          subCategory={category.level === 2 ? category : null}\n          subcategories={this.props.subcategories}\n          list={this.props.route.list}\n          lists={this.props.route.lists}\n          threads={this.props.threads}\n          addThreads={this.props.addThreads}\n          startThread={this.props.startThread}\n          freezeThread={this.props.freezeThread}\n          deleteThread={this.props.deleteThread}\n          updateThread={this.props.updateThread}\n          selection={this.props.selection}\n          moderation={this.props.moderation}\n          route={this.props.route}\n          user={this.props.user}\n          disabled={\n            !this.props.isLoaded ||\n            this.props.isBusy ||\n            this.props.busyThreads.length\n          }\n        />\n        {this.props.children}\n      </PageContainer>\n    )\n  }\n}\n\nconst getTopCategory = (root, category, categoriesMap) => {\n  if (!category.parent) return null\n  if (category.parent === root.id) return category\n  return categoriesMap[category.parent]\n}\n","import misago from \"misago/index\"\n\nexport function getPageTitle(route) {\n  if (route.category.level) {\n    if (route.list.path) {\n      return {\n        title: route.list.longName,\n        parent: route.category.name,\n      }\n    } else {\n      return {\n        title: route.category.name,\n      }\n    }\n  } else if (misago.get(\"THREADS_ON_INDEX\")) {\n    if (route.list.path) {\n      return {\n        title: route.list.longName,\n      }\n    } else {\n      return null\n    }\n  } else {\n    if (route.list.path) {\n      return {\n        title: route.list.longName,\n        parent: pgettext(\"threads list title\", \"Threads\"),\n      }\n    } else {\n      return {\n        title: pgettext(\"threads list title\", \"Threads\"),\n      }\n    }\n  }\n}\n\nexport function getTitle(route) {\n  if (route.category.level) {\n    return route.category.name\n  } else if (misago.get(\"THREADS_ON_INDEX\")) {\n    if (misago.get(\"SETTINGS\").index_header) {\n      return misago.get(\"SETTINGS\").index_header\n    } else {\n      return misago.get(\"SETTINGS\").forum_name\n    }\n  } else {\n    return pgettext(\"threads list title\", \"Threads\")\n  }\n}\n\nexport function isThreadChanged(current, fromDb) {\n  return (\n    [\n      current.title === fromDb.title,\n      current.weight === fromDb.weight,\n      current.category === fromDb.category,\n      current.last_post === fromDb.last_post,\n      current.last_poster_name === fromDb.last_poster_name,\n    ].indexOf(false) >= 0\n  )\n}\n\nexport function diffThreads(current, fromDb) {\n  let currentMap = {}\n  current.forEach(function (thread) {\n    currentMap[thread.id] = thread\n  })\n\n  return fromDb.filter(function (thread) {\n    if (currentMap[thread.id]) {\n      return isThreadChanged(currentMap[thread.id], thread)\n    } else {\n      return true\n    }\n  })\n}\n\nexport function getModerationActions(threads) {\n  let moderation = {\n    allow: false,\n\n    can_approve: 0,\n    can_close: 0,\n    can_delete: 0,\n    can_hide: 0,\n    can_merge: 0,\n    can_move: 0,\n    can_pin: 0,\n    can_pin_globally: 0,\n    can_unhide: 0,\n  }\n\n  threads.forEach(function (thread) {\n    if (\n      thread.is_unapproved &&\n      thread.acl.can_approve > moderation.can_approve\n    ) {\n      moderation.can_approve = thread.acl.can_approve\n    }\n\n    if (thread.acl.can_close > moderation.can_close) {\n      moderation.can_close = thread.acl.can_close\n    }\n\n    if (thread.acl.can_delete > moderation.can_delete) {\n      moderation.can_delete = thread.acl.can_delete\n    }\n\n    if (thread.acl.can_hide > moderation.can_hide) {\n      moderation.can_hide = thread.acl.can_hide\n    }\n\n    if (thread.acl.can_merge > moderation.can_merge) {\n      moderation.can_merge = thread.acl.can_merge\n    }\n\n    if (thread.acl.can_move > moderation.can_move) {\n      moderation.can_move = thread.acl.can_move\n    }\n\n    if (thread.acl.can_pin > moderation.can_pin) {\n      moderation.can_pin = thread.acl.can_pin\n    }\n\n    if (thread.acl.can_pin_globally > moderation.can_pin_globally) {\n      moderation.can_pin_globally = thread.acl.can_pin_globally\n    }\n\n    if (thread.is_hidden && thread.acl.can_unhide > moderation.can_unhide) {\n      moderation.can_unhide = thread.acl.can_unhide\n    }\n\n    moderation.allow =\n      moderation.can_approve ||\n      moderation.can_close ||\n      moderation.can_delete ||\n      moderation.can_hide ||\n      moderation.can_merge ||\n      moderation.can_move ||\n      moderation.can_pin ||\n      moderation.can_pin_globally ||\n      moderation.can_unhide\n  })\n\n  return moderation\n}\n","import React from \"react\"\n\nconst ThreadsListEmpty = ({ category, list, message }) => {\n  if (list.type === \"all\") {\n    if (message) {\n      return (\n        <li className=\"list-group-item empty-message\">\n          <p className=\"lead\">{message}</p>\n        </li>\n      )\n    }\n\n    return (\n      <li className=\"list-group-item empty-message\">\n        <p className=\"lead\">\n          {category.special_role\n            ? pgettext(\n                \"threads list empty\",\n                \"There are no threads on this site yet.\"\n              )\n            : pgettext(\n                \"threads list empty\",\n                \"There are no threads in this category.\"\n              )}\n        </p>\n      </li>\n    )\n  }\n\n  return (\n    <li className=\"list-group-item empty-message\">\n      <p className=\"lead\">\n        {pgettext(\n          \"threads list empty\",\n          \"No threads matching specified criteria were found.\"\n        )}\n      </p>\n    </li>\n  )\n}\n\nexport default ThreadsListEmpty\n","import React from \"react\"\nimport Timestamp from \"../Timestamp\"\n\nconst ThreadsListItemActivity = ({ thread }) => (\n  <a href={thread.url.last_post} className=\"threads-list-item-last-activity\">\n    <Timestamp\n      datetime={thread.last_post_on}\n      title={pgettext(\"threads list\", \"%(timestamp)s - latest activity\")}\n      narrow\n    />\n  </a>\n)\n\nexport default ThreadsListItemActivity\n","import React from \"react\"\n\nconst ThreadsListItemCategory = ({ parent, category }) => (\n  <div>\n    {parent && (\n      <a\n        href={parent.url.index}\n        className={getClassName(parent) + \" threads-list-item-parent-category\"}\n        style={parent.color ? { \"--label-color\": parent.color } : null}\n        title={!!parent.short_name ? parent.name : null}\n      >\n        {parent.short_name || parent.name}\n      </a>\n    )}\n    <a\n      href={category.url.index}\n      className={getClassName(category)}\n      style={category.color ? { \"--label-color\": category.color } : null}\n      title={!!category.short_name ? category.name : null}\n    >\n      {category.short_name || category.name}\n    </a>\n  </div>\n)\n\nconst getClassName = (category) => {\n  let className = \"threads-list-item-category threads-list-category-label\"\n\n  if (category.color) {\n    className += \" threads-list-category-label-color\"\n  }\n\n  return className\n}\n\nexport default ThreadsListItemCategory\n","import React from \"react\"\nimport * as select from \"../../reducers/selection\"\nimport store from \"../../services/store\"\n\nconst ThreadsListItemCheckbox = ({ checked, disabled, thread }) => (\n  <button\n    className=\"btn btn-default btn-icon\"\n    type=\"button\"\n    disabled={disabled}\n    onClick={() => store.dispatch(select.item(thread.id))}\n  >\n    <span className=\"material-icon\">\n      {checked ? \"check_box\" : \"check_box_outline_blank\"}\n    </span>\n  </button>\n)\n\nexport default ThreadsListItemCheckbox\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nconst ThreadsListItemLastPoster = ({ thread }) =>\n  !!thread.last_poster ? (\n    <a\n      href={thread.url.last_poster}\n      className=\"threads-list-item-last-poster\"\n      title={interpolate(\n        pgettext(\"threads list\", \"%(poster)s - latest poster\"),\n        { poster: thread.last_poster.username },\n        true\n      )}\n    >\n      <Avatar size={30} user={thread.last_poster} />\n    </a>\n  ) : (\n    <span\n      className=\"threads-list-item-last-poster\"\n      title={interpolate(\n        pgettext(\"threads list\", \"%(poster)s - latest poster\"),\n        { poster: thread.last_poster_name },\n        true\n      )}\n    >\n      <Avatar size={30} />\n    </span>\n  )\n\nexport default ThreadsListItemLastPoster\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport { patch } from \"../../reducers/threads\"\nimport snackbar from \"../../services/snackbar\"\nimport { ApiMutation } from \"../Api\"\nimport { DropdownSubheader } from \"../Dropdown\"\n\nconst ThreadsListItemNotifications = ({ dispatch, disabled, thread }) => (\n  <ApiMutation url={thread.api.watch}>\n    {(mutate, { loading }) => {\n      function setNotifications(notifications) {\n        if (thread.notifications !== notifications) {\n          dispatch(patch(thread, { notifications }))\n          mutate({\n            json: { notifications },\n            onError: (error) => {\n              snackbar.apiError(error)\n              dispatch(patch(thread, { notifications: thread.notifications }))\n            },\n          })\n        }\n      }\n\n      return (\n        <div className=\"dropdown\">\n          <button\n            className=\"btn btn-default btn-icon\"\n            type=\"button\"\n            title={getTitle(thread.notifications)}\n            data-toggle=\"dropdown\"\n            aria-haspopup=\"true\"\n            aria-expanded=\"false\"\n          >\n            <span className=\"material-icon\">\n              {getIcon(thread.notifications)}\n            </span>\n          </button>\n          <ul className=\"dropdown-menu dropdown-menu-right stick-to-bottom\">\n            <DropdownSubheader>\n              {pgettext(\"watch thread\", \"Notify about new replies\")}\n            </DropdownSubheader>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={disabled || loading}\n                onClick={() => setNotifications(2)}\n              >\n                <span className=\"material-icon\">mail</span>\n                {pgettext(\"watch thread\", \"On site and with e-mail\")}\n              </button>\n            </li>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={disabled || loading}\n                onClick={() => setNotifications(1)}\n              >\n                <span className=\"material-icon\">notifications_active</span>\n                {pgettext(\"watch thread\", \"On site only\")}\n              </button>\n            </li>\n            <li>\n              <button\n                className=\"btn btn-link\"\n                disabled={disabled || loading}\n                onClick={() => setNotifications(0)}\n              >\n                <span className=\"material-icon\">notifications_none</span>\n                {pgettext(\"watch thread\", \"Don't notify\")}\n              </button>\n            </li>\n          </ul>\n        </div>\n      )\n    }}\n  </ApiMutation>\n)\n\nconst getIcon = (notifications) => {\n  if (notifications === 2) return \"mail\"\n  if (notifications === 1) return \"notifications_active\"\n\n  return \"notifications_none\"\n}\n\nconst getTitle = (notifications) => {\n  if (notifications === 2) {\n    return pgettext(\"watch thread\", \"Send e-mail notifications\")\n  }\n\n  if (notifications === 1) {\n    return pgettext(\"watch thread\", \"Without e-mail notifications\")\n  }\n\n  return gettext(\"Not watching\")\n}\n\nconst ThreadsListItemNotificationsConnected = connect()(\n  ThreadsListItemNotifications\n)\n\nexport default ThreadsListItemNotificationsConnected\n","import React from \"react\"\n\nconst ThreadsListItemReadStatus = ({ thread }) => {\n  if (thread && !thread.is_read) {\n    return (\n      <div\n        className=\"threads-list-item-read-status\"\n        title={pgettext(\"threads list\", \"Contains unread posts\")}\n      >\n        <span className=\"threads-list-unread-icon\"></span>\n      </div>\n    )\n  }\n\n  return (\n    <div\n      className=\"threads-list-item-read-status\"\n      title={pgettext(\"threads list\", \"No unread posts\")}\n    >\n      <span className=\"threads-list-read-icon\"></span>\n    </div>\n  )\n}\n\nexport default ThreadsListItemReadStatus\n","import React from \"react\"\nimport Avatar from \"../avatar\"\n\nconst ThreadsListItemStarter = ({ thread }) =>\n  !!thread.starter ? (\n    <a\n      href={thread.url.starter}\n      className=\"threads-list-item-starter\"\n      title={interpolate(\n        pgettext(\"threads list\", \"%(starter)s - original poster\"),\n        { starter: thread.starter.username },\n        true\n      )}\n    >\n      <Avatar size={30} user={thread.starter} />\n    </a>\n  ) : (\n    <span\n      className=\"threads-list-item-starter\"\n      title={interpolate(\n        pgettext(\"threads list\", \"%(starter)s - original poster\"),\n        { starter: thread.starter_name },\n        true\n      )}\n    >\n      <Avatar size={30} />\n    </span>\n  )\n\nexport default ThreadsListItemStarter\n","import classnames from \"classnames\"\nimport React from \"react\"\n\nconst ThreadsListItemTitle = ({ thread, isNew }) => (\n  <div className=\"threads-list-item-col-title\">\n    <a\n      href={isNew ? thread.url.new_post : thread.url.index}\n      className={classnames(\"threads-list-item-title\", {\n        \"threads-list-item-title-new\": isNew,\n      })}\n    >\n      {thread.title}\n    </a>\n    {getPagesRange(thread.pages).map((page) => (\n      <a\n        key={page}\n        href={thread.url.index + page + \"/\"}\n        className=\"threads-list-item-goto-page\"\n        title={pgettext(\"threads list\", \"Go to page: %(page)s\").replace(\n          \"%(page)s\",\n          page\n        )}\n      >\n        {page}\n      </a>\n    ))}\n  </div>\n)\n\nfunction getPagesRange(pages) {\n  const range = []\n  if (pages > 3) {\n    range.push(pages - 2)\n  }\n  if (pages > 2) {\n    range.push(pages - 1)\n  }\n  if (pages > 1) {\n    range.push(pages)\n  }\n  return range\n}\n\nexport default ThreadsListItemTitle\n","import classnames from \"classnames\"\nimport React from \"react\"\nimport ThreadFlags from \"../ThreadFlags\"\nimport ThreadReplies from \"../ThreadReplies\"\nimport ThreadsListItemActivity from \"./ThreadsListItemActivity\"\nimport ThreadsListItemCategory from \"./ThreadsListItemCategory\"\nimport ThreadsListItemCheckbox from \"./ThreadsListItemCheckbox\"\nimport ThreadsListItemLastPoster from \"./ThreadsListItemLastPoster\"\nimport ThreadsListItemNotifications from \"./ThreadsListItemNotifications\"\nimport ThreadsListItemReadStatus from \"./ThreadsListItemReadStatus\"\nimport ThreadsListItemStarter from \"./ThreadsListItemStarter\"\nimport ThreadsListItemTitle from \"./ThreadsListItemTitle\"\n\nconst ThreadsListItem = ({\n  activeCategory,\n  categories,\n  showOptions,\n  showNotifications,\n  thread,\n  isBusy,\n  isSelected,\n}) => {\n  let parent = null\n  let category = null\n\n  if (activeCategory.id !== thread.category) {\n    category = categories[thread.category]\n\n    if (\n      category.parent &&\n      category.parent !== activeCategory.id &&\n      categories[category.parent] &&\n      !categories[category.parent].special_role\n    ) {\n      parent = categories[category.parent]\n    }\n  }\n\n  const hasFlags =\n    thread.is_closed ||\n    thread.is_hidden ||\n    thread.is_unapproved ||\n    thread.weight > 0 ||\n    thread.best_answer ||\n    thread.has_poll ||\n    thread.has_unapproved_posts\n\n  const isNew = showOptions ? thread.is_new : false\n\n  return (\n    <li\n      className={classnames(\"list-group-item threads-list-item\", {\n        \"threads-list-item-is-busy\": isBusy,\n      })}\n    >\n      <div className=\"threads-list-item-col-starter\">\n        <ThreadsListItemStarter thread={thread} />\n      </div>\n      {showOptions && (\n        <div className=\"threads-list-item-col-read-status\">\n          <ThreadsListItemReadStatus thread={thread} />\n        </div>\n      )}\n      <div className=\"threads-list-item-right-col\">\n        <div className=\"threads-list-item-top-row\">\n          <ThreadsListItemTitle thread={thread} isNew={isNew} />\n          {showOptions && thread.moderation.length > 0 && (\n            <div className=\"threads-list-item-col-checkbox-sm\">\n              <ThreadsListItemCheckbox\n                checked={isSelected}\n                disabled={isBusy}\n                thread={thread}\n              />\n            </div>\n          )}\n        </div>\n        <div className=\"threads-list-item-bottom-row\">\n          <div className=\"threads-list-item-bottom-left\">\n            <div className=\"threads-list-item-col-starter-sm\">\n              <ThreadsListItemStarter thread={thread} />\n            </div>\n            {hasFlags && (\n              <div className=\"threads-list-item-col-flags\">\n                <ThreadFlags thread={thread} />\n              </div>\n            )}\n            {!!category && (\n              <div className=\"threads-list-item-col-category\">\n                <ThreadsListItemCategory parent={parent} category={category} />\n              </div>\n            )}\n          </div>\n          <div className=\"threads-list-item-bottom-right\">\n            <div\n              className={classnames(\"threads-list-item-col-replies\", {\n                \"threads-list-item-col-replies-zero\": thread.replies === 0,\n              })}\n            >\n              <ThreadReplies thread={thread} />\n            </div>\n            <div className=\"threads-list-item-col-last-poster\">\n              <ThreadsListItemLastPoster thread={thread} />\n            </div>\n            <div className=\"threads-list-item-col-last-activity\">\n              <ThreadsListItemActivity thread={thread} />\n            </div>\n            <div className=\"threads-list-item-col-last-poster-sm\">\n              <ThreadsListItemLastPoster thread={thread} />\n            </div>\n            {showOptions && showNotifications && (\n              <div className=\"threads-list-item-col-notifications\">\n                <ThreadsListItemNotifications\n                  disabled={isBusy}\n                  thread={thread}\n                />\n              </div>\n            )}\n            {showOptions && thread.moderation.length > 0 && (\n              <div className=\"threads-list-item-col-checkbox\">\n                <ThreadsListItemCheckbox\n                  checked={isSelected}\n                  disabled={isBusy}\n                  thread={thread}\n                />\n              </div>\n            )}\n          </div>\n        </div>\n      </div>\n    </li>\n  )\n}\n\nexport default ThreadsListItem\n","import React from \"react\"\n\nconst UIPreviewText = ({ width }) => (\n  <span className=\"ui-preview-text\" style={{ width: width + \"px\" }}>\n    &nbsp;\n  </span>\n)\n\nexport default UIPreviewText\n","import React from \"react\"\nimport Avatar from \"../avatar\"\nimport { UIPreviewText } from \"../UIPreview\"\nimport ThreadsListItemReadStatus from \"./ThreadsListItemReadStatus\"\n\nconst ThreadsListLoader = ({ showOptions }) => (\n  <div className=\"threads-list threads-list-loader\">\n    <ul className=\"list-group\">\n      <li className=\"list-group-item threads-list-item\">\n        <div className=\"threads-list-item-col-starter\">\n          <Avatar size={26} />\n        </div>\n        {showOptions && (\n          <div className=\"threads-list-item-col-read-status\">\n            <ThreadsListItemReadStatus />\n          </div>\n        )}\n        <div className=\"threads-list-item-right-col\">\n          <div className=\"threads-list-item-top-row\">\n            {showOptions && (\n              <div className=\"threads-list-item-col-icon\">\n                <span className=\"threads-list-icon ui-preview-img\"></span>\n              </div>\n            )}\n            <div className=\"threads-list-item-col-title\">\n              <span className=\"threads-list-item-title\">\n                <UIPreviewText width=\"90\" /> <UIPreviewText width=\"40\" />{\" \"}\n                <UIPreviewText width=\"120\" />\n              </span>\n            </div>\n          </div>\n          <div className=\"threads-list-item-bottom-row\">\n            <div className=\"threads-list-item-bottom-left\">\n              <div className=\"threads-list-item-col-starter-sm\">\n                <Avatar size={20} />\n              </div>\n              <div className=\"threads-list-item-col-category\">\n                <UIPreviewText width=\"70\" />\n              </div>\n            </div>\n            <div className=\"threads-list-item-bottom-right\">\n              <div className=\"threads-list-item-col-replies\">\n                <UIPreviewText width=\"50\" />\n              </div>\n              <div className=\"threads-list-item-col-last-poster\">\n                <span className=\"threads-list-item-last-poster\">\n                  <Avatar size={26} />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-activity\">\n                <span className=\"threads-list-item-last-activity\">\n                  <UIPreviewText width=\"50\" />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-poster-sm\">\n                <Avatar size={20} />\n              </div>\n            </div>\n          </div>\n        </div>\n      </li>\n      <li className=\"list-group-item threads-list-item\">\n        <div className=\"threads-list-item-col-starter\">\n          <Avatar size={26} />\n        </div>\n        {showOptions && (\n          <div className=\"threads-list-item-col-read-status\">\n            <ThreadsListItemReadStatus />\n          </div>\n        )}\n        <div className=\"threads-list-item-right-col\">\n          <div className=\"threads-list-item-top-row\">\n            {showOptions && (\n              <div className=\"threads-list-item-col-icon\">\n                <span className=\"threads-list-icon ui-preview-img\"></span>\n              </div>\n            )}\n            <div className=\"threads-list-item-col-title\">\n              <span className=\"threads-list-item-title\">\n                <UIPreviewText width=\"120\" /> <UIPreviewText width=\"30\" />{\" \"}\n                <UIPreviewText width=\"60\" />\n              </span>\n            </div>\n          </div>\n          <div className=\"threads-list-item-bottom-row\">\n            <div className=\"threads-list-item-bottom-left\">\n              <div className=\"threads-list-item-col-starter-sm\">\n                <Avatar size={20} />\n              </div>\n              <div className=\"threads-list-item-col-category\">\n                <UIPreviewText width=\"90\" />\n              </div>\n            </div>\n            <div className=\"threads-list-item-bottom-right\">\n              <div className=\"threads-list-item-col-replies\">\n                <UIPreviewText width=\"70\" />\n              </div>\n              <div className=\"threads-list-item-col-last-poster\">\n                <span className=\"threads-list-item-last-poster\">\n                  <Avatar size={26} />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-activity\">\n                <span className=\"threads-list-item-last-activity\">\n                  <UIPreviewText width=\"40\" />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-poster-sm\">\n                <Avatar size={20} />\n              </div>\n            </div>\n          </div>\n        </div>\n      </li>\n      <li className=\"list-group-item threads-list-item\">\n        <div className=\"threads-list-item-col-starter\">\n          <Avatar size={26} />\n        </div>\n        {showOptions && (\n          <div className=\"threads-list-item-col-read-status\">\n            <ThreadsListItemReadStatus />\n          </div>\n        )}\n        <div className=\"threads-list-item-right-col\">\n          <div className=\"threads-list-item-top-row\">\n            {showOptions && (\n              <div className=\"threads-list-item-col-icon\">\n                <span className=\"threads-list-icon ui-preview-img\"></span>\n              </div>\n            )}\n            <div className=\"threads-list-item-col-title\">\n              <span className=\"threads-list-item-title\">\n                <UIPreviewText width=\"40\" /> <UIPreviewText width=\"120\" />{\" \"}\n                <UIPreviewText width=\"80\" />\n              </span>\n            </div>\n          </div>\n          <div className=\"threads-list-item-bottom-row\">\n            <div className=\"threads-list-item-bottom-left\">\n              <div className=\"threads-list-item-col-starter-sm\">\n                <Avatar size={20} />\n              </div>\n              <div className=\"threads-list-item-col-category\">\n                <UIPreviewText width=\"80\" />\n              </div>\n            </div>\n            <div className=\"threads-list-item-bottom-right\">\n              <div className=\"threads-list-item-col-replies\">\n                <UIPreviewText width=\"50\" />\n              </div>\n              <div className=\"threads-list-item-col-last-poster\">\n                <span className=\"threads-list-item-last-poster\">\n                  <Avatar size={26} />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-activity\">\n                <span className=\"threads-list-item-last-activity\">\n                  <UIPreviewText width=\"45\" />\n                </span>\n              </div>\n              <div className=\"threads-list-item-col-last-poster-sm\">\n                <Avatar size={20} />\n              </div>\n            </div>\n          </div>\n        </div>\n      </li>\n    </ul>\n  </div>\n)\n\nexport default ThreadsListLoader\n","import React from \"react\"\n\nconst ThreadsListUpdatePrompt = ({ threads, onClick }) => (\n  <li className=\"list-group-item threads-list-update-prompt\">\n    <button\n      type=\"button\"\n      className=\"btn btn-block threads-list-update-prompt-btn\"\n      onClick={onClick}\n    >\n      <span className=\"material-icon\">cached</span>\n      <span className=\"threads-list-update-prompt-message\">\n        {interpolate(\n          npgettext(\n            \"threads list update prompt\",\n            \"There is %(threads)s new or updated thread. Click here to show it.\",\n            \"There are %(threads)s new or updated threads. Click here to show them.\",\n            threads\n          ),\n          { threads },\n          true\n        )}\n      </span>\n    </button>\n  </li>\n)\n\nexport default ThreadsListUpdatePrompt\n","import ThreadsList from \"./ThreadsList\"\n\nexport default ThreadsList\n","import React from \"react\"\nimport ThreadsListEmpty from \"./ThreadsListEmpty\"\nimport ThreadsListItem from \"./ThreadsListItem\"\nimport ThreadsListLoader from \"./ThreadsListLoader\"\nimport ThreadsListUpdatePrompt from \"./ThreadsListUpdatePrompt\"\n\nconst ThreadsList = ({\n  list,\n  categories,\n  category,\n  threads,\n  busyThreads,\n  selection,\n  isLoaded,\n  showOptions,\n  updatedThreads,\n  applyUpdate,\n  emptyMessage,\n}) => {\n  if (!isLoaded) {\n    return <ThreadsListLoader showOptions={showOptions} />\n  }\n\n  return (\n    <div className=\"threads-list\">\n      {threads.length > 0 ? (\n        <ul className=\"list-group\">\n          {updatedThreads > 0 && (\n            <ThreadsListUpdatePrompt\n              threads={updatedThreads}\n              onClick={applyUpdate}\n            />\n          )}\n          {threads.map((thread) => (\n            <ThreadsListItem\n              key={thread.id}\n              activeCategory={category}\n              categories={categories}\n              thread={thread}\n              showOptions={showOptions}\n              showNotifications={showOptions && list.type === \"watched\"}\n              isBusy={busyThreads.indexOf(thread.id) >= 0}\n              isSelected={selection.indexOf(thread.id) >= 0}\n            />\n          ))}\n        </ul>\n      ) : (\n        <ul className=\"list-group\">\n          {updatedThreads > 0 && (\n            <ThreadsListUpdatePrompt\n              threads={updatedThreads}\n              onClick={applyUpdate}\n            />\n          )}\n          <ThreadsListEmpty\n            category={category}\n            list={list}\n            message={emptyMessage}\n          />\n        </ul>\n      )}\n    </div>\n  )\n}\n\nexport default ThreadsList\n","import React from \"react\"\nimport Button from \"misago/components/button\"\nimport {\n  compareGlobalWeight,\n  compareWeight,\n} from \"misago/components/threads/compare\"\nimport Container from \"misago/components/threads/container\"\nimport {\n  diffThreads,\n  getModerationActions,\n  getPageTitle,\n  getTitle,\n} from \"misago/components/threads/utils\"\nimport ThreadsList from \"misago/components/ThreadsList\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport * as select from \"misago/reducers/selection\"\nimport { append, deleteThread, hydrate, patch } from \"misago/reducers/threads\"\nimport ajax from \"misago/services/ajax\"\nimport polls from \"misago/services/polls\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport * as sets from \"misago/utils/sets\"\nimport {\n  PageHeaderHTMLMessage,\n  PageHeaderMessage,\n  PageHeaderPlain,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n  constructor(props) {\n    super(props)\n\n    this.state = {\n      isMounted: true,\n\n      isLoaded: false,\n      isBusy: false,\n\n      diff: {\n        results: [],\n      },\n\n      moderation: [],\n      busyThreads: [],\n\n      dropdown: false,\n      subcategories: [],\n\n      next: 0,\n    }\n\n    let category = this.getCategory()\n\n    if (misago.has(\"THREADS\")) {\n      this.initWithPreloadedData(category, misago.get(\"THREADS\"))\n    } else {\n      this.initWithoutPreloadedData(category)\n    }\n  }\n\n  getCategory() {\n    if (!this.props.route.category.special_role) {\n      return this.props.route.category.id\n    } else {\n      return null\n    }\n  }\n\n  initWithPreloadedData(category, data) {\n    this.state = Object.assign(this.state, {\n      moderation: getModerationActions(data.results),\n      subcategories: data.subcategories,\n      next: data.next,\n    })\n\n    this.startPolling(category)\n  }\n\n  initWithoutPreloadedData(category) {\n    this.loadThreads(category)\n  }\n\n  loadThreads(category, next = 0) {\n    ajax\n      .get(\n        this.props.options.api,\n        {\n          category: category,\n          list: this.props.route.list.type,\n          start: next || 0,\n        },\n        \"threads\"\n      )\n      .then(\n        (data) => {\n          if (!this.state.isMounted) {\n            // user changed route before loading completion\n            return\n          }\n\n          if (next === 0) {\n            store.dispatch(hydrate(data.results))\n          } else {\n            store.dispatch(append(data.results, this.getSorting()))\n          }\n\n          this.setState({\n            isLoaded: true,\n            isBusy: false,\n\n            moderation: getModerationActions(store.getState().threads),\n\n            subcategories: data.subcategories,\n\n            next: data.next,\n          })\n\n          this.startPolling(category)\n        },\n        (rejection) => {\n          snackbar.apiError(rejection)\n        }\n      )\n  }\n\n  startPolling(category) {\n    polls.start({\n      poll: \"threads\",\n      url: this.props.options.api,\n      data: {\n        category: category,\n        list: this.props.route.list.type,\n      },\n      frequency: 120 * 1000,\n      update: this.pollResponse,\n    })\n  }\n\n  componentDidMount() {\n    this.setPageTitle()\n\n    if (misago.has(\"THREADS\")) {\n      // unlike in other components, routes are root components for threads\n      // so we can't dispatch store action from constructor\n      store.dispatch(hydrate(misago.pop(\"THREADS\").results))\n\n      this.setState({\n        isLoaded: true,\n      })\n    }\n\n    store.dispatch(select.none())\n  }\n\n  componentWillUnmount() {\n    this.state.isMounted = false\n    polls.stop(\"threads\")\n  }\n\n  getTitle() {\n    if (this.props.options.title) {\n      return this.props.options.title\n    }\n\n    return getTitle(this.props.route)\n  }\n\n  setPageTitle() {\n    if (this.props.route.category.level || !misago.get(\"THREADS_ON_INDEX\")) {\n      title.set(getPageTitle(this.props.route))\n    } else if (this.props.options.title) {\n      title.set(this.props.options.title)\n    } else {\n      if (misago.get(\"SETTINGS\").index_title) {\n        document.title = misago.get(\"SETTINGS\").index_title\n      } else {\n        document.title = misago.get(\"SETTINGS\").forum_name\n      }\n    }\n  }\n\n  getSorting() {\n    if (this.props.route.category.level) {\n      return compareWeight\n    } else {\n      return compareGlobalWeight\n    }\n  }\n\n  // AJAX\n\n  loadMore = () => {\n    this.setState({\n      isBusy: true,\n    })\n\n    this.loadThreads(this.getCategory(), this.state.next)\n  }\n\n  pollResponse = (data) => {\n    this.setState({\n      diff: Object.assign({}, data, {\n        results: diffThreads(this.props.threads, data.results),\n      }),\n    })\n  }\n\n  addThreads = (threads) => {\n    store.dispatch(append(threads, this.getSorting()))\n  }\n\n  applyDiff = () => {\n    this.addThreads(this.state.diff.results)\n\n    this.setState(\n      Object.assign({}, this.state.diff, {\n        moderation: getModerationActions(store.getState().threads),\n\n        diff: {\n          results: [],\n        },\n      })\n    )\n  }\n\n  // Thread state utils\n\n  freezeThread = (thread) => {\n    this.setState(function (currentState) {\n      return {\n        busyThreads: sets.toggle(currentState.busyThreads, thread),\n      }\n    })\n  }\n\n  updateThread = (thread) => {\n    store.dispatch(patch(thread, thread, this.getSorting()))\n  }\n\n  deleteThread = (thread) => {\n    store.dispatch(deleteThread(thread))\n  }\n\n  getMoreButton() {\n    if (!this.state.next) return null\n\n    return (\n      <div className=\"pager-more\">\n        <Button\n          className=\"btn btn-default btn-outline\"\n          loading={this.state.isBusy || this.state.busyThreads.length}\n          onClick={this.loadMore}\n        >\n          {pgettext(\"threas list more btn\", \"Show more\")}\n        </Button>\n      </div>\n    )\n  }\n\n  getClassName() {\n    let className = \"page page-threads\"\n    className += \" page-threads-\" + this.props.route.list.type\n    if (isIndex(this.props)) {\n      className += \" page-threads-index\"\n    }\n    if (this.props.route.category.css_class) {\n      className += \" page-threads-\" + this.props.route.category.css_class\n    }\n    return className\n  }\n\n  render() {\n    const root = this.props.route.categories[0]\n    const { category, list } = this.props.route\n    const specialRole = category.special_role\n\n    return (\n      <div className={this.getClassName()}>\n        {specialRole == \"root_category\" &&\n          misago.get(\"THREADS_ON_INDEX\") &&\n          misago.get(\"SETTINGS\").index_header && (\n            <PageHeaderPlain\n              header={misago.get(\"SETTINGS\").index_header}\n              message={\n                category.description && (\n                  <PageHeaderHTMLMessage message={category.description.html} />\n                )\n              }\n              styleName=\"forum-index\"\n            />\n          )}\n        {specialRole == \"root_category\" && !misago.get(\"THREADS_ON_INDEX\") && (\n          <PageHeaderPlain\n            header={pgettext(\"threads list title\", \"Threads\")}\n            styleName=\"threads\"\n          />\n        )}\n        {specialRole == \"private_threads\" && (\n          <PageHeaderPlain\n            header={this.props.options.title}\n            message={\n              this.props.options.pageLead && (\n                <PageHeaderMessage>\n                  <p>{this.props.options.pageLead}</p>\n                </PageHeaderMessage>\n              )\n            }\n            styleName=\"private-threads\"\n          />\n        )}\n        {!specialRole && (\n          <PageHeaderPlain\n            header={category.name}\n            message={\n              category.description && (\n                <PageHeaderHTMLMessage message={category.description.html} />\n              )\n            }\n            styleName={category.css_class || \"category-threads\"}\n          />\n        )}\n        <Container\n          api={this.props.options.api}\n          root={root}\n          route={this.props.route}\n          user={this.props.user}\n          pageLead={this.props.options.pageLead}\n          threads={this.props.threads}\n          threadsCount={this.state.count}\n          moderation={this.state.moderation}\n          selection={this.props.selection}\n          busyThreads={this.state.busyThreads}\n          addThreads={this.addThreads}\n          startThread={this.props.options.startThread}\n          freezeThread={this.freezeThread}\n          deleteThread={this.deleteThread}\n          updateThread={this.updateThread}\n          isLoaded={this.state.isLoaded}\n          isBusy={this.state.isBusy}\n        >\n          <ThreadsList\n            category={category}\n            categories={this.props.route.categoriesMap}\n            list={list}\n            selection={this.props.selection}\n            threads={this.props.threads}\n            updatedThreads={this.state.diff.results.length}\n            applyUpdate={this.applyDiff}\n            showOptions={!!this.props.user.id}\n            isLoaded={this.state.isLoaded}\n            busyThreads={this.state.busyThreads}\n            emptyMessage={this.props.options.emptyMessage}\n          />\n          {this.getMoreButton()}\n        </Container>\n      </div>\n    )\n  }\n}\n\nfunction isIndex(props) {\n  if (props.route.category.level || !misago.get(\"THREADS_ON_INDEX\"))\n    return false\n  if (props.options.title) return false\n\n  return true\n}\n","import { paths } from \"misago/components/threads/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nconst PRIVATE_THREADS_LIST = \"misago:private-threads\"\n\nexport default function initializer(context) {\n  if (context.has(\"THREADS\") && context.has(\"CATEGORIES\")) {\n    mount({\n      paths: paths(context.get(\"user\"), getListOptions(context)),\n    })\n  }\n}\n\nexport function getListOptions(context) {\n  const currentLink = context.get(\"CURRENT_LINK\")\n  if (\n    currentLink.substr(0, PRIVATE_THREADS_LIST.length) === PRIVATE_THREADS_LIST\n  ) {\n    return {\n      api: context.get(\"PRIVATE_THREADS_API\"),\n      startThread: {\n        mode: \"START_PRIVATE\",\n        submit: misago.get(\"PRIVATE_THREADS_API\"),\n      },\n      title: pgettext(\"private threads title\", \"Private threads\"),\n      pageLead: pgettext(\n        \"private threads list\",\n        \"Private threads are threads which only those that started them and those they have invited may see and participate in.\"\n      ),\n      emptyMessage: pgettext(\n        \"private threads list empty\",\n        \"You aren't participating in any private threads.\"\n      ),\n    }\n  }\n\n  return {\n    api: context.get(\"THREADS_API\"),\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:threads\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import { connect } from \"react-redux\"\nimport Route from \"misago/components/threads/route\"\nimport misago from \"misago/index\"\n\nexport function getSelect(options) {\n  return function (store) {\n    return {\n      options: options,\n      selection: store.selection,\n      threads: store.threads,\n      tick: store.tick.tick,\n      user: store.auth.user,\n    }\n  }\n}\n\nexport function getLists(user) {\n  let lists = [\n    {\n      type: \"all\",\n      path: \"\",\n      name: pgettext(\"threads list\", \"All\"),\n      longName: gettext(\"All threads\"),\n    },\n  ]\n\n  if (user.id) {\n    lists.push({\n      type: \"my\",\n      path: \"my/\",\n      name: pgettext(\"threads list\", \"My\"),\n      longName: pgettext(\"threads list\", \"My threads\"),\n    })\n    lists.push({\n      type: \"new\",\n      path: \"new/\",\n      name: pgettext(\"threads list\", \"New\"),\n      longName: pgettext(\"threads list\", \"New threads\"),\n    })\n    lists.push({\n      type: \"unread\",\n      path: \"unread/\",\n      name: pgettext(\"threads list\", \"Unread\"),\n      longName: pgettext(\"threads list\", \"Unread threads\"),\n    })\n    lists.push({\n      type: \"watched\",\n      path: \"watched/\",\n      name: pgettext(\"threads list\", \"Watched\"),\n      longName: pgettext(\"threads list\", \"Watched threads\"),\n    })\n\n    if (user.acl.can_see_unapproved_content_lists) {\n      lists.push({\n        type: \"unapproved\",\n        path: \"unapproved/\",\n        name: pgettext(\"threads list\", \"Unapproved\"),\n        longName: pgettext(\"threads list\", \"Unapproved content\"),\n      })\n    }\n  }\n\n  return lists\n}\n\nexport function paths(user, mode) {\n  let lists = getLists(user)\n  let routes = []\n  let categoriesMap = {}\n\n  misago.get(\"CATEGORIES\").forEach(function (category) {\n    lists.forEach(function (list) {\n      categoriesMap[category.id] = category\n\n      routes.push({\n        path: category.url.index + list.path,\n        component: connect(getSelect(mode))(Route),\n\n        categories: misago.get(\"CATEGORIES\"),\n        categoriesMap,\n        category,\n\n        lists,\n        list,\n      })\n    })\n  })\n\n  return routes\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { UserNavOverlay } from \"../../components/UserNav\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  const root = document.getElementById(\"user-nav-mount\")\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <UserNavOverlay />\n    </Provider>,\n    root\n  )\n}\n\nmisago.addInitializer({\n  name: \"component:user-nav-overlay\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Li from \"misago/components/li\"\n\nconst UsersNav = ({ baseUrl, page, pages }) => (\n  <div className=\"nav-container\">\n    <div className=\"dropdown hidden-sm hidden-md hidden-lg\">\n      <button\n        className=\"btn btn-default btn-block btn-outline dropdown-toggle\"\n        type=\"button\"\n        data-toggle=\"dropdown\"\n        aria-haspopup=\"true\"\n        aria-expanded=\"false\"\n      >\n        <span className=\"material-icon\">menu</span>\n        {page.name}\n      </button>\n      <ul className=\"dropdown-menu stick-to-bottom\">\n        {pages.map((page) => {\n          const url = getPageUrl(baseUrl, page)\n          return (\n            <li key={url}>\n              <Link to={url}>{page.name}</Link>\n            </li>\n          )\n        })}\n      </ul>\n    </div>\n    <ul className=\"nav nav-pills hidden-xs\" role=\"menu\">\n      {pages.map((page) => {\n        const url = getPageUrl(baseUrl, page)\n        return (\n          <Li path={url} key={url}>\n            <Link to={url}>{page.name}</Link>\n          </Li>\n        )\n      })}\n    </ul>\n  </div>\n)\n\nconst getPageUrl = (baseUrl, page) => {\n  let url = baseUrl\n  if (page.component === \"rank\") {\n    url += page.slug\n  } else {\n    url += page.component\n  }\n  return url + \"/\"\n}\n\nexport default UsersNav\n","import React from \"react\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n  getEmptyMessage() {\n    return interpolate(\n      npgettext(\n        \"top posters empty\",\n        \"No users have posted any new messages during last %(days)s day.\",\n        \"No users have posted any new messages during last %(days)s days.\",\n        this.props.trackedPeriod\n      ),\n      { days: this.props.trackedPeriod },\n      true\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"active-posters-list\">\n        <PageContainer>\n          <UsersNav\n            baseUrl={misago.get(\"USERS_LIST_URL\")}\n            page={this.props.page}\n            pages={misago.get(\"USERS_LISTS\")}\n          />\n          <p className=\"lead\">{this.getEmptyMessage()}</p>\n        </PageContainer>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport Avatar from \"misago/components/avatar\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  getClassName() {\n    if (this.props.hiddenOnMobile) {\n      return \"list-group-item hidden-xs hidden-sm\"\n    } else {\n      return \"list-group-item\"\n    }\n  }\n\n  render() {\n    return (\n      <li className={this.getClassName()}>\n        <div className=\"rank-user-avatar\">\n          <span>\n            <Avatar size=\"50\" />\n          </span>\n        </div>\n\n        <div className=\"rank-user\">\n          <div className=\"user-name\">\n            <span className=\"item-title\">\n              <span\n                className=\"ui-preview-text\"\n                style={{ width: random.int(30, 80) + \"px\" }}\n              >\n                &nbsp;\n              </span>\n            </span>\n          </div>\n\n          <div className=\"user-details\">\n            <span className=\"user-status\">\n              <span className=\"status-icon ui-preview-text\">&nbsp;</span>\n              <span\n                className=\"status-label ui-preview-text hidden-xs hidden-sm\"\n                style={{ width: random.int(30, 50) + \"px\" }}\n              >\n                &nbsp;\n              </span>\n            </span>\n            <span className=\"rank-name\">\n              <span\n                className=\"ui-preview-text\"\n                style={{ width: random.int(30, 50) + \"px\" }}\n              >\n                &nbsp;\n              </span>\n            </span>\n            <span className=\"user-title hidden-xs hidden-sm\">\n              <span\n                className=\"ui-preview-text\"\n                style={{ width: random.int(30, 50) + \"px\" }}\n              >\n                &nbsp;\n              </span>\n            </span>\n          </div>\n          <div className=\"user-compact-stats visible-xs-block\">\n            <span className=\"rank-position\">\n              <strong>\n                <span\n                  className=\"ui-preview-text\"\n                  style={{ width: random.int(20, 30) + \"px\" }}\n                >\n                  &nbsp;\n                </span>\n              </strong>\n              <small>{pgettext(\"top posters list item\", \"Rank\")}</small>\n            </span>\n            <span className=\"rank-posts-counted\">\n              <strong>\n                <span\n                  className=\"ui-preview-text\"\n                  style={{ width: random.int(20, 30) + \"px\" }}\n                >\n                  &nbsp;\n                </span>\n              </strong>\n              <small>{pgettext(\"top posters list item\", \"Ranked posts\")}</small>\n            </span>\n          </div>\n        </div>\n\n        <div className=\"rank-position hidden-xs\">\n          <strong>\n            <span\n              className=\"ui-preview-text\"\n              style={{ width: random.int(20, 30) + \"px\" }}\n            >\n              &nbsp;\n            </span>\n          </strong>\n          <small>{pgettext(\"top posters list item\", \"Rank\")}</small>\n        </div>\n\n        <div className=\"rank-posts-counted hidden-xs\">\n          <strong>\n            <span\n              className=\"ui-preview-text\"\n              style={{ width: random.int(20, 30) + \"px\" }}\n            >\n              &nbsp;\n            </span>\n          </strong>\n          <small>{pgettext(\"top posters list item\", \"Ranked posts\")}</small>\n        </div>\n\n        <div className=\"rank-posts-total hidden-xs\">\n          <strong>\n            <span\n              className=\"ui-preview-text\"\n              style={{ width: random.int(20, 30) + \"px\" }}\n            >\n              &nbsp;\n            </span>\n          </strong>\n          <small>{pgettext(\"top posters list item\", \"Total posts\")}</small>\n        </div>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport ItemPreview from \"misago/components/users/active-posters/list-item-preview\"\nimport * as random from \"misago/utils/random\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  render() {\n    return (\n      <div className=\"active-posters-list\">\n        <PageContainer>\n          <UsersNav\n            baseUrl={misago.get(\"USERS_LIST_URL\")}\n            page={this.props.page}\n            pages={misago.get(\"USERS_LISTS\")}\n          />\n          <p className=\"lead ui-preview\">\n            <span\n              className=\"ui-preview-text\"\n              style={{ width: random.int(50, 220) + \"px\" }}\n            >\n              &nbsp;\n            </span>\n          </p>\n\n          <div className=\"active-posters ui-preview\">\n            <ul className=\"list-group\">\n              {[0, 1, 2].map((i) => {\n                return <ItemPreview hiddenOnMobile={i > 0} key={i} />\n              })}\n            </ul>\n          </div>\n        </PageContainer>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { Link } from \"react-router\"\nimport Avatar from \"misago/components/avatar\"\nimport Status, { StatusIcon, StatusLabel } from \"misago/components/user-status\"\nimport misago from \"misago/index\"\nimport * as random from \"misago/utils/random\"\n\nexport default class extends React.Component {\n  getClassName() {\n    if (this.props.rank.css_class) {\n      return \"list-group-item list-group-rank-\" + this.props.rank.css_class\n    } else {\n      return \"list-group-item\"\n    }\n  }\n\n  getUserStatus() {\n    if (this.props.user.status) {\n      return (\n        <Status user={this.props.user} status={this.props.user.status}>\n          <StatusIcon user={this.props.user} status={this.props.user.status} />\n          <StatusLabel\n            user={this.props.user}\n            status={this.props.user.status}\n            className=\"status-label hidden-xs hidden-sm\"\n          />\n        </Status>\n      )\n    }\n\n    return (\n      <span className=\"user-status\">\n        <span className=\"status-icon ui-preview-text\">&nbsp;</span>\n        <span\n          className=\"status-label ui-preview-text hidden-xs hidden-sm\"\n          style={{ width: random.int(30, 50) + \"px\" }}\n        >\n          &nbsp;\n        </span>\n      </span>\n    )\n  }\n\n  getRankName() {\n    if (!this.props.rank.is_tab) {\n      return (\n        <span className=\"rank-name item-title\">{this.props.rank.name}</span>\n      )\n    }\n\n    let rankUrl = misago.get(\"USERS_LIST_URL\") + this.props.rank.slug + \"/\"\n    return (\n      <Link to={rankUrl} className=\"rank-name item-title\">\n        {this.props.rank.name}\n      </Link>\n    )\n  }\n\n  getUserTitle() {\n    if (!this.props.user.title) return null\n\n    return (\n      <span className=\"user-title hidden-xs hidden-sm\">\n        {this.props.user.title}\n      </span>\n    )\n  }\n\n  render() {\n    return (\n      <li className={this.getClassName()}>\n        <div className=\"rank-user-avatar\">\n          <a href={this.props.user.url}>\n            <Avatar user={this.props.user} size={50} size2x={64} />\n          </a>\n        </div>\n\n        <div className=\"rank-user\">\n          <div className=\"user-name\">\n            <a href={this.props.user.url} className=\"item-title\">\n              {this.props.user.username}\n            </a>\n          </div>\n          <div className=\"user-details\">\n            {this.getUserStatus()}\n            {this.getRankName()}\n            {this.getUserTitle()}\n          </div>\n          <div className=\"user-compact-stats visible-xs-block\">\n            <span className=\"rank-position\">\n              <strong>#{this.props.counter}</strong>\n              <small>{pgettext(\"top posters list item\", \"Rank\")}</small>\n            </span>\n\n            <span className=\"rank-posts-counted\">\n              <strong>{this.props.user.meta.score}</strong>\n              <small>{pgettext(\"top posters list item\", \"Ranked posts\")}</small>\n            </span>\n          </div>\n        </div>\n\n        <div className=\"rank-position hidden-xs\">\n          <strong>#{this.props.counter}</strong>\n          <small>{pgettext(\"top posters list item\", \"Rank\")}</small>\n        </div>\n\n        <div className=\"rank-posts-counted hidden-xs\">\n          <strong>{this.props.user.meta.score}</strong>\n          <small>{pgettext(\"top posters list item\", \"Ranked posts\")}</small>\n        </div>\n\n        <div className=\"rank-posts-total hidden-xs\">\n          <strong>{this.props.user.posts}</strong>\n          <small>{pgettext(\"top posters list item\", \"Total posts\")}</small>\n        </div>\n      </li>\n    )\n  }\n}\n","import React from \"react\"\nimport ListItem from \"misago/components/users/active-posters/list-item\"\nimport PageContainer from \"../../PageContainer\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n  getLeadMessage() {\n    let message = npgettext(\n      \"top posters list\",\n      \"%(posters)s top poster from last %(days)s days.\",\n      \"%(posters)s top posters from last %(days)s days.\",\n      this.props.count\n    )\n\n    return interpolate(\n      message,\n      {\n        posters: this.props.count,\n        days: this.props.trackedPeriod,\n      },\n      true\n    )\n  }\n\n  render() {\n    return (\n      <div className=\"active-posters-list\">\n        <PageContainer>\n          <UsersNav\n            baseUrl={misago.get(\"USERS_LIST_URL\")}\n            page={this.props.page}\n            pages={misago.get(\"USERS_LISTS\")}\n          />\n          <p className=\"lead\">{this.getLeadMessage()}</p>\n\n          <div className=\"active-posters ui-ready\">\n            <ul className=\"list-group\">\n              {this.props.users.map((user, i) => {\n                return (\n                  <ListItem\n                    user={user}\n                    rank={user.rank}\n                    counter={i + 1}\n                    key={user.id}\n                  />\n                )\n              })}\n            </ul>\n          </div>\n        </PageContainer>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport ListEmpty from \"misago/components/users/active-posters/list-empty\"\nimport ListPreview from \"misago/components/users/active-posters/list-preview\"\nimport ListReady from \"misago/components/users/active-posters/list-ready\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    if (misago.has(\"USERS\")) {\n      this.initWithPreloadedData(misago.pop(\"USERS\"))\n    } else {\n      this.initWithoutPreloadedData()\n    }\n\n    this.startPolling()\n  }\n\n  initWithPreloadedData(data) {\n    this.state = {\n      isLoaded: true,\n\n      trackedPeriod: data.tracked_period,\n      count: data.count,\n    }\n\n    store.dispatch(hydrate(data.results))\n  }\n\n  initWithoutPreloadedData() {\n    this.state = {\n      isLoaded: false,\n    }\n  }\n\n  startPolling() {\n    polls.start({\n      poll: \"active-posters\",\n      url: misago.get(\"USERS_API\"),\n      data: {\n        list: \"active\",\n      },\n      frequency: 90 * 1000,\n      update: this.update,\n    })\n  }\n\n  update = (data) => {\n    store.dispatch(hydrate(data.results))\n\n    this.setState({\n      isLoaded: true,\n\n      trackedPeriod: data.tracked_period,\n      count: data.count,\n    })\n  }\n\n  componentDidMount() {\n    title.set({\n      title: this.props.route.extra.name,\n      parent: pgettext(\"users page title\", \"Users\"),\n    })\n  }\n\n  componentWillUnmount() {\n    polls.stop(\"active-posters\")\n  }\n\n  render() {\n    const page = { name: this.props.route.extra.name }\n\n    if (this.state.isLoaded) {\n      if (this.state.count > 0) {\n        return (\n          <ListReady\n            page={page}\n            users={this.props.users}\n            trackedPeriod={this.state.trackedPeriod}\n            count={this.state.count}\n          />\n        )\n      } else {\n        return (\n          <ListEmpty page={page} trackedPeriod={this.state.trackedPeriod} />\n        )\n      }\n    } else {\n      return <ListPreview page={page} />\n    }\n  }\n}\n","import React from \"react\"\nimport stringCount from \"misago/utils/string-count\"\n\nexport default class extends React.Component {\n  getClassName() {\n    if (this.props.copy && this.props.copy.length) {\n      if (\n        stringCount(this.props.copy, \"<p\") === 1 &&\n        this.props.copy.indexOf(\"<br\") === -1\n      ) {\n        return \"page-lead lead\"\n      }\n    }\n\n    return \"page-lead\"\n  }\n\n  render() {\n    if (this.props.copy && this.props.copy.length) {\n      return (\n        <div\n          className={this.getClassName()}\n          dangerouslySetInnerHTML={{\n            __html: this.props.copy,\n          }}\n        />\n      )\n    } else {\n      return null\n    }\n  }\n}\n","export default function (string, subString) {\n  string = (string + \"\").toLowerCase()\n  subString = (subString + \"\").toLowerCase()\n\n  if (subString.length <= 0) return 0\n\n  let n = 0\n  let pos = 0\n  let step = subString.length\n\n  while (true) {\n    pos = string.indexOf(subString, pos)\n    if (pos >= 0) {\n      n += 1\n      pos += step\n    } else {\n      break\n    }\n  }\n\n  return n\n}\n","import React from \"react\"\nimport UsersList from \"../../users-list\"\n\nconst RankUsersList = ({ users }) => (\n  <UsersList cols={4} isReady={true} showStatus={true} users={users} />\n)\n\nexport default RankUsersList\n","import React from \"react\"\nimport UsersList from \"misago/components/users-list\"\n\nclass RankUsersListLoader extends React.Component {\n  shouldComponentUpdate() {\n    return false\n  }\n\n  render = () => <UsersList cols={4} isReady={false} />\n}\n\nexport default RankUsersListLoader\n","import React from \"react\"\n\nconst RankUsersLeft = ({ users }) => {\n  if (users.more) {\n    return (\n      <p>\n        {interpolate(\n          npgettext(\n            \"rank users list\",\n            \"There is %(more)s more user with this rank.\",\n            \"There are %(more)s more users with this rank.\",\n            users.more\n          ),\n          { more: users.more },\n          true\n        )}\n      </p>\n    )\n  }\n\n  return (\n    <p>\n      {pgettext(\n        \"rank users list empty\",\n        \"There are no more users with this rank.\"\n      )}\n    </p>\n  )\n}\n\nexport default RankUsersLeft\n","import React from \"react\"\nimport { Link } from \"react-router\"\n\nconst RankUsersPagination = ({ baseUrl, users }) => (\n  <div className=\"misago-pagination\">\n    {users.isLoaded && users.first ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl}\n        title={pgettext(\"rank users list paginator\", \"Go to first page\")}\n      >\n        <span className=\"material-icon\">first_page</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"rank users list paginator\", \"Go to first page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">first_page</span>\n      </button>\n    )}\n    {users.isLoaded && users.previous ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + (users.previous > 1 ? users.previous + \"/\" : \"\")}\n        title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n      >\n        <span className=\"material-icon\">chevron_left</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"rank users list paginator\", \"Go to previous page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">chevron_left</span>\n      </button>\n    )}\n    {users.isLoaded && users.next ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + users.next + \"/\"}\n        title={pgettext(\"rank users list paginator\", \"Go to next page\")}\n      >\n        <span className=\"material-icon\">chevron_right</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"rank users list paginator\", \"Go to next page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">chevron_right</span>\n      </button>\n    )}\n    {users.isLoaded && users.last ? (\n      <Link\n        className=\"btn btn-default btn-outline btn-icon\"\n        to={baseUrl + users.last + \"/\"}\n        title={pgettext(\"rank users list paginator\", \"Go to last page\")}\n      >\n        <span className=\"material-icon\">last_page</span>\n      </Link>\n    ) : (\n      <button\n        className=\"btn btn-default btn-outline btn-icon\"\n        title={pgettext(\"rank users list paginator\", \"Go to last page\")}\n        type=\"button\"\n        disabled\n      >\n        <span className=\"material-icon\">last_page</span>\n      </button>\n    )}\n  </div>\n)\n\nexport default RankUsersPagination\n","import React from \"react\"\nimport { Toolbar, ToolbarItem, ToolbarSection } from \"../../Toolbar\"\nimport RankUsersLeft from \"./RankUsersLeft\"\nimport RankUsersPagination from \"./RankUsersPagination\"\n\nconst RankUsersToolbar = ({ baseUrl, users }) => (\n  <Toolbar>\n    <ToolbarSection>\n      <ToolbarItem>\n        <RankUsersPagination baseUrl={baseUrl} users={users} />\n      </ToolbarItem>\n    </ToolbarSection>\n    <ToolbarSection auto>\n      <ToolbarItem>\n        <RankUsersLeft users={users} />\n      </ToolbarItem>\n    </ToolbarSection>\n  </Toolbar>\n)\n\nexport default RankUsersToolbar\n","import React from \"react\"\nimport PageLead from \"misago/components/page-lead\"\nimport misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/users\"\nimport polls from \"misago/services/polls\"\nimport store from \"misago/services/store\"\nimport title from \"misago/services/page-title\"\nimport PageContainer from \"../../PageContainer\"\nimport RankUsersList from \"./RankUsersList\"\nimport RankUsersListLoader from \"./RankUsersListLoader\"\nimport RankUsersToolbar from \"./RankUsersToolbar\"\nimport UsersNav from \"../UsersNav\"\n\nexport default class extends React.Component {\n  constructor(props) {\n    super(props)\n\n    if (misago.has(\"USERS\")) {\n      this.initWithPreloadedData(misago.pop(\"USERS\"))\n    } else {\n      this.initWithoutPreloadedData()\n    }\n\n    this.startPolling(props.params.page || 1)\n  }\n\n  initWithPreloadedData(data) {\n    this.state = Object.assign(data, {\n      isLoaded: true,\n    })\n    store.dispatch(hydrate(data.results))\n  }\n\n  initWithoutPreloadedData() {\n    this.state = {\n      isLoaded: false,\n    }\n  }\n\n  startPolling(page) {\n    polls.start({\n      poll: \"rank-users\",\n      url: misago.get(\"USERS_API\"),\n      data: {\n        rank: this.props.route.rank.id,\n        page: page,\n      },\n      frequency: 90 * 1000,\n      update: this.update,\n    })\n  }\n\n  update = (data) => {\n    store.dispatch(hydrate(data.results))\n\n    data.isLoaded = true\n    this.setState(data)\n  }\n\n  componentDidMount() {\n    title.set({\n      title: this.props.route.rank.name,\n      page: this.props.params.page || null,\n      parent: pgettext(\"users page title\", \"Users\"),\n    })\n  }\n\n  componentWillUnmount() {\n    polls.stop(\"rank-users\")\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.params.page !== nextProps.params.page) {\n      title.set({\n        title: this.props.route.rank.name,\n        page: nextProps.params.page || null,\n        parent: pgettext(\"users page title\", \"Users\"),\n      })\n\n      this.setState({\n        isLoaded: false,\n      })\n\n      polls.stop(\"rank-users\")\n      this.startPolling(nextProps.params.page)\n    }\n  }\n\n  getClassName() {\n    if (this.props.route.rank.css_class) {\n      return \"rank-users-list rank-users-\" + this.props.route.rank.css_class\n    } else {\n      return \"rank-users-list\"\n    }\n  }\n\n  getRankDescription() {\n    if (this.props.route.rank.description) {\n      return (\n        <div className=\"rank-description\">\n          <PageLead copy={this.props.route.rank.description.html} />\n        </div>\n      )\n    } else {\n      return null\n    }\n  }\n\n  getComponent() {\n    if (this.state.isLoaded) {\n      if (this.state.count > 0) {\n        return <RankUsersList users={this.props.users} />\n      } else {\n        return (\n          <p className=\"lead\">\n            {pgettext(\n              \"rank users list\",\n              \"There are no users with this rank at the moment.\"\n            )}\n          </p>\n        )\n      }\n    } else {\n      return <RankUsersListLoader />\n    }\n  }\n\n  render() {\n    return (\n      <div className={this.getClassName()}>\n        <PageContainer>\n          <UsersNav\n            baseUrl={misago.get(\"USERS_LIST_URL\")}\n            page={{ name: this.props.route.rank.name }}\n            pages={misago.get(\"USERS_LISTS\")}\n          />\n          {this.getRankDescription()}\n          {this.getComponent()}\n          <RankUsersToolbar\n            baseUrl={\n              misago.get(\"USERS_LIST_URL\") + this.props.route.rank.slug + \"/\"\n            }\n            users={this.state}\n          />\n        </PageContainer>\n      </div>\n    )\n  }\n}\n","import React from \"react\"\nimport { connect } from \"react-redux\"\nimport ActivePosters from \"misago/components/users/active-posters/root\"\nimport Rank from \"misago/components/users/rank/root\"\nimport WithDropdown from \"misago/components/with-dropdown\"\nimport misago from \"misago/index\"\nimport {\n  PageHeader,\n  PageHeaderBanner,\n  PageHeaderContainer,\n} from \"../PageHeader\"\n\nexport default class extends WithDropdown {\n  render() {\n    return (\n      <div className=\"page page-users-lists\">\n        <PageHeaderContainer>\n          <PageHeader styleName=\"users-lists\">\n            <PageHeaderBanner styleName=\"users-lists\">\n              <h1>{pgettext(\"users page title\", \"Users\")}</h1>\n            </PageHeaderBanner>\n          </PageHeader>\n        </PageHeaderContainer>\n        {this.props.children}\n      </div>\n    )\n  }\n}\n\nexport function select(store) {\n  return {\n    tick: store.tick.tick,\n    user: store.auth.user,\n    users: store.users,\n  }\n}\n\nexport function paths() {\n  let paths = []\n\n  misago.get(\"USERS_LISTS\").forEach(function (item) {\n    if (item.component === \"rank\") {\n      paths.push({\n        path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/:page/\",\n        component: connect(select)(Rank),\n        rank: item,\n      })\n      paths.push({\n        path: misago.get(\"USERS_LIST_URL\") + item.slug + \"/\",\n        component: connect(select)(Rank),\n        rank: item,\n      })\n    } else if (item.component === \"active-posters\") {\n      paths.push({\n        path: misago.get(\"USERS_LIST_URL\") + item.component + \"/\",\n        component: connect(select)(ActivePosters),\n        extra: {\n          name: item.name,\n        },\n      })\n    }\n  })\n\n  return paths\n}\n","import Users, { paths } from \"misago/components/users/root\"\nimport misago from \"misago/index\"\nimport mount from \"misago/utils/routed-component\"\n\nexport default function initializer(context) {\n  if (context.has(\"USERS_LISTS\")) {\n    mount({\n      root: misago.get(\"USERS_LIST_URL\"),\n      component: Users,\n      paths: paths(),\n    })\n  }\n}\n\nmisago.addInitializer({\n  name: \"component:users\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\n\nexport default function initializer(context) {\n  include.init(context.get(\"STATIC_URL\"))\n}\n\nmisago.addInitializer({\n  name: \"include\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport storage from \"misago/services/local-storage\"\n\nexport default function initializer() {\n  storage.init(\"misago_\")\n}\n\nmisago.addInitializer({\n  name: \"local-storage\",\n  initializer: initializer,\n})\n","import mount from \"misago/utils/mount-component\"\n\nexport class MobileNavbarDropdown {\n  init(element) {\n    this._element = element\n    this._component = null\n  }\n\n  show(component) {\n    if (this._component === component) {\n      this.hide()\n    } else {\n      this._component = component\n      mount(component, this._element.id)\n      $(this._element).addClass(\"open\")\n    }\n  }\n\n  showConnected(name, component) {\n    if (this._component === name) {\n      this.hide()\n    } else {\n      this._component = name\n      mount(component, this._element.id, true)\n      $(this._element).addClass(\"open\")\n    }\n  }\n\n  hide() {\n    $(this._element).removeClass(\"open\")\n    this._component = null\n  }\n}\n\nexport default new MobileNavbarDropdown()\n","import misago from \"misago/index\"\nimport dropdown from \"misago/services/mobile-navbar-dropdown\"\n\nexport default function initializer() {\n  let element = document.getElementById(\"mobile-navbar-dropdown-mount\")\n  if (element) {\n    dropdown.init(element)\n  }\n}\n\nmisago.addInitializer({\n  name: \"dropdown\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport modal from \"misago/services/modal\"\n\nexport default function initializer() {\n  let element = document.getElementById(\"modal-mount\")\n  if (element) {\n    modal.init(element)\n  }\n}\n\nmisago.addInitializer({\n  name: \"modal\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import moment from \"moment\"\nimport misago from \"misago/index\"\n\nexport default function initializer() {\n  moment.locale($(\"html\").attr(\"lang\"))\n}\n\nmisago.addInitializer({\n  name: \"moment\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport title from \"misago/services/page-title\"\n\nexport default function initializer(context) {\n  title.init(\n    context.get(\"SETTINGS\").forum_index_title,\n    context.get(\"SETTINGS\").forum_name\n  )\n}\n\nmisago.addInitializer({\n  name: \"page-title\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport snackbar from \"misago/services/snackbar\"\nimport polls from \"misago/services/polls\"\n\nexport default function initializer() {\n  polls.init(ajax, snackbar)\n}\n\nmisago.addInitializer({\n  name: \"polls\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport ajax from \"misago/services/ajax\"\nimport posting from \"misago/services/posting\"\nimport snackbar from \"misago/services/snackbar\"\n\nexport default function initializer() {\n  posting.init(ajax, snackbar, document.getElementById(\"posting-mount\"))\n}\n\nmisago.addInitializer({\n  name: \"posting\",\n  initializer: initializer,\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/auth\"\nimport store from \"misago/services/store\"\n\nexport default function initializer(context) {\n  store.addReducer(\n    \"auth\",\n    reducer,\n    Object.assign(\n      {\n        isAuthenticated: context.get(\"isAuthenticated\"),\n        isAnonymous: !context.get(\"isAuthenticated\"),\n\n        user: context.get(\"user\"),\n      },\n      initialState\n    )\n  )\n}\n\nmisago.addInitializer({\n  name: \"reducer:auth\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"../../reducers/overlay\"\nimport store from \"../../services/store\"\n\nexport default function initializer(context) {\n  store.addReducer(\"overlay\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:overlay\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/participants\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  let initialState = null\n  if (misago.has(\"THREAD\")) {\n    initialState = misago.get(\"THREAD\").participants\n  }\n\n  store.addReducer(\"participants\", reducer, initialState || [])\n}\n\nmisago.addInitializer({\n  name: \"reducer:participants\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/poll\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  let initialState = null\n  if (misago.has(\"THREAD\") && misago.get(\"THREAD\").poll) {\n    initialState = hydrate(misago.get(\"THREAD\").poll)\n  } else {\n    initialState = {}\n  }\n\n  store.addReducer(\"poll\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:poll\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/posts\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  let initialState = null\n  if (misago.has(\"POSTS\")) {\n    initialState = hydrate(misago.get(\"POSTS\"))\n  } else {\n    initialState = {\n      isLoaded: false,\n      isBusy: false,\n    }\n  }\n\n  store.addReducer(\"posts\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:posts\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile-details\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  let initialState = null\n  if (misago.has(\"PROFILE_DETAILS\")) {\n    initialState = misago.get(\"PROFILE_DETAILS\")\n  }\n\n  store.addReducer(\"profile-details\", reducer, initialState || {})\n}\n\nmisago.addInitializer({\n  name: \"reducer:profile-details\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport { hydrate } from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  if (misago.has(\"PROFILE\")) {\n    store.dispatch(hydrate(misago.get(\"PROFILE\")))\n  }\n}\n\nmisago.addInitializer({\n  name: \"reducer:profile-hydrate\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/profile\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"profile\", reducer, {})\n}\n\nmisago.addInitializer({\n  name: \"reducer:profile\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago\"\nimport reducer, { initialState } from \"misago/reducers/search\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\n    \"search\",\n    reducer,\n    Object.assign({}, initialState, {\n      providers: misago.get(\"SEARCH_PROVIDERS\") || [],\n      query: misago.get(\"SEARCH_QUERY\") || \"\",\n    })\n  )\n}\n\nmisago.addInitializer({\n  name: \"reducer:search\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/selection\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"selection\", reducer, [])\n}\n\nmisago.addInitializer({\n  name: \"reducer:selection\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"snackbar\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:snackbar\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { hydrate } from \"misago/reducers/thread\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  let initialState = null\n  if (misago.has(\"THREAD\")) {\n    initialState = hydrate(misago.get(\"THREAD\"))\n  } else {\n    initialState = {\n      isBusy: false,\n    }\n  }\n\n  store.addReducer(\"thread\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:thread\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/threads\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"threads\", reducer, [])\n}\n\nmisago.addInitializer({\n  name: \"reducer:threads\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer, { initialState } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"tick\", reducer, initialState)\n}\n\nmisago.addInitializer({\n  name: \"reducer:tick\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/username-history\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"username-history\", reducer, [])\n}\n\nmisago.addInitializer({\n  name: \"reducer:username-history\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport reducer from \"misago/reducers/users\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.addReducer(\"users\", reducer, [])\n}\n\nmisago.addInitializer({\n  name: \"reducer:users\",\n  initializer: initializer,\n  before: \"store\",\n})\n","import misago from \"misago/index\"\nimport snackbar from \"misago/services/snackbar\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  snackbar.init(store)\n}\n\nmisago.addInitializer({\n  name: \"snackbar\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nexport default function initializer() {\n  store.init()\n}\n\nmisago.addInitializer({\n  name: \"store\",\n  initializer: initializer,\n  before: \"_end\",\n})\n","import misago from \"misago/index\"\nimport { doTick } from \"misago/reducers/tick\"\nimport store from \"misago/services/store\"\n\nconst TICK_PERIOD = 50 * 1000 //do the tick every 50s\n\nexport default function initializer() {\n  window.setInterval(function () {\n    store.dispatch(doTick())\n  }, TICK_PERIOD)\n}\n\nmisago.addInitializer({\n  name: \"tick-start\",\n  initializer: initializer,\n  after: \"store\",\n})\n","import misago from \"misago/index\"\nimport include from \"misago/services/include\"\nimport zxcvbn from \"misago/services/zxcvbn\"\n\nexport default function initializer() {\n  zxcvbn.init(include)\n}\n\nmisago.addInitializer({\n  name: \"zxcvbn\",\n  initializer: initializer,\n})\n","import { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\n\nexport var initialState = {\n  signedIn: false,\n  signedOut: false,\n}\n\nexport const UPDATE_AUTHENTICATED_USER = \"UPDATE_AUTHENTICATED_USER\"\nexport const PATCH_USER = \"PATCH_USER\"\nexport const SIGN_IN = \"SIGN_IN\"\nexport const SIGN_OUT = \"SIGN_OUT\"\n\nexport function updateAuthenticatedUser(data) {\n  return {\n    type: UPDATE_AUTHENTICATED_USER,\n    data,\n  }\n}\n\nexport function patch(patch) {\n  return {\n    type: PATCH_USER,\n    patch,\n  }\n}\n\nexport function signIn(user) {\n  return {\n    type: SIGN_IN,\n    user,\n  }\n}\n\nexport function signOut(soft = false) {\n  return {\n    type: SIGN_OUT,\n    soft,\n  }\n}\n\nexport default function auth(state = initialState, action = null) {\n  switch (action.type) {\n    case PATCH_USER:\n      let newState = Object.assign({}, state)\n      newState.user = Object.assign({}, state.user, action.patch)\n      return newState\n\n    case UPDATE_AUTHENTICATED_USER:\n      let updatedState = Object.assign({}, state)\n      updatedState.user = Object.assign({}, state.user, action.data)\n      return updatedState\n\n    case SIGN_IN:\n      return Object.assign({}, state, {\n        signedIn: action.user,\n      })\n\n    case SIGN_OUT:\n      return Object.assign({}, state, {\n        isAuthenticated: false,\n        isAnonymous: true,\n        signedOut: !action.soft,\n      })\n\n    case UPDATE_AVATAR:\n      if (state.isAuthenticated && state.user.id === action.userId) {\n        let newState = Object.assign({}, state)\n        newState.user = Object.assign({}, state.user, {\n          avatars: action.avatars,\n        })\n        return newState\n      }\n      return state\n\n    case UPDATE_USERNAME:\n      if (state.isAuthenticated && state.user.id === action.userId) {\n        let newState = Object.assign({}, state)\n        newState.user = Object.assign({}, state.user, {\n          username: action.username,\n          slug: action.slug,\n        })\n        return newState\n      }\n      return state\n\n    default:\n      return state\n  }\n}\n","export const OPEN_SITE_NAV = \"OPEN_SITE_NAV\"\nexport const OPEN_SEARCH = \"OPEN_SEARCH\"\nexport const OPEN_NOTIFICATIONS = \"OPEN_NOTIFICATIONS\"\nexport const OPEN_PRIVATE_THREADS = \"OPEN_PRIVATE_THREADS\"\nexport const OPEN_USER_NAV = \"OPEN_USER_NAV\"\nexport const CLOSE = \"CLOSE_OVERLAYS\"\n\nexport function openSiteNav() {\n  return { type: OPEN_SITE_NAV }\n}\n\nexport function openSearch() {\n  return { type: OPEN_SEARCH }\n}\n\nexport function openNotifications() {\n  return { type: OPEN_NOTIFICATIONS }\n}\n\nexport function openPrivateThreads() {\n  return { type: OPEN_PRIVATE_THREADS }\n}\n\nexport function openUserNav() {\n  return { type: OPEN_USER_NAV }\n}\n\nexport function close() {\n  return { type: CLOSE }\n}\n\nexport const initialState = {\n  siteNav: false,\n  search: false,\n  notifications: false,\n  privateThreads: false,\n  userNav: false,\n}\n\nexport default function notifications(state = initialState, action = null) {\n  switch (action.type) {\n    case OPEN_SITE_NAV:\n      return Object.assign({}, state, initialState, { siteNav: true })\n\n    case OPEN_SEARCH:\n      return Object.assign({}, state, initialState, { search: true })\n\n    case OPEN_NOTIFICATIONS:\n      return Object.assign({}, state, initialState, { notifications: true })\n\n    case OPEN_PRIVATE_THREADS:\n      return Object.assign({}, state, initialState, { privateThreads: true })\n\n    case OPEN_USER_NAV:\n      return Object.assign({}, state, initialState, { userNav: true })\n\n    case CLOSE:\n      return Object.assign({}, state, initialState)\n\n    default:\n      return state\n  }\n}\n","export const REPLACE_PARTICIPANTS = \"REPLACE_PARTICIPANTS\"\n\nexport function replace(newState) {\n  return {\n    type: REPLACE_PARTICIPANTS,\n    state: newState,\n  }\n}\n\nexport default function participants(state = [], action = null) {\n  switch (action.type) {\n    case REPLACE_PARTICIPANTS:\n      return action.state\n\n    default:\n      return state\n  }\n}\n","import moment from \"moment\"\n\nexport const BUSY_POLL = \"BUSY_POLL\"\nexport const RELEASE_POLL = \"RELEASE_POLL\"\nexport const REMOVE_POLL = \"REMOVE_POLL\"\nexport const REPLACE_POLL = \"REPLACE_POLL\"\nexport const UPDATE_POLL = \"UPDATE_POLL\"\n\nexport function hydrate(json) {\n  let hasSelectedChoices = false\n  for (const i in json.choices) {\n    const choice = json.choices[i]\n    if (choice.selected) {\n      hasSelectedChoices = true\n      break\n    }\n  }\n\n  return Object.assign({}, json, {\n    posted_on: moment(json.posted_on),\n\n    hasSelectedChoices,\n    endsOn: json.length\n      ? moment(json.posted_on).add(json.length, \"days\")\n      : null,\n\n    isBusy: false,\n  })\n}\n\nexport function busy() {\n  return {\n    type: BUSY_POLL,\n  }\n}\n\nexport function release() {\n  return {\n    type: RELEASE_POLL,\n  }\n}\n\nexport function replace(newState, hydrated = false) {\n  return {\n    type: REPLACE_POLL,\n    state: hydrated ? newState : hydrate(newState),\n  }\n}\n\nexport function update(data) {\n  return {\n    type: UPDATE_POLL,\n    data,\n  }\n}\n\nexport function remove() {\n  return {\n    type: REMOVE_POLL,\n  }\n}\n\nexport default function poll(state = {}, action = null) {\n  switch (action.type) {\n    case BUSY_POLL:\n      return Object.assign({}, state, { isBusy: true })\n\n    case RELEASE_POLL:\n      return Object.assign({}, state, { isBusy: false })\n\n    case REMOVE_POLL:\n      return {\n        isBusy: false,\n      }\n\n    case REPLACE_POLL:\n      return action.state\n\n    case UPDATE_POLL:\n      return Object.assign({}, state, action.data)\n\n    default:\n      return state\n  }\n}\n","import moment from \"moment\"\nimport { hydrateUser } from \"./users\"\n\nexport const PATCH_POST = \"PATCH_POST\"\n\nexport function hydrate(json) {\n  return Object.assign({}, json, {\n    posted_on: moment(json.posted_on),\n    updated_on: moment(json.updated_on),\n    hidden_on: moment(json.hidden_on),\n\n    attachments: json.attachments\n      ? json.attachments.map(hydrateAttachment)\n      : null,\n    poster: json.poster ? hydrateUser(json.poster) : null,\n\n    isSelected: false,\n    isBusy: false,\n    isDeleted: false,\n  })\n}\n\nexport function hydrateAttachment(json) {\n  return Object.assign({}, json, {\n    uploaded_on: moment(json.uploaded_on),\n  })\n}\n\nexport function patch(post, patch) {\n  return {\n    type: PATCH_POST,\n    post,\n    patch,\n  }\n}\n\nexport default function post(state = {}, action = null) {\n  switch (action.type) {\n    case PATCH_POST:\n      if (state.id == action.post.id) {\n        return Object.assign({}, state, action.patch)\n      }\n      return state\n\n    default:\n      return state\n  }\n}\n","import postReducer, {\n  PATCH_POST,\n  hydrate as hydratePost,\n} from \"misago/reducers/post\"\n\nexport const APPEND_POSTS = \"APPEND_POSTS\"\nexport const SELECT_POST = \"SELECT_POST\"\nexport const DESELECT_POST = \"DESELECT_POST\"\nexport const DESELECT_POSTS = \"DESELECT_POSTS\"\nexport const LOAD_POSTS = \"LOAD_POSTS\"\nexport const UNLOAD_POSTS = \"UNLOAD_POSTS\"\nexport const UPDATE_POSTS = \"UPDATE_POSTS\"\n\nexport function select(post) {\n  return {\n    type: SELECT_POST,\n    post,\n  }\n}\n\nexport function deselect(post) {\n  return {\n    type: DESELECT_POST,\n    post,\n  }\n}\n\nexport function deselectAll() {\n  return {\n    type: DESELECT_POSTS,\n  }\n}\n\nexport function hydrate(json) {\n  return Object.assign({}, json, {\n    results: json.results.map(hydratePost),\n    isLoaded: true,\n    isBusy: false,\n    isSelected: false,\n  })\n}\n\nexport function load(newState, hydrated = false) {\n  return {\n    type: LOAD_POSTS,\n    state: hydrated ? newState : hydrate(newState),\n  }\n}\n\nexport function append(newState, hydrated = false) {\n  return {\n    type: APPEND_POSTS,\n    state: hydrated ? newState : hydrate(newState),\n  }\n}\n\nexport function unload() {\n  return {\n    type: UNLOAD_POSTS,\n  }\n}\n\nexport function update(newState) {\n  return {\n    type: UPDATE_POSTS,\n    update: newState,\n  }\n}\n\nexport default function posts(state = {}, action = null) {\n  switch (action.type) {\n    case SELECT_POST:\n      const selectedPosts = state.results.map((post) => {\n        if (post.id == action.post.id) {\n          return Object.assign({}, post, {\n            isSelected: true,\n          })\n        } else {\n          return post\n        }\n      })\n\n      return Object.assign({}, state, {\n        results: selectedPosts,\n      })\n\n    case DESELECT_POST:\n      const deseletedPosts = state.results.map((post) => {\n        if (post.id == action.post.id) {\n          return Object.assign({}, post, {\n            isSelected: false,\n          })\n        } else {\n          return post\n        }\n      })\n\n      return Object.assign({}, state, {\n        results: deseletedPosts,\n      })\n\n    case DESELECT_POSTS:\n      const deseletedAllPosts = state.results.map((post) => {\n        return Object.assign({}, post, {\n          isSelected: false,\n        })\n      })\n\n      return Object.assign({}, state, {\n        results: deseletedAllPosts,\n      })\n\n    case APPEND_POSTS:\n      let results = state.results.slice()\n      const resultsIds = state.results.map((post) => {\n        return post.id\n      })\n\n      action.state.results.map((post) => {\n        if (resultsIds.indexOf(post.id) === -1) {\n          results.push(post)\n        }\n      })\n\n      return Object.assign({}, action.state, {\n        results,\n      })\n\n    case LOAD_POSTS:\n      return action.state\n\n    case UNLOAD_POSTS:\n      return Object.assign({}, state, {\n        isLoaded: false,\n      })\n\n    case UPDATE_POSTS:\n      return Object.assign({}, state, action.update)\n\n    case PATCH_POST:\n      const reducedPosts = state.results.map((post) => {\n        return postReducer(post, action)\n      })\n\n      return Object.assign({}, state, {\n        results: reducedPosts,\n      })\n\n    default:\n      return state\n  }\n}\n","export const LOAD_DETAILS = \"LOAD_DETAILS\"\n\nexport function load(newState) {\n  return {\n    type: LOAD_DETAILS,\n\n    newState,\n  }\n}\n\nexport default function details(state = {}, action = null) {\n  switch (action.type) {\n    case LOAD_DETAILS:\n      return action.newState\n\n    default:\n      return state\n  }\n}\n","import moment from \"moment\"\nimport {\n  UPDATE_AVATAR,\n  UPDATE_USERNAME,\n  hydrateStatus,\n} from \"misago/reducers/users\"\n\nexport const HYDRATE_PROFILE = \"HYDRATE_PROFILE\"\nexport const PATCH_PROFILE = \"PATCH_PROFILE\"\n\nexport function hydrate(profile) {\n  return {\n    type: HYDRATE_PROFILE,\n    profile,\n  }\n}\n\nexport function patch(patch) {\n  return {\n    type: PATCH_PROFILE,\n    patch,\n  }\n}\n\nexport default function auth(state = {}, action = null) {\n  switch (action.type) {\n    case HYDRATE_PROFILE:\n      return Object.assign({}, action.profile, {\n        joined_on: moment(action.profile.joined_on),\n        status: hydrateStatus(action.profile.status),\n      })\n\n    case PATCH_PROFILE:\n      return Object.assign({}, state, action.patch)\n\n    case UPDATE_AVATAR:\n      if (state.id === action.userId) {\n        return Object.assign({}, state, {\n          avatars: action.avatars,\n        })\n      }\n      return state\n\n    case UPDATE_USERNAME:\n      if (state.id === action.userId) {\n        return Object.assign({}, state, {\n          username: action.username,\n          slug: action.slug,\n        })\n      }\n      return state\n\n    default:\n      return state\n  }\n}\n","export const REPLACE_SEARCH = \"REPLACE_SEARCH\"\nexport const UPDATE_SEARCH = \"UPDATE_SEARCH\"\nexport const UPDATE_SEARCH_PROVIDER = \"UPDATE_SEARCH_PROVIDER\"\n\nexport const initialState = {\n  isLoading: false,\n  query: \"\",\n  providers: [],\n}\n\nexport function replace(newState) {\n  return {\n    type: REPLACE_SEARCH,\n    state: {\n      isLoading: false,\n      providers: newState,\n    },\n  }\n}\n\nexport function update(newState) {\n  return {\n    type: UPDATE_SEARCH,\n    update: newState,\n  }\n}\n\nexport function updateProvider(provider) {\n  return {\n    type: UPDATE_SEARCH_PROVIDER,\n    provider: provider,\n  }\n}\n\nexport default function participants(state = {}, action = null) {\n  switch (action.type) {\n    case REPLACE_SEARCH:\n      return action.state\n\n    case UPDATE_SEARCH:\n      return Object.assign({}, state, action.update)\n\n    case UPDATE_SEARCH_PROVIDER:\n      return Object.assign({}, state, {\n        providers: state.providers.map((provider) => {\n          if (provider.id === action.provider.id) {\n            return action.provider\n          } else {\n            return provider\n          }\n        }),\n      })\n\n    default:\n      return state\n  }\n}\n","import { toggle } from \"misago/utils/sets\"\n\nexport const SELECT_ALL = \"SELECT_ALL\"\nexport const SELECT_NONE = \"SELECT_NONE\"\nexport const SELECT_ITEM = \"SELECT_ITEM\"\n\nexport function all(itemsIds) {\n  return {\n    type: SELECT_ALL,\n    items: itemsIds,\n  }\n}\n\nexport function none() {\n  return {\n    type: SELECT_NONE,\n  }\n}\n\nexport function item(itemId) {\n  return {\n    type: SELECT_ITEM,\n    item: itemId,\n  }\n}\n\nexport default function selection(state = [], action = null) {\n  switch (action.type) {\n    case SELECT_ALL:\n      return action.items\n\n    case SELECT_NONE:\n      return []\n\n    case SELECT_ITEM:\n      return toggle(state, action.item)\n\n    default:\n      return state\n  }\n}\n","export var initialState = {\n  type: \"info\",\n  message: \"\",\n  isVisible: false,\n}\n\nexport const SHOW_SNACKBAR = \"SHOW_SNACKBAR\"\nexport const HIDE_SNACKBAR = \"HIDE_SNACKBAR\"\n\nexport function showSnackbar(message, type) {\n  return {\n    type: SHOW_SNACKBAR,\n    message,\n    messageType: type,\n  }\n}\n\nexport function hideSnackbar() {\n  return {\n    type: HIDE_SNACKBAR,\n  }\n}\n\nexport default function snackbar(state = initialState, action = null) {\n  if (action.type === SHOW_SNACKBAR) {\n    return {\n      type: action.messageType,\n      message: action.message,\n      isVisible: true,\n    }\n  } else if (action.type === HIDE_SNACKBAR) {\n    return Object.assign({}, state, {\n      isVisible: false,\n    })\n  } else {\n    return state\n  }\n}\n","import moment from \"moment\"\nimport { REMOVE_POLL, REPLACE_POLL } from \"./poll\"\n\nexport const BUSY_THREAD = \"BUSY_THREAD\"\nexport const RELEASE_THREAD = \"RELEASE_THREAD\"\nexport const REPLACE_THREAD = \"REPLACE_THREAD\"\nexport const UPDATE_THREAD = \"UPDATE_THREAD\"\nexport const UPDATE_THREAD_ACL = \"UPDATE_THREAD_ACL\"\n\nexport function hydrate(json) {\n  return Object.assign({}, json, {\n    started_on: moment(json.started_on),\n    last_post_on: moment(json.last_post_on),\n    best_answer_marked_on: json.best_answer_marked_on\n      ? moment(json.best_answer_marked_on)\n      : null,\n\n    isBusy: false,\n  })\n}\n\nexport function busy() {\n  return {\n    type: BUSY_THREAD,\n  }\n}\n\nexport function release() {\n  return {\n    type: RELEASE_THREAD,\n  }\n}\n\nexport function replace(newState, hydrated = false) {\n  return {\n    type: REPLACE_THREAD,\n    state: hydrated ? newState : hydrate(newState),\n  }\n}\n\nexport function update(data) {\n  return {\n    type: UPDATE_THREAD,\n    data,\n  }\n}\n\nexport function updateAcl(data) {\n  return {\n    type: UPDATE_THREAD_ACL,\n    data,\n  }\n}\n\nexport default function thread(state = {}, action = null) {\n  switch (action.type) {\n    case BUSY_THREAD:\n      return Object.assign({}, state, { isBusy: true })\n\n    case RELEASE_THREAD:\n      return Object.assign({}, state, { isBusy: false })\n\n    case REMOVE_POLL:\n      return Object.assign({}, state, { poll: null })\n\n    case REPLACE_POLL:\n      return Object.assign({}, state, { poll: action.state })\n\n    case REPLACE_THREAD:\n      return action.state\n\n    case UPDATE_THREAD:\n      return Object.assign({}, state, action.data)\n\n    case UPDATE_THREAD_ACL:\n      const acl = Object.assign({}, state.acl, action.data)\n      return Object.assign({}, state, { acl })\n\n    default:\n      return state\n  }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_THREADS = \"APPEND_THREADS\"\nexport const DELETE_THREAD = \"DELETE_THREAD\"\nexport const FILTER_THREADS = \"FILTER_THREADS\"\nexport const HYDRATE_THREADS = \"HYDRATE_THREADS\"\nexport const PATCH_THREAD = \"PATCH_THREAD\"\nexport const SORT_THREADS = \"SORT_THREADS\"\n\nexport const MODERATION_PERMISSIONS = [\n  \"can_announce\",\n  \"can_approve\",\n  \"can_close\",\n  \"can_hide\",\n  \"can_move\",\n  \"can_merge\",\n  \"can_pin\",\n  \"can_review\",\n]\n\nexport function append(items, sorting) {\n  return {\n    type: APPEND_THREADS,\n    items,\n    sorting,\n  }\n}\n\nexport function deleteThread(thread) {\n  return {\n    type: DELETE_THREAD,\n    thread,\n  }\n}\n\nexport function filterThreads(category, categoriesMap) {\n  return {\n    type: FILTER_THREADS,\n    category,\n    categoriesMap,\n  }\n}\n\nexport function hydrate(items) {\n  return {\n    type: HYDRATE_THREADS,\n    items,\n  }\n}\n\nexport function patch(thread, patch, sorting = null) {\n  return {\n    type: PATCH_THREAD,\n    thread,\n    patch,\n    sorting,\n  }\n}\n\nexport function sort(sorting) {\n  return {\n    type: SORT_THREADS,\n    sorting,\n  }\n}\n\nexport function getThreadModerationOptions(thread_acl) {\n  let options = []\n  MODERATION_PERMISSIONS.forEach(function (perm) {\n    if (thread_acl[perm]) {\n      options.push(perm)\n    }\n  })\n  return options\n}\n\nexport function hydrateThread(thread) {\n  return Object.assign({}, thread, {\n    moderation: getThreadModerationOptions(thread.acl),\n  })\n}\n\nexport default function thread(state = [], action = null) {\n  switch (action.type) {\n    case APPEND_THREADS:\n      const mergedState = concatUnique(action.items.map(hydrateThread), state)\n      return mergedState.sort(action.sorting)\n\n    case DELETE_THREAD:\n      return state.filter(function (item) {\n        return item.id !== action.thread.id\n      })\n\n    case FILTER_THREADS:\n      return state.filter(function (item) {\n        const itemCategory = action.categoriesMap[item.category]\n        if (\n          itemCategory.lft >= action.category.lft &&\n          itemCategory.rght <= action.category.rght\n        ) {\n          // same or sub category\n          return true\n        } else if (item.weight == 2) {\n          // globally pinned\n          return true\n        } else {\n          // thread moved outside displayed scope, hide it\n          return false\n        }\n      })\n\n    case HYDRATE_THREADS:\n      return action.items.map(hydrateThread)\n\n    case PATCH_THREAD:\n      const patchedState = state.map(function (item) {\n        if (item.id === action.thread.id) {\n          return Object.assign({}, item, action.patch)\n        } else {\n          return item\n        }\n      })\n\n      if (action.sorting) {\n        return patchedState.sort(action.sorting)\n      }\n      return patchedState\n\n    case SORT_THREADS:\n      return state.sort(action.sorting)\n\n    default:\n      return state\n  }\n}\n","export var initialState = {\n  tick: 0,\n}\n\nexport const TICK = \"TICK\"\n\nexport function doTick() {\n  return {\n    type: TICK,\n  }\n}\n\nexport default function tick(state = initialState, action = null) {\n  if (action.type === TICK) {\n    return Object.assign({}, state, {\n      tick: state.tick + 1,\n    })\n  } else {\n    return state\n  }\n}\n","import moment from \"moment\"\nimport { UPDATE_AVATAR, UPDATE_USERNAME } from \"misago/reducers/users\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const ADD_NAME_CHANGE = \"ADD_NAME_CHANGE\"\nexport const APPEND_HISTORY = \"APPEND_HISTORY\"\nexport const HYDRATE_HISTORY = \"HYDRATE_HISTORY\"\n\nexport function addNameChange(change, user, changedBy) {\n  return {\n    type: ADD_NAME_CHANGE,\n    change,\n    user,\n    changedBy,\n  }\n}\n\nexport function append(items) {\n  return {\n    type: APPEND_HISTORY,\n    items: items,\n  }\n}\n\nexport function hydrate(items) {\n  return {\n    type: HYDRATE_HISTORY,\n    items: items,\n  }\n}\n\nexport function hydrateNamechange(namechange) {\n  return Object.assign({}, namechange, {\n    changed_on: moment(namechange.changed_on),\n  })\n}\n\nexport default function username(state = [], action = null) {\n  switch (action.type) {\n    case ADD_NAME_CHANGE:\n      let newState = state.slice()\n      newState.unshift({\n        id: Math.floor(Date.now() / 1000), // just small hax for getting id\n        changed_by: action.changedBy,\n        changed_by_username: action.changedBy.username,\n        changed_on: moment(),\n        new_username: action.change.username,\n        old_username: action.user.username,\n      })\n      return newState\n\n    case APPEND_HISTORY:\n      return concatUnique(state, action.items.map(hydrateNamechange))\n\n    case HYDRATE_HISTORY:\n      return action.items.map(hydrateNamechange)\n\n    case UPDATE_AVATAR:\n      return state.map(function (item) {\n        item = Object.assign({}, item)\n        if (item.changed_by && item.changed_by.id === action.userId) {\n          item.changed_by = Object.assign({}, item.changed_by, {\n            avatars: action.avatars,\n          })\n        }\n\n        return item\n      })\n\n    case UPDATE_USERNAME:\n      return state.map(function (item) {\n        item = Object.assign({}, item)\n        if (item.changed_by && item.changed_by.id === action.userId) {\n          item.changed_by = Object.assign({}, item.changed_by, {\n            username: action.username,\n            slug: action.slug,\n          })\n        }\n\n        return Object.assign({}, item)\n      })\n\n    default:\n      return state\n  }\n}\n","import moment from \"moment\"\nimport concatUnique from \"misago/utils/concat-unique\"\n\nexport const APPEND_USERS = \"APPEND_USERS\"\nexport const HYDRATE_USERS = \"HYDRATE_USERS\"\nexport const UPDATE_AVATAR = \"UPDATE_AVATAR\"\nexport const UPDATE_USERNAME = \"UPDATE_USERNAME\"\n\nexport function append(items) {\n  return {\n    type: APPEND_USERS,\n    items,\n  }\n}\n\nexport function hydrate(items) {\n  return {\n    type: HYDRATE_USERS,\n    items,\n  }\n}\n\nexport function hydrateStatus(status) {\n  if (status) {\n    return Object.assign({}, status, {\n      last_click: status.last_click ? moment(status.last_click) : null,\n      banned_until: status.banned_until ? moment(status.banned_until) : null,\n    })\n  } else {\n    return null\n  }\n}\n\nexport function hydrateUser(user) {\n  return Object.assign({}, user, {\n    joined_on: moment(user.joined_on),\n    status: hydrateStatus(user.status),\n  })\n}\n\nexport function updateAvatar(user, avatars) {\n  return {\n    type: UPDATE_AVATAR,\n    userId: user.id,\n    avatars,\n  }\n}\n\nexport function updateUsername(user, username, slug) {\n  return {\n    type: UPDATE_USERNAME,\n    userId: user.id,\n    username,\n    slug,\n  }\n}\n\nexport default function user(state = [], action = null) {\n  switch (action.type) {\n    case APPEND_USERS:\n      return concatUnique(state, action.items.map(hydrateUser))\n\n    case HYDRATE_USERS:\n      return action.items.map(hydrateUser)\n\n    case UPDATE_AVATAR:\n      return state.map(function (item) {\n        item = Object.assign({}, item)\n        if (item.id === action.userId) {\n          item.avatars = action.avatars\n        }\n\n        return item\n      })\n\n    default:\n      return state\n  }\n}\n","export class Ajax {\n  constructor() {\n    this._cookieName = null\n    this._csrfToken = null\n    this._locks = {}\n  }\n\n  init(cookieName) {\n    this._cookieName = cookieName\n  }\n\n  getCsrfToken() {\n    if (document.cookie.indexOf(this._cookieName) !== -1) {\n      let cookieRegex = new RegExp(this._cookieName + \"=([^;]*)\")\n      let cookie = document.cookie.match(cookieRegex)[0]\n      return cookie ? cookie.split(\"=\")[1] : null\n    } else {\n      return null\n    }\n  }\n\n  request(method, url, data) {\n    let self = this\n    return new Promise(function (resolve, reject) {\n      let xhr = {\n        url: url,\n        method: method,\n        headers: {\n          \"X-CSRFToken\": self.getCsrfToken(),\n        },\n\n        data: data ? JSON.stringify(data) : null,\n        contentType: \"application/json; charset=utf-8\",\n        dataType: \"json\",\n\n        success: function (data) {\n          resolve(data)\n        },\n\n        error: function (jqXHR) {\n          let rejection = jqXHR.responseJSON || {}\n\n          rejection.status = jqXHR.status\n\n          if (rejection.status === 0) {\n            rejection.detail = pgettext(\n              \"ajax client error\",\n              \"Could not connect to the site.\"\n            )\n          }\n\n          if (rejection.status === 404) {\n            if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n              rejection.detail = pgettext(\n                \"ajax client error\",\n                \"Action link is invalid.\"\n              )\n            }\n          }\n\n          if (rejection.status === 500 && !rejection.detail) {\n            rejection.detail = pgettext(\n              \"ajax client error\",\n              \"Unknown error has occurred.\"\n            )\n          }\n\n          rejection.statusText = jqXHR.statusText\n\n          reject(rejection)\n        },\n      }\n\n      $.ajax(xhr)\n    })\n  }\n\n  get(url, params, lock) {\n    if (params) {\n      url += \"?\" + $.param(params)\n    }\n\n    if (lock) {\n      let self = this\n\n      // update url in existing lock?\n      if (this._locks[lock]) {\n        this._locks[lock].url = url\n      }\n\n      // immediately dereference promise handlers without doing anything\n      // we are already waiting for existing response to resolve\n      if (this._locks[lock] && this._locks[lock].waiter) {\n        return {\n          then: function () {\n            return\n          },\n        }\n\n        // return promise that will begin when original one resolves\n      } else if (this._locks[lock] && this._locks[lock].wait) {\n        this._locks[lock].waiter = true\n\n        return new Promise(function (resolve, reject) {\n          let wait = function (url) {\n            // keep waiting on promise\n            if (self._locks[lock].wait) {\n              window.setTimeout(function () {\n                wait(url)\n              }, 300)\n\n              // poll for new url\n            } else if (self._locks[lock].url !== url) {\n              wait(self._locks[lock].url)\n\n              // ajax backend for response\n            } else {\n              self._locks[lock].waiter = false\n              self.request(\"GET\", self._locks[lock].url).then(\n                function (data) {\n                  if (self._locks[lock].url === url) {\n                    resolve(data)\n                  } else {\n                    self._locks[lock].waiter = true\n                    wait(self._locks[lock].url)\n                  }\n                },\n                function (rejection) {\n                  if (self._locks[lock].url === url) {\n                    reject(rejection)\n                  } else {\n                    self._locks[lock].waiter = true\n                    wait(self._locks[lock].url)\n                  }\n                }\n              )\n            }\n          }\n\n          window.setTimeout(function () {\n            wait(url)\n          }, 300)\n        })\n\n        // setup new lock without waiter\n      } else {\n        this._locks[lock] = {\n          url,\n          wait: true,\n          waiter: false,\n        }\n\n        return new Promise(function (resolve, reject) {\n          self.request(\"GET\", url).then(\n            function (data) {\n              self._locks[lock].wait = false\n              if (self._locks[lock].url === url) {\n                resolve(data)\n              }\n            },\n            function (rejection) {\n              self._locks[lock].wait = false\n              if (self._locks[lock].url === url) {\n                reject(rejection)\n              }\n            }\n          )\n        })\n      }\n    } else {\n      return this.request(\"GET\", url)\n    }\n  }\n\n  post(url, data) {\n    return this.request(\"POST\", url, data)\n  }\n\n  patch(url, data) {\n    return this.request(\"PATCH\", url, data)\n  }\n\n  put(url, data) {\n    return this.request(\"PUT\", url, data)\n  }\n\n  delete(url, data) {\n    return this.request(\"DELETE\", url, data)\n  }\n\n  upload(url, data, progress) {\n    let self = this\n    return new Promise(function (resolve, reject) {\n      let xhr = {\n        url: url,\n        method: \"POST\",\n        headers: {\n          \"X-CSRFToken\": self.getCsrfToken(),\n        },\n\n        data: data,\n        contentType: false,\n        processData: false,\n\n        xhr: function () {\n          let xhr = new window.XMLHttpRequest()\n          xhr.upload.addEventListener(\n            \"progress\",\n            function (evt) {\n              if (evt.lengthComputable) {\n                progress(Math.round((evt.loaded / evt.total) * 100))\n              }\n            },\n            false\n          )\n          return xhr\n        },\n\n        success: function (response) {\n          resolve(response)\n        },\n\n        error: function (jqXHR) {\n          let rejection = jqXHR.responseJSON || {}\n\n          rejection.status = jqXHR.status\n\n          if (rejection.status === 0) {\n            rejection.detail = pgettext(\n              \"api error\",\n              \"Could not connect to the site.\"\n            )\n          }\n\n          if (rejection.status === 413 && !rejection.detail) {\n            rejection.detail = pgettext(\n              \"api error\",\n              \"Upload was rejected by the site as too large.\"\n            )\n          }\n\n          if (rejection.status === 404) {\n            if (!rejection.detail || rejection.detail === \"NOT FOUND\") {\n              rejection.detail = pgettext(\n                \"api error\",\n                \"Action link is invalid.\"\n              )\n            }\n          }\n\n          if (rejection.status === 500 && !rejection.detail) {\n            rejection.detail = pgettext(\n              \"api error\",\n              \"Unknown error has occurred.\"\n            )\n          }\n\n          rejection.statusText = jqXHR.statusText\n\n          reject(rejection)\n        },\n      }\n\n      $.ajax(xhr)\n    })\n  }\n}\n\nexport default new Ajax()\n","import { signIn, signOut } from \"misago/reducers/auth\"\n\nexport class Auth {\n  init(store, local, modal) {\n    this._store = store\n    this._local = local\n    this._modal = modal\n\n    // tell other tabs what auth state is because we are most current with it\n    this.syncSession()\n\n    // listen for other tabs to tell us that state changed\n    this.watchState()\n  }\n\n  syncSession() {\n    const state = this._store.getState().auth\n    if (state.isAuthenticated) {\n      this._local.set(\"auth\", {\n        isAuthenticated: true,\n        username: state.user.username,\n      })\n    } else {\n      this._local.set(\"auth\", {\n        isAuthenticated: false,\n      })\n    }\n  }\n\n  watchState() {\n    const state = this._store.getState().auth\n    this._local.watch(\"auth\", (newState) => {\n      if (newState.isAuthenticated) {\n        this._store.dispatch(\n          signIn({\n            username: newState.username,\n          })\n        )\n      } else if (state.isAuthenticated) {\n        // check if we are authenticated in this tab\n        // because some browser plugins prune local store\n        // aggressively, forcing erroneous message to display here\n        // tracking bug #955\n        this._store.dispatch(signOut())\n      }\n    })\n    this._modal.hide()\n  }\n\n  signIn(user) {\n    this._store.dispatch(signIn(user))\n    this._local.set(\"auth\", {\n      isAuthenticated: true,\n      username: user.username,\n    })\n    this._modal.hide()\n  }\n\n  signOut() {\n    this._store.dispatch(signOut())\n    this._local.set(\"auth\", {\n      isAuthenticated: false,\n    })\n    this._modal.hide()\n  }\n\n  softSignOut() {\n    this._store.dispatch(signOut(true))\n    this._local.set(\"auth\", {\n      isAuthenticated: false,\n    })\n    this._modal.hide()\n  }\n}\n\nexport default new Auth()\n","/* global grecaptcha */\nimport React from \"react\"\nimport FormGroup from \"misago/components/form-group\"\n\nexport class BaseCaptcha {\n  init(context, ajax, include, snackbar) {\n    this._context = context\n    this._ajax = ajax\n    this._include = include\n    this._snackbar = snackbar\n  }\n}\n\nexport class NoCaptcha extends BaseCaptcha {\n  load() {\n    return new Promise(function (resolve) {\n      // immediately resolve as we don't have anything to validate\n      resolve()\n    })\n  }\n\n  validator() {\n    return null\n  }\n\n  component() {\n    return null\n  }\n}\n\nexport class QACaptcha extends BaseCaptcha {\n  load() {\n    var self = this\n    return new Promise((resolve, reject) => {\n      self._ajax.get(self._context.get(\"CAPTCHA_API\")).then(\n        function (data) {\n          self.question = data.question\n          self.helpText = data.help_text\n          resolve()\n        },\n        function () {\n          self._snackbar.error(\n            pgettext(\"captcha field\", \"Failed to load CAPTCHA.\")\n          )\n          reject()\n        }\n      )\n    })\n  }\n\n  validator() {\n    return []\n  }\n\n  component(kwargs) {\n    return (\n      <FormGroup\n        label={this.question}\n        for=\"id_captcha\"\n        labelClass={kwargs.labelClass || \"\"}\n        controlClass={kwargs.controlClass || \"\"}\n        validation={kwargs.form.state.errors.captcha}\n        helpText={this.helpText || null}\n      >\n        <input\n          aria-describedby=\"id_captcha_status\"\n          className=\"form-control\"\n          disabled={kwargs.form.state.isLoading}\n          id=\"id_captcha\"\n          onChange={kwargs.form.bindInput(\"captcha\")}\n          type=\"text\"\n          value={kwargs.form.state.captcha}\n        />\n      </FormGroup>\n    )\n  }\n}\n\nexport class ReCaptchaComponent extends React.Component {\n  componentDidMount() {\n    grecaptcha.render(\"recaptcha\", {\n      sitekey: this.props.siteKey,\n      callback: (response) => {\n        // fire fakey event to binding\n        this.props.binding({\n          target: {\n            value: response,\n          },\n        })\n      },\n    })\n  }\n\n  render() {\n    return <div id=\"recaptcha\" />\n  }\n}\n\nexport class ReCaptcha extends BaseCaptcha {\n  load() {\n    this._include.include(\"https://www.google.com/recaptcha/api.js\", true)\n\n    return new Promise(function (resolve) {\n      var wait = function () {\n        if (typeof grecaptcha === \"undefined\") {\n          window.setTimeout(function () {\n            wait()\n          }, 200)\n        } else {\n          resolve()\n        }\n      }\n      wait()\n    })\n  }\n\n  validator() {\n    return []\n  }\n\n  component(kwargs) {\n    return (\n      <FormGroup\n        label={pgettext(\"captcha field\", \"Please solve the quick test\")}\n        for=\"id_captcha\"\n        labelClass={kwargs.labelClass || \"\"}\n        controlClass={kwargs.controlClass || \"\"}\n        validation={kwargs.form.state.errors.captcha}\n        helpText={pgettext(\n          \"captcha field\",\n          \"This test helps us prevent automated spam registrations on the site.\"\n        )}\n      >\n        <ReCaptchaComponent\n          binding={kwargs.form.bindInput(\"captcha\")}\n          siteKey={this._context.get(\"SETTINGS\").recaptcha_site_key}\n        />\n      </FormGroup>\n    )\n  }\n}\n\nexport class Captcha {\n  init(context, ajax, include, snackbar) {\n    switch (context.get(\"SETTINGS\").captcha_type) {\n      case \"no\":\n        this._captcha = new NoCaptcha()\n        break\n\n      case \"qa\":\n        this._captcha = new QACaptcha()\n        break\n\n      case \"re\":\n        this._captcha = new ReCaptcha()\n        break\n    }\n\n    this._captcha.init(context, ajax, include, snackbar)\n  }\n\n  // accessors for underlying strategy\n\n  load() {\n    return this._captcha.load()\n  }\n\n  validator() {\n    return this._captcha.validator()\n  }\n\n  component(kwargs) {\n    return this._captcha.component(kwargs)\n  }\n}\n\nexport default new Captcha()\n","export class Include {\n  init(staticUrl) {\n    this._staticUrl = staticUrl\n    this._included = []\n  }\n\n  include(script, remote = false) {\n    if (this._included.indexOf(script) === -1) {\n      this._included.push(script)\n      this._include(script, remote)\n    }\n  }\n\n  _include(script, remote) {\n    $.ajax({\n      url: (!remote ? this._staticUrl : \"\") + script,\n      cache: true,\n      dataType: \"script\",\n    })\n  }\n}\n\nexport default new Include()\n","let storage = window.localStorage\n\nexport class LocalStorage {\n  init(prefix) {\n    this._prefix = prefix\n    this._watchers = []\n\n    window.addEventListener(\"storage\", (e) => {\n      let newValueJson = JSON.parse(e.newValue)\n      this._watchers.forEach(function (watcher) {\n        if (watcher.key === e.key && e.oldValue !== e.newValue) {\n          watcher.callback(newValueJson)\n        }\n      })\n    })\n  }\n\n  set(key, value) {\n    storage.setItem(this._prefix + key, JSON.stringify(value))\n  }\n\n  get(key) {\n    let itemString = storage.getItem(this._prefix + key)\n    if (itemString) {\n      return JSON.parse(itemString)\n    } else {\n      return null\n    }\n  }\n\n  watch(key, callback) {\n    this._watchers.push({\n      key: this._prefix + key,\n      callback: callback,\n    })\n  }\n}\n\nexport default new LocalStorage()\n","import ReactDOM from \"react-dom\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Modal {\n  init(element) {\n    this._element = element\n\n    this._modal = $(element).modal({ show: false })\n\n    this._modal.on(\"hidden.bs.modal\", () => {\n      ReactDOM.unmountComponentAtNode(this._element)\n    })\n  }\n\n  show(component) {\n    mount(component, this._element.id)\n    this._modal.modal(\"show\")\n  }\n\n  hide() {\n    this._modal.modal(\"hide\")\n  }\n}\n\nexport default new Modal()\n","export class PageTitle {\n  init(indexTitle, forumName) {\n    this._indexTitle = indexTitle\n    this._forumName = forumName\n  }\n\n  set(title) {\n    if (!title) {\n      document.title = this._indexTitle || this._forumName\n      return\n    }\n\n    if (typeof title === \"string\") {\n      title = { title: title }\n    }\n\n    let finalTitle = title.title\n\n    if (title.page > 1) {\n      const pageLabel = interpolate(\n        pgettext(\"page title pagination\", \"page: %(page)s\"),\n        {\n          page: title.page,\n        },\n        true\n      )\n\n      finalTitle += \" (\" + pageLabel + \")\"\n    }\n\n    if (title.parent) {\n      finalTitle += \" | \" + title.parent\n    }\n\n    document.title = finalTitle + \" | \" + this._forumName\n  }\n}\n\nexport default new PageTitle()\n","export class Polls {\n  init(ajax, snackbar) {\n    this._ajax = ajax\n    this._snackbar = snackbar\n\n    this._polls = {}\n  }\n\n  start(kwargs) {\n    this.stop(kwargs.poll)\n\n    const poolServer = () => {\n      this._polls[kwargs.poll] = kwargs\n\n      this._ajax.get(kwargs.url, kwargs.data || null).then(\n        (data) => {\n          if (!this._polls[kwargs.poll]._stopped) {\n            kwargs.update(data)\n\n            this._polls[kwargs.poll].timeout = window.setTimeout(\n              poolServer,\n              kwargs.frequency\n            )\n          }\n        },\n        (rejection) => {\n          if (!this._polls[kwargs.poll]._stopped) {\n            if (kwargs.error) {\n              kwargs.error(rejection)\n            } else {\n              this._snackbar.apiError(rejection)\n            }\n          }\n        }\n      )\n    }\n\n    if (kwargs.delayed) {\n      this._polls[kwargs.poll] = {\n        timeout: window.setTimeout(poolServer, kwargs.frequency),\n      }\n    } else {\n      poolServer()\n    }\n  }\n\n  stop(pollId) {\n    if (this._polls[pollId]) {\n      window.clearTimeout(this._polls[pollId].timeout)\n      this._polls[pollId]._stopped = true\n    }\n  }\n}\n\nexport default new Polls()\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport PostingComponent from \"misago/components/posting\"\nimport mount from \"misago/utils/mount-component\"\n\nexport class Posting {\n  init(ajax, snackbar, mount) {\n    this._ajax = ajax\n    this._snackbar = snackbar\n    this._mount = mount\n\n    this._mode = null\n    this._spacer = document.getElementById(\"posting-spacer\")\n    this._observer = new ResizeObserver((entries) => {\n      this._spacer.style.height = entries[0].contentRect.height + \"px\"\n    })\n\n    this._isOpen = false\n    this._isClosing = false\n\n    this._beforeunloadSet = false\n    this._props = null\n  }\n\n  isOpen() {\n    return this._isOpen\n  }\n\n  setBeforeUnload() {\n    if (!this._beforeunloadSet) {\n      window.addEventListener(\"beforeunload\", this.beforeUnload, {\n        capture: true,\n      })\n      this._beforeunloadSet = true\n    }\n  }\n\n  unsetBeforeUnload() {\n    window.removeEventListener(\"beforeunload\", this.beforeUnload, {\n      capture: true,\n    })\n    this._beforeunloadSet = false\n  }\n\n  beforeUnload(event) {\n    event.returnValue = \"true\"\n    return \"true\"\n  }\n\n  open(props) {\n    if (this._isOpen === false) {\n      if (props.mode === \"QUOTE\") {\n        this._mode = \"REPLY\"\n      } else {\n        this._mode = props.mode\n      }\n\n      this._isOpen = props.submit\n      this._realOpen(Object.assign({}, props, { mode: this._mode }))\n    } else if (props.mode === \"QUOTE\") {\n      this._realOpen(\n        Object.assign({}, this._props, {\n          config: props.config,\n          context: props.context,\n        })\n      )\n    } else if (this._isOpen !== props.submit) {\n      let message = gettext(\n        \"You are already working on other message. Do you want to discard it?\"\n      )\n\n      const changeForm = window.confirm(message)\n      if (changeForm) {\n        this._mode = props.mode\n        this._isOpen = props.submit\n        this._realOpen(props)\n      }\n    } else if (this._mode == \"REPLY\" && props.mode == \"REPLY\") {\n      this._realOpen(props)\n    }\n  }\n\n  _realOpen(props) {\n    mount(<PostingComponent {...props} />, this._mount.id)\n\n    this._props = props\n    this._mount.classList.add(\"show\")\n    this._observer.observe(this._mount)\n    this.setBeforeUnload()\n  }\n\n  close = () => {\n    this.unsetBeforeUnload()\n    this._props = null\n\n    if (this._isOpen && !this._isClosing) {\n      this._isClosing = true\n      this._mount.classList.remove(\"show\")\n\n      window.setTimeout(() => {\n        ReactDOM.unmountComponentAtNode(this._mount)\n        this._observer.unobserve(this._mount)\n        this._spacer.style.height = \"0px;\"\n        this._isClosing = false\n        this._isOpen = false\n        this._mode = null\n      }, 300)\n    }\n  }\n}\n\nexport default new Posting()\n","import { showSnackbar, hideSnackbar } from \"misago/reducers/snackbar\"\n\nconst HIDE_ANIMATION_LENGTH = 300\nconst MESSAGE_SHOW_LENGTH = 5000\n\nexport class Snackbar {\n  init(store) {\n    this._store = store\n    this._timeout = null\n  }\n\n  alert = (message, type) => {\n    if (this._timeout) {\n      window.clearTimeout(this._timeout)\n      this._store.dispatch(hideSnackbar())\n\n      this._timeout = window.setTimeout(() => {\n        this._timeout = null\n        this.alert(message, type)\n      }, HIDE_ANIMATION_LENGTH)\n    } else {\n      this._store.dispatch(showSnackbar(message, type))\n      this._timeout = window.setTimeout(() => {\n        this._store.dispatch(hideSnackbar())\n        this._timeout = null\n      }, MESSAGE_SHOW_LENGTH)\n    }\n  }\n\n  // shorthands for message types\n\n  info = (message) => {\n    this.alert(message, \"info\")\n  }\n\n  success = (message) => {\n    this.alert(message, \"success\")\n  }\n\n  warning = (message) => {\n    this.alert(message, \"warning\")\n  }\n\n  error = (message) => {\n    this.alert(message, \"error\")\n  }\n\n  // shorthand for api errors\n\n  apiError = (rejection) => {\n    let message = rejection.data ? rejection.data.detail : rejection.detail\n\n    if (!message) {\n      if (rejection.status === 0) {\n        message = pgettext(\"api error\", \"Could not connect to the site.\")\n      } else if (rejection.status === 404) {\n        message = pgettext(\"api error\", \"Action link is invalid.\")\n      } else {\n        message = pgettext(\"api error\", \"Unknown error has occurred.\")\n      }\n    }\n\n    if (rejection.status === 403 && message === \"Permission denied\") {\n      message = pgettext(\n        \"api error\",\n        \"You don't have permission to perform this action.\"\n      )\n    }\n\n    this.error(message)\n  }\n}\n\nexport default new Snackbar()\n","import { combineReducers, createStore } from \"redux\"\n\nexport class StoreWrapper {\n  constructor() {\n    this._store = null\n    this._reducers = {}\n    this._initialState = {}\n  }\n\n  addReducer(name, reducer, initialState) {\n    this._reducers[name] = reducer\n    this._initialState[name] = initialState\n  }\n\n  init() {\n    this._store = createStore(\n      combineReducers(this._reducers),\n      this._initialState\n    )\n  }\n\n  getStore() {\n    return this._store\n  }\n\n  // Store API\n\n  getState() {\n    return this._store.getState()\n  }\n\n  dispatch(action) {\n    return this._store.dispatch(action)\n  }\n}\n\nexport default new StoreWrapper()\n","/* global zxcvbn */\nexport class Zxcvbn {\n  init(include) {\n    this._include = include\n    this._isLoaded = false\n  }\n\n  scorePassword(password, inputs) {\n    // 0-4 score, the more the stronger password\n    if (this._isLoaded) {\n      return zxcvbn(password, inputs).score\n    }\n\n    return 0\n  }\n\n  load() {\n    if (!this._isLoaded) {\n      this._include.include(\"misago/js/zxcvbn.js\")\n      return this._loadingPromise()\n    } else {\n      return this._loadedPromise()\n    }\n  }\n\n  _loadingPromise() {\n    const self = this\n\n    return new Promise(function (resolve, reject) {\n      var wait = function (tries = 0) {\n        tries += 1\n        if (tries > 200) {\n          reject()\n        } else if (typeof zxcvbn === \"undefined\") {\n          window.setTimeout(function () {\n            wait(tries)\n          }, 200)\n        } else {\n          self._isLoaded = true\n          resolve()\n        }\n      }\n      wait()\n    })\n  }\n\n  _loadedPromise() {\n    // we have already loaded zxcvbn.js, resolve away!\n    return new Promise(function (resolve) {\n      resolve()\n    })\n  }\n}\n\nexport default new Zxcvbn()\n","import moment from \"moment\"\nimport React from \"react\"\n\nexport default class extends React.Component {\n  getReasonMessage() {\n    if (this.props.message.html) {\n      return (\n        <div\n          className=\"lead\"\n          dangerouslySetInnerHTML={{\n            __html: this.props.message.html,\n          }}\n        />\n      )\n    } else {\n      return <p className=\"lead\">{this.props.message.plain}</p>\n    }\n  }\n\n  getExpirationMessage() {\n    if (this.props.expires) {\n      if (this.props.expires.isAfter(moment())) {\n        let title = interpolate(\n          pgettext(\"banned page\", \"This ban expires on %(expires_on)s.\"),\n          {\n            expires_on: this.props.expires.format(\"LL, LT\"),\n          },\n          true\n        )\n\n        let message = interpolate(\n          pgettext(\"banned page\", \"This ban expires %(expires_on)s.\"),\n          {\n            expires_on: this.props.expires.fromNow(),\n          },\n          true\n        )\n\n        return <abbr title={title}>{message}</abbr>\n      } else {\n        return pgettext(\"banned page\", \"This ban has expired.\")\n      }\n    } else {\n      return pgettext(\"banned page\", \"This ban is permanent.\")\n    }\n  }\n\n  render() {\n    return (\n      <div className=\"page page-error page-error-banned\">\n        <div className=\"container\">\n          <div className=\"message-panel\">\n            <div className=\"message-icon\">\n              <span className=\"material-icon\">highlight_off</span>\n            </div>\n            <div className=\"message-body\">\n              {this.getReasonMessage()}\n              <p className=\"message-footnote\">{this.getExpirationMessage()}</p>\n            </div>\n          </div>\n        </div>\n      </div>\n    )\n  }\n}\n","import moment from \"moment\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider, connect } from \"react-redux\"\nimport BannedPage from \"misago/components/banned-page\"\nimport misago from \"misago/index\"\nimport store from \"misago/services/store\"\n\nlet select = function (state) {\n  return state.tick\n}\n\nlet RedrawedBannedPage = connect(select)(BannedPage)\n\nexport default function (ban, changeState) {\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <RedrawedBannedPage\n        message={ban.message}\n        expires={ban.expires_on ? moment(ban.expires_on) : null}\n      />\n    </Provider>,\n\n    document.getElementById(\"page-mount\")\n  )\n\n  if (typeof changeState === \"undefined\" || changeState) {\n    let forumName = misago.get(\"SETTINGS\").forum_name\n    document.title =\n      pgettext(\"banned error title\", \"You are banned\") + \" | \" + forumName\n    window.history.pushState({}, \"\", misago.get(\"BANNED_URL\"))\n  }\n}\n","export default function (list, rowWidth, padding = false) {\n  let rows = []\n  let row = []\n\n  list.forEach(function (element) {\n    row.push(element)\n    if (row.length === rowWidth) {\n      rows.push(row)\n      row = []\n    }\n  })\n\n  // pad row to required length?\n  if (padding !== false && row.length > 0 && row.length < rowWidth) {\n    for (let i = row.length; i < rowWidth; i++) {\n      row.push(padding)\n    }\n  }\n\n  if (row.length) {\n    rows.push(row)\n  }\n\n  return rows\n}\n","export default function (a, b) {\n  let ids = []\n  return a.concat(b).filter(function (item) {\n    if (ids.indexOf(item.id) === -1) {\n      ids.push(item.id)\n      return true\n    } else {\n      return false\n    }\n  })\n}\n","const map = {\n  \"&\": \"&amp;\",\n  \"<\": \"&lt;\",\n  \">\": \"&gt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#039;\",\n}\n\nexport default function (text) {\n  return text.replace(/[&<>\"']/g, function (m) {\n    return map[m]\n  })\n}\n","export default function (bytes) {\n  if (bytes > 1024 * 1024 * 1024) {\n    return roundSize(bytes / (1024 * 1024 * 1024)) + \" GB\"\n  } else if (bytes > 1024 * 1024) {\n    return roundSize(bytes / (1024 * 1024)) + \" MB\"\n  } else if (bytes > 1024) {\n    return roundSize(bytes / 1024) + \" KB\"\n  } else {\n    return roundSize(bytes) + \" B\"\n  }\n}\n\nexport function roundSize(value) {\n  return value.toFixed(1)\n}\n","export const ALPHA = \"12345678990abcdefghijklmnopqrstuvwxyz\"\nexport const ALPHA_LEN = ALPHA.length\n\nexport default function getRandomString(len) {\n  const chars = []\n  for (let i = 0; i < len; i++) {\n    const index = Math.floor(Math.random() * ALPHA_LEN)\n    chars.push(ALPHA[index])\n  }\n  return chars.join(\"\")\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport store from \"misago/services/store\"\n\nexport default function (Component, rootElementId, connected = true) {\n  let rootElement = document.getElementById(rootElementId)\n\n  let finalComponent = Component.props ? Component : <Component />\n\n  if (rootElement) {\n    if (connected) {\n      ReactDOM.render(\n        <Provider store={store.getStore()}>{finalComponent}</Provider>,\n\n        rootElement\n      )\n    } else {\n      ReactDOM.render(finalComponent, rootElement)\n    }\n  }\n}\n","export function int(min, max) {\n  return Math.floor(Math.random() * (max - min + 1)) + min\n}\n\nexport function range(min, max) {\n  let array = new Array(int(min, max))\n  for (let i = 0; i < array.length; i++) {\n    array[i] = i\n  }\n\n  return array\n}\n","import React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Provider } from \"react-redux\"\nimport { Router, browserHistory } from \"react-router\"\nimport store from \"misago/services/store\"\n\nconst rootElement = document.getElementById(\"page-mount\")\n\nexport default function (options) {\n  let routes = {\n    component: options.component || null,\n    childRoutes: [],\n  }\n\n  if (options.root) {\n    routes.childRoutes = [\n      {\n        path: options.root,\n        onEnter: function (nextState, replaceState) {\n          replaceState(null, options.paths[0].path)\n        },\n      },\n    ].concat(options.paths)\n  } else {\n    routes.childRoutes = options.paths\n  }\n\n  ReactDOM.render(\n    <Provider store={store.getStore()}>\n      <Router routes={routes} history={browserHistory} />\n    </Provider>,\n    rootElement\n  )\n}\n","export function push(array, value) {\n  if (array.indexOf(value) === -1) {\n    let copy = array.slice()\n    copy.push(value)\n    return copy\n  } else {\n    return array\n  }\n}\n\nexport function remove(array, value) {\n  if (array.indexOf(value) >= 0) {\n    return array.filter(function (i) {\n      return i !== value\n    })\n  } else {\n    return array\n  }\n}\n\nexport function toggle(array, value) {\n  if (array.indexOf(value) === -1) {\n    let copy = array.slice()\n    copy.push(value)\n    return copy\n  } else {\n    return array.filter(function (i) {\n      return i !== value\n    })\n  }\n}\n","const EMAIL =\n  /^(([^<>()[\\]\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@(([^<>()[\\]\\.,;:\\s@\\\"]+\\.)+[^<>()[\\]\\.,;:\\s@\\\"]{2,})$/i\nconst USERNAME = new RegExp(\"^[0-9a-z_]+$\", \"i\")\nconst USERNAME_ALPHANUMERIC = new RegExp(\"[0-9a-z]\", \"i\")\n\nexport function required(message) {\n  return function (value) {\n    if (value === false || value === null || String(value).trim().length === 0) {\n      return message || gettext(\"This field is required.\")\n    }\n  }\n}\n\nexport function requiredTermsOfService(message) {\n  const error = pgettext(\n    \"agreement validator\",\n    \"You have to accept the terms of service.\"\n  )\n  return required(message || error)\n}\n\nexport function requiredPrivacyPolicy(message) {\n  const error = pgettext(\n    \"agreement validator\",\n    \"You have to accept the privacy policy.\"\n  )\n  return required(message || error)\n}\n\nexport function email(message) {\n  return function (value) {\n    if (!EMAIL.test(value)) {\n      return (\n        message || pgettext(\"email validator\", \"Enter a valid e-mail address.\")\n      )\n    }\n  }\n}\n\nexport function minLength(limitValue, message) {\n  return function (value) {\n    var returnMessage = \"\"\n    var length = value.trim().length\n\n    if (length < limitValue) {\n      if (message) {\n        returnMessage = message(limitValue, length)\n      } else {\n        returnMessage = npgettext(\n          \"value length validator\",\n          \"Ensure this value has at least %(limit_value)s character (it has %(show_value)s).\",\n          \"Ensure this value has at least %(limit_value)s characters (it has %(show_value)s).\",\n          limitValue\n        )\n      }\n      return interpolate(\n        returnMessage,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  }\n}\n\nexport function maxLength(limitValue, message) {\n  return function (value) {\n    var returnMessage = \"\"\n    var length = value.trim().length\n\n    if (length > limitValue) {\n      if (message) {\n        returnMessage = message(limitValue, length)\n      } else {\n        returnMessage = npgettext(\n          \"value length validator\",\n          \"Ensure this value has at most %(limit_value)s character (it has %(show_value)s).\",\n          \"Ensure this value has at most %(limit_value)s characters (it has %(show_value)s).\",\n          limitValue\n        )\n      }\n      return interpolate(\n        returnMessage,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  }\n}\n\nexport function usernameMinLength(lengthMin) {\n  var message = function (lengthMin) {\n    return npgettext(\n      \"username length validator\",\n      \"Username must be at least %(limit_value)s character long.\",\n      \"Username must be at least %(limit_value)s characters long.\",\n      lengthMin\n    )\n  }\n  return minLength(lengthMin, message)\n}\n\nexport function usernameMaxLength(lengthMax) {\n  var message = function (lengthMax) {\n    return npgettext(\n      \"username length validator\",\n      \"Username cannot be longer than %(limit_value)s character.\",\n      \"Username cannot be longer than %(limit_value)s characters.\",\n      lengthMax\n    )\n  }\n  return maxLength(lengthMax, message)\n}\n\nexport function usernameContent() {\n  return function (value) {\n    const valueTrimmed = value.trim()\n    if (!USERNAME.test(valueTrimmed)) {\n      return pgettext(\n        \"username validator\",\n        \"Username can only contain Latin alphabet letters, digits, and an underscore sign.\"\n      )\n    }\n    if (!USERNAME_ALPHANUMERIC.test(valueTrimmed)) {\n      return pgettext(\n        \"username validator\",\n        \"Username must contain Latin alphabet letters or digits.\"\n      )\n    }\n  }\n}\n\nexport function passwordMinLength(limitValue) {\n  return function (value) {\n    const length = value.length\n\n    if (length < limitValue) {\n      const returnMessage = npgettext(\n        \"password length validator\",\n        \"Valid password must be at least %(limit_value)s character long.\",\n        \"Valid password must be at least %(limit_value)s characters long.\",\n        limitValue\n      )\n\n      return interpolate(\n        returnMessage,\n        {\n          limit_value: limitValue,\n          show_value: length,\n        },\n        true\n      )\n    }\n  }\n}\n","var map = {\n\t\"./af\": 42786,\n\t\"./af.js\": 42786,\n\t\"./ar\": 30867,\n\t\"./ar-dz\": 14130,\n\t\"./ar-dz.js\": 14130,\n\t\"./ar-kw\": 96135,\n\t\"./ar-kw.js\": 96135,\n\t\"./ar-ly\": 56440,\n\t\"./ar-ly.js\": 56440,\n\t\"./ar-ma\": 47702,\n\t\"./ar-ma.js\": 47702,\n\t\"./ar-sa\": 16040,\n\t\"./ar-sa.js\": 16040,\n\t\"./ar-tn\": 37100,\n\t\"./ar-tn.js\": 37100,\n\t\"./ar.js\": 30867,\n\t\"./az\": 31083,\n\t\"./az.js\": 31083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 68338,\n\t\"./bg.js\": 68338,\n\t\"./bm\": 67438,\n\t\"./bm.js\": 67438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 76225,\n\t\"./bn-bd.js\": 76225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 11560,\n\t\"./bo.js\": 11560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 80622,\n\t\"./bs.js\": 80622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 50877,\n\t\"./cv.js\": 50877,\n\t\"./cy\": 47373,\n\t\"./cy.js\": 47373,\n\t\"./da\": 24780,\n\t\"./da.js\": 24780,\n\t\"./de\": 59740,\n\t\"./de-at\": 60217,\n\t\"./de-at.js\": 60217,\n\t\"./de-ch\": 60894,\n\t\"./de-ch.js\": 60894,\n\t\"./de.js\": 59740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 50837,\n\t\"./el.js\": 50837,\n\t\"./en-au\": 78348,\n\t\"./en-au.js\": 78348,\n\t\"./en-ca\": 77925,\n\t\"./en-ca.js\": 77925,\n\t\"./en-gb\": 22243,\n\t\"./en-gb.js\": 22243,\n\t\"./en-ie\": 46436,\n\t\"./en-ie.js\": 46436,\n\t\"./en-il\": 47207,\n\t\"./en-il.js\": 47207,\n\t\"./en-in\": 44175,\n\t\"./en-in.js\": 44175,\n\t\"./en-nz\": 76319,\n\t\"./en-nz.js\": 76319,\n\t\"./en-sg\": 31662,\n\t\"./en-sg.js\": 31662,\n\t\"./eo\": 92915,\n\t\"./eo.js\": 92915,\n\t\"./es\": 55655,\n\t\"./es-do\": 55251,\n\t\"./es-do.js\": 55251,\n\t\"./es-mx\": 96112,\n\t\"./es-mx.js\": 96112,\n\t\"./es-us\": 71146,\n\t\"./es-us.js\": 71146,\n\t\"./es.js\": 55655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 77763,\n\t\"./eu.js\": 77763,\n\t\"./fa\": 76959,\n\t\"./fa.js\": 76959,\n\t\"./fi\": 11897,\n\t\"./fi.js\": 11897,\n\t\"./fil\": 42549,\n\t\"./fil.js\": 42549,\n\t\"./fo\": 94694,\n\t\"./fo.js\": 94694,\n\t\"./fr\": 94470,\n\t\"./fr-ca\": 63049,\n\t\"./fr-ca.js\": 63049,\n\t\"./fr-ch\": 52330,\n\t\"./fr-ch.js\": 52330,\n\t\"./fr.js\": 94470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 29295,\n\t\"./ga.js\": 29295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 38794,\n\t\"./gl.js\": 38794,\n\t\"./gom-deva\": 27884,\n\t\"./gom-deva.js\": 27884,\n\t\"./gom-latn\": 23168,\n\t\"./gom-latn.js\": 23168,\n\t\"./gu\": 95349,\n\t\"./gu.js\": 95349,\n\t\"./he\": 24206,\n\t\"./he.js\": 24206,\n\t\"./hi\": 30094,\n\t\"./hi.js\": 30094,\n\t\"./hr\": 30316,\n\t\"./hr.js\": 30316,\n\t\"./hu\": 22138,\n\t\"./hu.js\": 22138,\n\t\"./hy-am\": 11423,\n\t\"./hy-am.js\": 11423,\n\t\"./id\": 29218,\n\t\"./id.js\": 29218,\n\t\"./is\": 90135,\n\t\"./is.js\": 90135,\n\t\"./it\": 90626,\n\t\"./it-ch\": 10150,\n\t\"./it-ch.js\": 10150,\n\t\"./it.js\": 90626,\n\t\"./ja\": 39183,\n\t\"./ja.js\": 39183,\n\t\"./jv\": 24286,\n\t\"./jv.js\": 24286,\n\t\"./ka\": 12105,\n\t\"./ka.js\": 12105,\n\t\"./kk\": 47772,\n\t\"./kk.js\": 47772,\n\t\"./km\": 18758,\n\t\"./km.js\": 18758,\n\t\"./kn\": 79282,\n\t\"./kn.js\": 79282,\n\t\"./ko\": 33730,\n\t\"./ko.js\": 33730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 33291,\n\t\"./ky.js\": 33291,\n\t\"./lb\": 36841,\n\t\"./lb.js\": 36841,\n\t\"./lo\": 55466,\n\t\"./lo.js\": 55466,\n\t\"./lt\": 57010,\n\t\"./lt.js\": 57010,\n\t\"./lv\": 37595,\n\t\"./lv.js\": 37595,\n\t\"./me\": 39861,\n\t\"./me.js\": 39861,\n\t\"./mi\": 35493,\n\t\"./mi.js\": 35493,\n\t\"./mk\": 95966,\n\t\"./mk.js\": 95966,\n\t\"./ml\": 87341,\n\t\"./ml.js\": 87341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 10370,\n\t\"./mr.js\": 10370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 41237,\n\t\"./ms-my.js\": 41237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 72126,\n\t\"./mt.js\": 72126,\n\t\"./my\": 56165,\n\t\"./my.js\": 56165,\n\t\"./nb\": 64924,\n\t\"./nb.js\": 64924,\n\t\"./ne\": 16744,\n\t\"./ne.js\": 16744,\n\t\"./nl\": 93901,\n\t\"./nl-be\": 59814,\n\t\"./nl-be.js\": 59814,\n\t\"./nl.js\": 93901,\n\t\"./nn\": 83877,\n\t\"./nn.js\": 83877,\n\t\"./oc-lnc\": 92135,\n\t\"./oc-lnc.js\": 92135,\n\t\"./pa-in\": 15858,\n\t\"./pa-in.js\": 15858,\n\t\"./pl\": 64495,\n\t\"./pl.js\": 64495,\n\t\"./pt\": 89520,\n\t\"./pt-br\": 57971,\n\t\"./pt-br.js\": 57971,\n\t\"./pt.js\": 89520,\n\t\"./ro\": 96459,\n\t\"./ro.js\": 96459,\n\t\"./ru\": 21793,\n\t\"./ru.js\": 21793,\n\t\"./sd\": 40950,\n\t\"./sd.js\": 40950,\n\t\"./se\": 10490,\n\t\"./se.js\": 10490,\n\t\"./si\": 90124,\n\t\"./si.js\": 90124,\n\t\"./sk\": 64249,\n\t\"./sk.js\": 64249,\n\t\"./sl\": 14985,\n\t\"./sl.js\": 14985,\n\t\"./sq\": 51104,\n\t\"./sq.js\": 51104,\n\t\"./sr\": 49131,\n\t\"./sr-cyrl\": 79915,\n\t\"./sr-cyrl.js\": 79915,\n\t\"./sr.js\": 49131,\n\t\"./ss\": 85893,\n\t\"./ss.js\": 85893,\n\t\"./sv\": 98760,\n\t\"./sv.js\": 98760,\n\t\"./sw\": 91172,\n\t\"./sw.js\": 91172,\n\t\"./ta\": 27333,\n\t\"./ta.js\": 27333,\n\t\"./te\": 23110,\n\t\"./te.js\": 23110,\n\t\"./tet\": 52095,\n\t\"./tet.js\": 52095,\n\t\"./tg\": 27321,\n\t\"./tg.js\": 27321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 19005,\n\t\"./tk.js\": 19005,\n\t\"./tl-ph\": 75768,\n\t\"./tl-ph.js\": 75768,\n\t\"./tlh\": 89444,\n\t\"./tlh.js\": 89444,\n\t\"./tr\": 72397,\n\t\"./tr.js\": 72397,\n\t\"./tzl\": 28254,\n\t\"./tzl.js\": 28254,\n\t\"./tzm\": 51106,\n\t\"./tzm-latn\": 30699,\n\t\"./tzm-latn.js\": 30699,\n\t\"./tzm.js\": 51106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 67691,\n\t\"./uk.js\": 67691,\n\t\"./ur\": 13795,\n\t\"./ur.js\": 13795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 60588,\n\t\"./uz-latn.js\": 60588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 65666,\n\t\"./vi.js\": 65666,\n\t\"./x-pseudo\": 14378,\n\t\"./x-pseudo.js\": 14378,\n\t\"./yo\": 75805,\n\t\"./yo.js\": 75805,\n\t\"./zh-cn\": 83839,\n\t\"./zh-cn.js\": 83839,\n\t\"./zh-hk\": 55726,\n\t\"./zh-hk.js\": 55726,\n\t\"./zh-mo\": 99807,\n\t\"./zh-mo.js\": 99807,\n\t\"./zh-tw\": 74152,\n\t\"./zh-tw.js\": 74152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + \"hljs\" + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t174: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkmisago\"] = self[\"webpackChunkmisago\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18827)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(58339)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64109)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(46226)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(93240)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(75147)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(4894)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(29223)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(73806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(27015)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(88097)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(94795)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95563)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(32488)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(11768)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61323)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(64752)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(40949)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(78679)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(61814)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(95920)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(84333)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(62419)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(63290)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(77031)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(97751)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(76093)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(87336)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(47549)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(22331)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(21513)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98749)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(98251)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(6720)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(66806)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(10846)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(18255)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(14113)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24444)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(1764)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(68351)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(81521)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(19984)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(41229)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43589)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(24108)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33934)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(85577)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(83526)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(43060)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(92292)))\n__webpack_require__.O(undefined, [736], () => (__webpack_require__(33409)))\nvar __webpack_exports__ = __webpack_require__.O(undefined, [736], () => (__webpack_require__(31341)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","inProgress","dataWebpackPrefix","ApiFetch","props","url","cache","data","setState","loading","error","onData","fetch","method","credentials","signal","then","response","status","json","setCache","headers","get","rejection","request","mutation","state","controller","AbortController","this","disabled","prevProps","urlChanged","disabledChanged","abort","hasCache","getCache","children","Object","assign","refetch","update","React","ApiMutation","options","body","onSuccess","onError","mutate","csrfToken","JSON","stringify","cookieName","window","misago_csrf","document","cookie","indexOf","cookieRegex","RegExp","match","split","Dropdown","event","isOpen","root","contains","target","menu","closest","prevState","dropdown","addEventListener","handleClick","removeEventListener","onOpen","onClose","id","className","classnames","open","ref","element","toggle","aria","ariaProps","menuAlignRight","menuClassName","role","close","DropdownDivider","DropdownFooter","listItem","DropdownHeader","DropdownMenuItem","DropdownPills","DropdownSubheader","shrink","auto","ListGroup","ListGroupItem","ListGroupEmpty","icon","message","ListGroupError","detail","ListGroupLoading","ListGroupMessage","getApiUrl","filter","query","api","misago","after","before","connect","auth","user","unreadNotifications","dispatch","updateAuthenticatedUser","NotificationsListEmpty","emptyMessage","pgettext","NotificationsListGroup","NotificationsListItemActor","notification","actor","href","title","username","size","actor_name","NotificationsListItemMessage","isRead","dangerouslySetInnerHTML","__html","NotificationsListItemReadStatus","NotificationsListItemTimestamp","Timestamp","datetime","createdAt","NotificationsListItem","NotificationsList","items","length","map","NotificationsListError","gettext","NotificationsListLoading","BODY_CLASS","Overlay","scrollOrigin","pageYOffset","classList","add","remove","scrollTo","onClick","closeOnNavigation","type","styleName","header","STYLES","LABELS","_score","_password","_inputs","loaded","zxcvbn","password","inputs","cacheStale","value","i","trim","score","getScore","style","width","RegisterForm","handleToggleAgreement","agreement","errors","validator","validators","criteria","passwordMinLength","forEach","item","name","min_length","formValidators","max_length","email","captcha","termsOfService","privacyPolicy","isLoading","isValid","snackbar","validate","ajax","terms_of_service","privacy_policy","apiResponse","callback","__all__","ban","showBannedPage","modal","onSubmit","handleSubmit","display","StartSocialAuth","buttonClassName","buttonLabel","formLabel","label","for","validation","onChange","bindInput","extra","form","RegisterLegalFootnote","onPrivacyPolicyChange","handlePrivacyPolicyChange","onTermsOfServiceChange","handleTermsOfServiceChange","Form","RegisterComplete","activation","interpolate","getLead","getSubscript","complete","completeRegistration","account_activation","isLoaded","Promise","all","result","block","showRegisterForm","LegalAgreement","checked","agreementHtml","escapeHtml","termsOfServiceId","termsOfServiceUrl","privacyPolicyId","privacyPolicyUrl","SearchResultsList","SearchMessage","SearchResultPost","post","index","thread","content","category","poster","poster_name","posted_on","SearchResultUser","rank","joined_on","SearchResults","results","threads","users","count","encodeURIComponent","npgettext","replace","SearchResultsEmpty","SearchResultsError","errorDetail","SearchResultsLoading","CACHE","SearchFetch","debounce","clearTimeout","setTimeout","Api","resultsCount","isResultEmpty","SearchInput","setQuery","placeholder","SearchQuery","SearchDropdown","overlay","search","querySelector","focus","settings","DELEGATE_AUTH","LOGIN_URL","SiteNavMenuConnected","isAnonymous","baseUrl","extraItems","extraFooterItems","categories","authDelegated","enable_oauth2_client","topNav","push","footerNav","tosTitle","tosUrl","privacyTitle","privacyUrl","SignInButton","RegisterButton","forum_name","targetBlank","rel","color","shortName","SiteNavDropdown","siteNav","FormHeader","text","labelClassName","socialAuth","pk","button_text","button_color","finalButtonLabel","site","weight","best_answer","has_poll","is_unapproved","has_unapproved_posts","is_closed","is_hidden","replies","Math","round","tick","now","Date","diff","ceil","abs","date","timeout","scheduleNextUpdate","displayed","narrow","formatNarrow","formatRelative","fullDateTime","callApi","avatarType","avatar","onComplete","showError","gravatar","setGravatar","crop_src","showCrop","upload","showUpload","galleries","showGallery","userPeview","avatars","getAvatarPreview","getGravatarButton","setGenerated","getCropButton","getUploadButton","getGalleryButton","cropit","$","deviceRatio","cropitOffset","crop","offset","x","y","zoom","crop_tmp","dataUrl","cropperWidth","getAvatarSize","initialWidth","height","exportZoom","imageState","src","getImagePath","onImageLoaded","zoomLevel","imageSize","offsetX","offsetY","cropAvatar","showIndex","getElementById","click","image","files","validationError","validateFile","preview","URL","createObjectURL","progress","FormData","append","uploaded","limit","filesize","fileSize","invalidTypeMsg","allowed_mime_types","extensionFound","loweredFilename","toLowerCase","allowed_extensions","extension","substr","extensions","join","pickFile","getUploadRequirements","getUploadProgressLabel","uploadFile","getUploadProgress","renderCrop","renderUpload","GalleryItem","select","selection","getClassName","Gallery","batch","images","row","save","ChangeAvatarError","reason","getErrorReason","component","AvatarIndex","AvatarUpload","AvatarCrop","AvatarGallery","store","updateAvatar","completeFlow","getBody","logout","submit","UserNavMenu","selectAvatar","ChangeAvatarModal","optionsMore","slice","adminUrl","showPrivateThreads","unreadPrivateThreads","changeAvatar","revealOptions","unread_private_threads","acl","can_use_private_threads","UserNavDropdown","userNav","size2x","alt","getSrc","srcSet","av","resolveAvatarForSize","Button","defaultProps","choices","repeat","level","helpText","ev","field","fieldname","input","rows","fields","help_text","groups","group","f","initial","CancelButton","onCancel","cancel","FormDisplay","isValidated","labelClass","htmlFor","controlClass","getFeedbackDescription","getFeedback","getHelpText","validateRequired","required","changeValue","newState","formErrors","validateField","preventDefault","clean","promise","send","success","handleSuccess","handleError","optional","validatedFields","hasOwnProperty","fieldErrors","requiredError","isControlled","isActive","path","location","pathname","activeClassName","bestAnswer","poll","polls","confirm","BestAnswerSelect","bestAnswers","onBestAnswerChange","PollSelect","onPollChange","choice","ytRegExp","highlightCode","embedYoutubePlayers","_youtube","hljs","codeblocks","querySelectorAll","highlightElement","anchors","a","onlyChild","parentNode","childNodes","parseYoutubeUrl","youtubeMovie","swapYoutubePlayer","youtube","video","start","player","replaceWith","wrap","cleanedUrl","cleanUrl","getVideoIdFromUrl","timebit","bits","parseInt","onebox","documentNode","find","revealSpoiler","nextProps","nextState","markup","author","undefined","node","btn","parent","addClass","PanelMessage","Default","Invalid","tooltip","format","fromNow","userTitle","css_class","is_tab","random","isReady","posts","PostingQuoteSelection","range","getQuoteSelection","rect","getBoundingClientRect","posting","globalState","getGlobalState","quote","getQuoteMarkup","focusEditor","default","onMouseUp","selected","onTouchEnd","position","left","scrollX","top","bottom","scrollY","reply","textarea","selectionStart","selectionEnd","container","getSelection","rangeCount","getRangeAt","isRangeContained","isPostContained","isAnyTextSelected","cloneContents","commonAncestorContainer","p","nodeName","dataset","noquote","child","nodeType","Node","TEXT_NODE","textContent","metadata","getQuoteMetadata","convertNodesToMarkup","prefix","suffix","codeBlock","getQuoteCodeBlock","syntax","isNodeInlineCodeBlock","isNodeElementWithQuoteMetadata","getQuoteMetadataFromNode","ELEMENT_NODE","isNodeCodeBlock","getNodeCodeBlockMeta","nodes","stack","convertNodeToMarkup","SIMPLE_NODE_MAPPINGS","H1","H2","H3","H4","H5","H6","STRONG","EM","DEL","B","U","I","SUB","SUP","toUpperCase","code","innerText","misagoReply","setGlobalState","clearGlobalState","attachments","attachment","isRemoved","MarkupAttachmentModal","is_image","filename","filetype","formatFilesize","uploaded_on","uploader","uploader_name","wrapSelection","def","newValue","caret","setSelectionRange","replaceSelection","end","createRange","moveStart","substring","scroll","scrollTop","thumb","getAttachmentMarkup","key","canProtect","empty","isProtected","submitText","showPreview","closePreview","enableProtection","disableProtection","MarkupCodeModal","LANGUAGES","MarkupFormattingHelpModal","ExampleFormatting","ExampleFormattingSpoiler","reveal","URL_PATTERN","isUrl","str","test","textUrl","file","maxSize","max_attachment_size","getRandomString","concat","refreshState","moment","updateAttachments","actions","insertSpoiler","createElement","multiple","parsed","stopPropagation","dataTransfer","onAttachmentsChange","clipboardData","kind","getAsFile","focused","atwho","at","displayTpl","insertTpl","searchKey","callbacks","remoteFilter","getJSON","q","on","_storage","source","headPos","endPos","setMentions","onDrop","onFocus","onPaste","onBlur","post_length_min","CLASS_ACTIVE","CLASS_DEFAULT","CLASS_MINIMIZED","CLASS_FULLSCREEN","fullscreen","minimized","minimize","fullscreenEnter","fullscreenExit","PostingThreadOptions","isClosed","isHidden","isPinned","hide","unhide","pinGlobally","pinLocally","unpin","icons","closed","hidden","pinned","getIcons","pin","categoryOptions","getTitleValidators","getPostValidators","config","loadSuccess","loadError","non_field_errors","dialogProps","PostingDialogStart","Toolbar","showOptions","onTitleChange","onCategoryChange","onHide","onUnhide","onPinGlobally","onPinLocally","onUnpin","onPostChange","usernames","removedBlanks","pos","to","cleanUsernames","PostingDialogStartPrivate","onToChange","quoteText","newPost","context","onQuote","newContext","appendData","PostingDialogReply","originalPost","protect","is_protected","can_protect","originalPostSameAsCurrentPost","noAttachementsAdded","PostingDialogEditReply","mode","minLength","thread_title_length_min","limitValue","limit_value","show_value","maxLength","thread_title_length_max","post_length_max","validatePostLengthMin","getChoice","Icon","getIcon","getLabel","change","showActivation","val","getActivationButton","is_banned","is_online_hidden","is_offline_hidden","is_online","is_offline","getClass","StatusIcon","StatusLabel","banned_until","ban_expires","last_click","getHelp","getEmptyMessage","changed_by","changed_by_username","renderUserAvatar","renderUsername","old_username","new_username","changed_on","changes","hiddenOnMobile","showStatus","Status","JoinDate","Posts","Threads","Followers","getStatClassName","followers","stat","colClassName","cols","list","Array","apply","Number","call","iconOn","iconOff","labelOn","labelOff","locale","misago_locale","momentAgo","momentAgoNarrow","dayAt","tomorrowAt","yesterdayAt","minuteCompact","hourCompact","dayCompact","relativeNumeric","Intl","RelativeTimeFormat","numeric","DateTimeFormat","dateStyle","timeStyle","thisYearDate","month","day","thisYearDateNarrow","otherYearDate","year","otherYearDateNarrow","weekday","shortTime","absDiff","minutes","hours","days","getFullYear","sign","isSameDay","yesterday","setDate","getDate","isYesterday","isTomorrow","formatDayAtTime","getMonth","isOrdered","_items","order","values","values_only","_order","unordered","ordered","ordering","insertItem","insertAt","splice","iterations","updateLiveTimestamps","timestamp","getAttribute","_initializers","_context","initializer","OrderedList","orderedValues","fallback","has","hasAttribute","setAttribute","setInterval","patch","AUTH_SYNC_RATE","storage","include","AcceptAgreement","submiting","accept","reload","handleDecline","handleAccept","mount","signedIn","signedOut","getMessage","refresh","AuthMessage","NavbarBranding","logo","logoXs","NavbarExtraMenu","NotificationsDropdownBody","showAll","showUnread","unread","NotificationsDropdownBodyPill","active","NotificationsFetch","NavbarNotificationsToggle","badge","NavbarNotificationsDropdown","NavbarPrivateThreads","NavbarSearchToggle","NavbarSearchDropdown","Search","NavbarSiteNavToggle","NavbarSiteNavDropdown","SiteNav","NavbarUserNavToggle","NavbarUserNavDropdown","UserNav","branding","logo_small","logo_text","extraMenuItems","searchUrl","notificationsUrl","privateThreadsUrl","showSearch","can_search","addInitializer","ReactDOM","NotificationsOverlayBody","NotificationsOverlayBodyPill","NotificationsOverlay","notifications","NotificationsHeader","PageHeader","subtitle","parts","PillsNav","PillsNavLink","link","NotificationsPills","basename","NotificationsPagination","NotificationsPaginationLink","hasPrevious","firstCursor","lastCursor","hasNext","NotificationsToolbar","markAllAsRead","getSubtitle","route","getBaseUrl","PageContainer","readAll","mutating","toolbarProps","history","replaceState","browserHistory","routes","NotificationsRoute","startsWith","SideNav","option","CompactNav","hideNav","onPasswordChange","edit_details","DownloadData","data_downloads","downloads","isSubmiting","request_data_download","handleLoadDownloads","rowStyle","requested_on","DownloadButton","exportFile","colSpan","handleRequestDataDownload","verticalAlign","WATCH_CHOICES","NOTIFICATION_CHOICES","ForumOptionsForm","is_hiding_presence","limits_private_thread_invites_to","watch_started_threads","watch_replied_threads","watch_new_private_threads_by_followed","watch_new_private_threads_by_other_users","notify_new_private_threads_by_followed","notify_new_private_threads_by_other_users","privateThreadInvitesChoices","next_on","next_change","length_min","length_max","phrases","changes_left","name_changes_expire","slug","addNameChange","updateUsername","hydrate","getChangeForm","new_email","change_email","new_password","repeat_password","change_password","has_usable_password","page","FlexRow","WithDropdown","paths","ChangeForumOptions","EditDetails","delegateAuth","ChangeUsername","ChangeSignInCredentials","DeleteAccount","Options","expires_on","initWithPreloadedData","initWithoutPreloadedData","startPolling","profile","frequency","user_message","html","staff_message","isAfter","keys","getUserMessage","getStaffMessage","getExpirationMessage","getPanelBody","isAuthenticated","SafeValue","onEdit","showEditButton","details","load","editing","newDetails","loadDetails","profileDetails","edit","loadItems","next","Feed","loadMore","LoadMoreButton","isBusy","loadUsers","more","pages","setSpecialProps","PRELOADED_DATA_KEY","TITLE","API_FILTER","apiUrl","getMoreButton","getListBody","loadChanges","is_followed","follow","action","canMessage","can_start_private_threads","isProfileOwner","is_avatar_locked","avatar_lock_user_message","avatar_lock_staff_message","moderate_avatar","avatar_hash","getFormBody","getModalBody","moderate_username","countdown","isDeleted","with_content","getButtonLabel","getDeletedBody","getForm","AvatarControls","moderation","showAvatarDialog","rename","showRenameDialog","showDeleteDialog","is_active","ProfileModerationButton","available","getModeration","can_follow","delete","is_anonymous","can_rename","can_moderate_avatar","can_delete","COMPONENTS","follows","Follows","Details","UsernameHistory","BanDetails","Profile","RequestLinkForm","LinkSent","reset","RequestActivationLink","RequestResetForm","showInactivePage","AccountInactivePage","getActivateButton","RequestPasswordReset","ResetPasswordForm","PasswordChangedPage","SignInModal","showSignIn","updateSearch","urlQuery","pushState","providers","provider","updateUsers","updatePosts","onQueryChange","Badge","SearchTime","time","copy","LoadMore","appendPosts","updateProvider","Blankslate","components","TYPES_CLASSES","info","warning","Snackbar","snackbarClass","isVisible","getSnackbarClass","backendName","pageTitleTpl","pageTitle","backend","Register","emailProtected","onRegistrationComplete","step","stateUpdate","backend_name","emailHelpText","emailHelpTextTpl","SocialAuth","handleRegistrationComplete","op","updateAcl","participants","ModalHeader","onUsernameChange","can_add_participants","participant","confirmed","isUser","is_owner","can_change_owner","isModerator","can_moderate_private_threads","userIsOwner","UserStatus","isOwner","getUserIsOwner","utils","PollChoice","hash","proc","votes","getVotesLabel","ChoiceVotes","UserChoice","hydratedData","voters","voter","voted_on","ModalBody","ChoicesList","ChoiceDetails","VotesCount","VotesList","Voter","VoteDate","isPollOver","showVoting","is_public","can_edit","can_see_votes","can_vote","hasSelectedChoices","allow_revotes","controls","canVote","canChangeVote","ChangeVote","SeeVotes","Edit","Delete","control","newThreadAcl","DATE_ABBR","PollVotes","PollLength","PollIsPublic","PollCreation","getPoster","getPostedOn","absolute","relative","ends_on","getEndsOn","endsOn","question","PollChoicesLeft","choicesLeft","PollAllowRevote","ChoiceSelect","toggleChoice","getChoicesLeft","allowed_choices","getChoiceFromHash","deselectChoice","selectChoice","showResults","getIsPollOver","setChoices","canDelete","onDelete","onAdd","every","isEdit","PollPublicSwitch","ICON","changed_title","pinned_globally","pinned_locally","unpinned","moved","merged","approved","opened","unhid","hid","changed_owner","tookover","added_participant","owner_left","participant_left","removed_participant","event_type","can_hide","Hide","Unhide","hidden_on","hidden_by_name","hidden_by","USER_SPAN","USER_URL","Hidden","Poster","event_by","event_on","MESSAGE","ITEM_LINK","ITEM_SPAN","ChangedTitle","Moved","Merged","ChangedOwner","AddedParticipant","RemovedParticipant","msgstring","oldTitle","event_context","old_title","fromCategory","from_category","mergedThread","merged_thread","newOwner","is_read","initialized","observer","IntersectionObserver","entries","observe","entry","isIntersecting","primed","read","destroy","disconnect","ready","initialize","AttachmentPreview","AttachmentDetails","AttachmentThumbnail","AttachmentIcon","backgroundImage","can_see_hidden","Row","FlagBestAnswer","best_answer_marked_by","marked_on","best_answer_marked_on","marked_by","best_answer_marked_by_name","FlagHidden","FlagUnapproved","FlagProtected","approve","unprotect","like","lastLikes","last_likes","concatedLikes","finalLikes","is_liked","likes","unlike","previousState","ops","markAsBestAnswer","best_answer_is_protected","best_answer_marked_by_slug","patchThread","unmarkBestAnswer","hydrateLike","ModalDialog","LikesList","liked_on","likesCount","LikeDetails","liker_id","LikeDate","likedOn","can_reply","can_see_likes","can_like","MarkAsBestAnswer","MarkAsBestAnswerCompact","Like","Likes","LikesCompact","Reply","Quote","can_mark_best_answer","can_mark_as_best_answer","can_change_best_answer","hasLikes","getLikesMessage","u","hiddenLikes","otherUsers","lastUser","usernamesList","last_user","editor","move","new_thread","onUrlChange","DiffItem","revertEdit","canRevert","goToEdit","previous","GoBackBtn","goBack","GoForwardBtn","goForward","GoLastBtn","goLast","Label","RevertBtn","editor_name","edited_on","edited_by","hydrateEdit","edits","hydratedPost","PostingConfig","ModerationForm","isError","Error","Loader","categoryId","can_pin_threads","can_hide_threads","can_close_threads","isHiddenChoices","isClosedChoices","getWeightChoices","Modal","renderWeightField","renderHiddenField","renderClosedField","Permalink","UnmarkMarkBestAnswer","PostEdits","Approve","Move","Split","Protect","Unprotect","permaUrl","protocol","host","prompt","can_unmark_best_answer","isUnedited","can_approve","can_move","can_unhide","isSelected","can_merge_posts","UnreadLabel","UnreadCompact","PostedOn","PostedOnCompact","PostEditsCompacts","ProtectedLabel","postAuthor","hasAcl","hasVisibleTitle","ListItem","is_event","starter","starter_name","started_on","handleSuccessUnmounted","best_answers","merge","other_thread","post_set","ModalMessage","ModalLoading","successMessage","changeTitle","dropup","stickToBottom","watch","setNotifications","short_name","special_role","breadcrumbs","ThreadReplies","hasFlags","ThreadFlags","is_authenticated","enabled","resetScroll","ThreadPaginatorConnected","withRouter","router","scrollToTop","first","formData","min","max","last","PostErrors","heading","ids","rollback","isArray","Merge","can_merge","onReply","compact","is_new","new_post","unapproved_post","last_post","pollDisabled","onPoll","can_start_poll","setPageTitle","editPoll","shouldFetchData","fetchData","startPollingApi","stopPollingApi","params","delayed","threadModeration","getThreadModeration","postsModeration","getPostsModeration","openPollForm","openReplyForm","closePollForm","can_close","can_pin_globally","can_pin","can_unprotect","basePath","Route","compareLastPostAge","b","compareGlobalWeight","compareWeight","allItems","parentUrl","lists","longName","ThreadErrors","freezeThread","deleteThread","addThreads","filterThreads","categoriesMap","getFormdata","categoryChoices","can_start_threads","renderForm","renderCantMergeMessage","storeState","leftThreads","acls","renderCantMoveMessage","updateThread","threadsMap","failedThreads","noSelection","t","topCategory","topCategories","subCategory","subCategories","startThread","allow","getTopCategory","cat","subcategories","busyThreads","getModerationActions","last_post_on","last_poster","last_poster_name","isNew","activeCategory","showNotifications","updatedThreads","applyUpdate","loadThreads","getCategory","current","fromDb","currentMap","isThreadChanged","getSorting","currentState","sets","isMounted","pollResponse","index_header","index_title","specialRole","description","pageLead","threadsCount","applyDiff","PRIVATE_THREADS_LIST","getListOptions","can_see_unapproved_content_lists","getLists","getPageUrl","trackedPeriod","rankUrl","getUserStatus","getRankName","getUserTitle","counter","meta","posters","getLeadMessage","tracked_period","string","subString","n","stringCount","getRankDescription","getComponent","Rank","ActivePosters","Users","_element","_component","removeClass","attr","forum_index_title","reducer","initialState","doTick","UPDATE_AUTHENTICATED_USER","PATCH_USER","SIGN_IN","SIGN_OUT","signIn","signOut","soft","updatedState","UPDATE_AVATAR","userId","UPDATE_USERNAME","OPEN_SITE_NAV","OPEN_SEARCH","OPEN_NOTIFICATIONS","OPEN_PRIVATE_THREADS","OPEN_USER_NAV","CLOSE","openSiteNav","openSearch","openNotifications","openUserNav","privateThreads","REPLACE_PARTICIPANTS","BUSY_POLL","RELEASE_POLL","REMOVE_POLL","REPLACE_POLL","UPDATE_POLL","busy","release","hydrated","PATCH_POST","updated_on","hydrateAttachment","hydrateUser","APPEND_POSTS","SELECT_POST","DESELECT_POST","DESELECT_POSTS","LOAD_POSTS","UNLOAD_POSTS","UPDATE_POSTS","deselect","deselectAll","hydratePost","unload","selectedPosts","deseletedPosts","deseletedAllPosts","resultsIds","reducedPosts","postReducer","LOAD_DETAILS","HYDRATE_PROFILE","PATCH_PROFILE","hydrateStatus","REPLACE_SEARCH","UPDATE_SEARCH","UPDATE_SEARCH_PROVIDER","SELECT_ALL","SELECT_NONE","SELECT_ITEM","itemsIds","none","itemId","SHOW_SNACKBAR","HIDE_SNACKBAR","showSnackbar","messageType","hideSnackbar","BUSY_THREAD","RELEASE_THREAD","REPLACE_THREAD","UPDATE_THREAD","UPDATE_THREAD_ACL","APPEND_THREADS","DELETE_THREAD","FILTER_THREADS","HYDRATE_THREADS","PATCH_THREAD","SORT_THREADS","MODERATION_PERMISSIONS","sorting","hydrateThread","thread_acl","perm","mergedState","concatUnique","sort","itemCategory","lft","rght","patchedState","TICK","ADD_NAME_CHANGE","APPEND_HISTORY","HYDRATE_HISTORY","changedBy","hydrateNamechange","namechange","unshift","floor","APPEND_USERS","HYDRATE_USERS","_cookieName","_csrfToken","_locks","self","resolve","reject","xhr","getCsrfToken","contentType","dataType","jqXHR","responseJSON","statusText","lock","param","waiter","wait","processData","XMLHttpRequest","evt","lengthComputable","total","local","_store","_local","_modal","syncSession","watchState","getState","set","BaseCaptcha","_ajax","_include","_snackbar","NoCaptcha","QACaptcha","kwargs","ReCaptchaComponent","grecaptcha","render","sitekey","siteKey","binding","ReCaptcha","recaptcha_site_key","captcha_type","_captcha","init","staticUrl","_staticUrl","_included","script","remote","localStorage","_prefix","_watchers","e","newValueJson","parse","watcher","oldValue","setItem","itemString","getItem","show","indexTitle","forumName","_indexTitle","_forumName","finalTitle","_polls","stop","poolServer","_stopped","apiError","pollId","unsetBeforeUnload","_props","_isOpen","_isClosing","_mount","_observer","unobserve","_spacer","_mode","ResizeObserver","contentRect","_beforeunloadSet","beforeUnload","capture","returnValue","_realOpen","setBeforeUnload","_timeout","alert","_reducers","_initialState","createStore","combineReducers","_isLoaded","_loadedPromise","_loadingPromise","tries","plain","expires","getReasonMessage","RedrawedBannedPage","BannedPage","changeState","rowWidth","padding","m","bytes","roundSize","toFixed","ALPHA","ALPHA_LEN","len","chars","Component","rootElementId","connected","rootElement","finalComponent","int","childRoutes","onEnter","array","EMAIL","USERNAME","USERNAME_ALPHANUMERIC","String","requiredTermsOfService","requiredPrivacyPolicy","returnMessage","usernameMinLength","lengthMin","usernameMaxLength","lengthMax","usernameContent","valueTrimmed","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","r","getter","__esModule","d","definition","defineProperty","enumerable","chunkId","reduce","promises","miniCssF","g","globalThis","Function","hmd","create","obj","prop","prototype","l","done","needAttach","scripts","getElementsByTagName","s","charset","nc","onScriptComplete","prev","onerror","onload","doneFns","removeChild","bind","head","appendChild","Symbol","toStringTag","nmd","scriptUrl","importScripts","currentScript","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""}