├── .easignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── new_feature.md ├── pull_request_template.md └── workflows │ ├── build-app.yml │ ├── delete-build-jet-cache.yml │ ├── e2e-test-android.yml │ ├── main.yml │ ├── path-filters.yml │ ├── push-app.yml │ └── test.yml ├── .gitignore ├── .tool-versions ├── LICENSE ├── PROJECT.md ├── README.md ├── documentation ├── .gitignore ├── README.md ├── babel.config.js ├── beta_docs │ └── discourse-features.md ├── check-node-version.sh ├── docs │ ├── app-store.md │ ├── assets.md │ ├── commercial-support.md │ ├── concepts.md │ ├── contributing.md │ ├── customize.md │ ├── discourse-features.md │ ├── discourse-login-setup.md │ ├── discourse-plugin-enable.md │ ├── discourse-plugin-installation.md │ ├── discourse-plugin.md │ ├── email-deep-linking │ │ ├── intro.md │ │ └── setup │ │ │ ├── enable-email-deep-linking.md │ │ │ └── verify-email-deep-linking.md │ ├── env-mobile.md │ ├── intro.md │ ├── lexicon-updates.md │ ├── optimal.md │ ├── play-store.md │ ├── publish-app.md │ ├── push-notifications │ │ ├── introduction.md │ │ ├── plugin-interaction.md │ │ └── setup │ │ │ ├── enable-push-notifications.md │ │ │ └── verify-push-notifications.md │ ├── quick-start.md │ ├── rationale.md │ ├── setup.md │ ├── supported-devices.md │ ├── technologies.md │ ├── theming.md │ ├── troubleshooting-build.md │ ├── tutorial │ │ ├── building.md │ │ ├── intro.md │ │ ├── publishing.md │ │ ├── setup-cloud-server.md │ │ ├── setup-discourse.md │ │ ├── setup-mobile.md │ │ ├── setup.md │ │ ├── updating.md │ │ └── white-label.md │ └── white-labeling.md ├── docusaurus.config.js ├── package.json ├── sidebars.js ├── src │ ├── css │ │ ├── custom.css │ │ └── image.css │ └── pages │ │ ├── index.js │ │ ├── playground.tsx │ │ └── styles.module.css ├── static │ ├── .nojekyll │ └── img │ │ ├── favicon.ico │ │ ├── guides │ │ ├── playStore │ │ │ ├── build-artifact.png │ │ │ └── builds.png │ │ └── testFlight │ │ │ ├── add-app.png │ │ │ ├── app-connect.png │ │ │ ├── build-artifact.png │ │ │ ├── builds.png │ │ │ ├── new-app.png │ │ │ ├── register-app-id.png │ │ │ ├── review-contact.png │ │ │ ├── review-information.png │ │ │ └── review-signin.png │ │ ├── lexicon-architecture.png │ │ ├── lexicon-architecture.svg │ │ ├── logo.svg │ │ ├── push-notifications │ │ └── push-notifications-flowchart.svg │ │ ├── screenshot │ │ ├── Android_Comment.png │ │ ├── Android_DarkMode.png │ │ ├── Android_Home.png │ │ ├── Android_Login.png │ │ ├── Android_Message.png │ │ ├── Android_MessageReply.gif │ │ ├── Android_NewMessage.gif │ │ ├── Android_NewPost.gif │ │ ├── Android_NewPost.png │ │ ├── Android_Notifications.png │ │ ├── Android_PostDetail.png │ │ ├── Android_PostReply.gif │ │ ├── Android_Profile.png │ │ ├── Android_SignUp.png │ │ ├── IOS_Comment.png │ │ ├── IOS_DarkMode.png │ │ ├── IOS_Home.png │ │ ├── IOS_Login.png │ │ ├── IOS_Message.png │ │ ├── IOS_MessageReply.gif │ │ ├── IOS_NewMessage.gif │ │ ├── IOS_NewPost.gif │ │ ├── IOS_NewPost.png │ │ ├── IOS_Notification.png │ │ ├── IOS_PostDetail.png │ │ ├── IOS_PostReply.gif │ │ ├── IOS_Profile.png │ │ ├── IOS_SignUp.png │ │ ├── Mobile-LoginWithApple.png │ │ ├── Please_connect_network_error.png │ │ ├── Website_SignUp.png │ │ ├── add-ssh-key.png │ │ ├── authenticating-droplet.png │ │ ├── choose-a-plan.png │ │ ├── choose-image.png │ │ ├── control-panel.png │ │ ├── droplet-ip.png │ │ ├── droplets.png │ │ ├── finalizing-creating-droplet.png │ │ ├── playground.png │ │ ├── plugins │ │ │ ├── Discourse-Plugin-Email-notification.png │ │ │ ├── Discourse-Plugin-EmailDeepLinking-Settings.png │ │ │ ├── Discourse-Plugin-Enable.png │ │ │ ├── Discourse-Plugin-PushNotif-Settings.png │ │ │ ├── Discourse-Plugin-Settings.png │ │ │ ├── Mobile-PushNotification.png │ │ │ ├── version-2.2.0 │ │ │ │ ├── Discourse-Plugin-ActivationWithLink-Email.png │ │ │ │ ├── Discourse-Plugin-EmailDeepLinking-Settings.png │ │ │ │ ├── Discourse-Plugin-Enable-ActivationWithLink.png │ │ │ │ ├── Discourse-Plugin-Enable.png │ │ │ │ ├── Discourse-Plugin-Login-With-Apple-App-ID.png │ │ │ │ ├── Discourse-Plugin-Login-With-Apple.png │ │ │ │ ├── Discourse-Plugin-Login-With-Link.png │ │ │ │ ├── Discourse-Plugin-LoginWithLink-Email.png │ │ │ │ ├── Discourse-Plugin-PushNotif-Settings.png │ │ │ │ ├── Discourse-Plugin-Settings.png │ │ │ │ ├── Mobile-ActivationWithLink-Redirect.png │ │ │ │ ├── Mobile-LoginWithLink-Redirect.png │ │ │ │ └── Mobile-LoginWithLink.png │ │ │ └── version-3.0.0 │ │ │ │ ├── Discourse-Plugin-EmailDeepLinking-Settings.png │ │ │ │ ├── Discourse-Plugin-PushNotif-Settings.png │ │ │ │ └── Discourse-Plugin-Settings.png │ │ ├── region.jpeg │ │ ├── tablet │ │ │ ├── Tablet_Android_Landscape_Home.gif │ │ │ ├── Tablet_Android_Landscape_NewPost.gif │ │ │ ├── Tablet_Android_Landscape_Profile.gif │ │ │ ├── Tablet_Android_Landscape_ReplyMessage.gif │ │ │ ├── Tablet_Android_Portrait_Home.gif │ │ │ ├── Tablet_Android_Portrait_NewPost.gif │ │ │ ├── Tablet_Android_Portrait_Profile.gif │ │ │ ├── Tablet_Android_Portrait_ReplyMessage.gif │ │ │ ├── Tablet_IOS_Landscape_Home.gif │ │ │ ├── Tablet_IOS_Landscape_NewPost.gif │ │ │ ├── Tablet_IOS_Landscape_Profile.gif │ │ │ ├── Tablet_IOS_Landscape_ReplyMessage.gif │ │ │ ├── Tablet_IOS_Portrait_Home.gif │ │ │ ├── Tablet_IOS_Portrait_NewPost.gif │ │ │ ├── Tablet_IOS_Portrait_Profile.gif │ │ │ └── Tablet_IOS_Portrait_ReplyMessage.gif │ │ ├── terminal.png │ │ ├── user-api-keys │ │ │ ├── Discourse-App-Settings.png │ │ │ ├── Discourse-Profile-Security-Settings.png │ │ │ ├── Discourse-Settings-Auth-Redirect.png │ │ │ ├── Discourse-Settings-New-Auth-Redirect.png │ │ │ ├── Mobile-Authorize.png │ │ │ ├── Mobile-Discourse-Login.png │ │ │ └── Mobile-Welcome-Page.png │ │ ├── vscode-env.png │ │ └── vscode-file.png │ │ ├── undraw_docusaurus_mountain.svg │ │ ├── undraw_docusaurus_react.svg │ │ ├── undraw_docusaurus_tree.svg │ │ ├── version-3.0.0 │ │ ├── new-lexicon-architecture.png │ │ └── new-lexicon-architecture.svg │ │ └── version-3.2.0 │ │ └── push-notifications │ │ └── push-notifications-flowchart.svg ├── versioned_docs │ ├── version-1.0.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── dedicated.md │ │ ├── deployment.md │ │ ├── discourse-features.md │ │ ├── env-mobile.md │ │ ├── env-prose.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── install-prose.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ ├── version-2.0.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── dedicated.md │ │ ├── deployment.md │ │ ├── discourse-features.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-email-deep-linking.md │ │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── env-prose.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ │ ├── introduction.md │ │ │ ├── plugin-interaction.md │ │ │ └── setup │ │ │ │ ├── enable-push-notifications.md │ │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── install-prose.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ ├── version-2.1.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── dedicated.md │ │ ├── deployment.md │ │ ├── discourse-features.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-email-deep-linking.md │ │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── env-prose.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ │ ├── introduction.md │ │ │ ├── plugin-interaction.md │ │ │ └── setup │ │ │ │ ├── enable-push-notifications.md │ │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── install-prose.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ ├── version-2.2.0 │ │ ├── activation-with-link │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-activate-with-link.md │ │ │ │ └── verify-activate-with-link.md │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── dedicated.md │ │ ├── deployment.md │ │ ├── discourse-features.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-email-deep-linking.md │ │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── env-prose.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── login-with-apple │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-login-with-apple.md │ │ │ │ └── verify-login-with-apple.md │ │ ├── login-with-link │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-login-with-link.md │ │ │ │ └── verify-login-with-link.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ │ ├── introduction.md │ │ │ ├── plugin-interaction.md │ │ │ └── setup │ │ │ │ ├── enable-push-notifications.md │ │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── install-prose.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ ├── version-3.0.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── discourse-features.md │ │ ├── discourse-login-setup.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-email-deep-linking.md │ │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ │ ├── introduction.md │ │ │ ├── plugin-interaction.md │ │ │ └── setup │ │ │ │ ├── enable-push-notifications.md │ │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ ├── version-3.1.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── discourse-features.md │ │ ├── discourse-login-setup.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ │ ├── intro.md │ │ │ └── setup │ │ │ │ ├── enable-email-deep-linking.md │ │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ │ ├── introduction.md │ │ │ ├── plugin-interaction.md │ │ │ └── setup │ │ │ │ ├── enable-push-notifications.md │ │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ │ ├── building.md │ │ │ ├── intro.md │ │ │ ├── publishing.md │ │ │ ├── setup-cloud-server.md │ │ │ ├── setup-discourse.md │ │ │ ├── setup-mobile.md │ │ │ ├── setup.md │ │ │ ├── updating.md │ │ │ └── white-label.md │ │ └── white-labeling.md │ └── version-3.2.0 │ │ ├── app-store.md │ │ ├── assets.md │ │ ├── commercial-support.md │ │ ├── concepts.md │ │ ├── contributing.md │ │ ├── customize.md │ │ ├── discourse-features.md │ │ ├── discourse-login-setup.md │ │ ├── discourse-plugin-enable.md │ │ ├── discourse-plugin-installation.md │ │ ├── discourse-plugin.md │ │ ├── email-deep-linking │ │ ├── intro.md │ │ └── setup │ │ │ ├── enable-email-deep-linking.md │ │ │ └── verify-email-deep-linking.md │ │ ├── env-mobile.md │ │ ├── intro.md │ │ ├── lexicon-updates.md │ │ ├── optimal.md │ │ ├── play-store.md │ │ ├── publish-app.md │ │ ├── push-notifications │ │ ├── introduction.md │ │ ├── plugin-interaction.md │ │ └── setup │ │ │ ├── enable-push-notifications.md │ │ │ └── verify-push-notifications.md │ │ ├── quick-start.md │ │ ├── rationale.md │ │ ├── setup.md │ │ ├── supported-devices.md │ │ ├── technologies.md │ │ ├── theming.md │ │ ├── troubleshooting-build.md │ │ ├── tutorial │ │ ├── building.md │ │ ├── intro.md │ │ ├── publishing.md │ │ ├── setup-cloud-server.md │ │ ├── setup-discourse.md │ │ ├── setup-mobile.md │ │ ├── setup.md │ │ ├── updating.md │ │ └── white-label.md │ │ └── white-labeling.md ├── versioned_sidebars │ ├── version-1.0.0-sidebars.json │ ├── version-2.0.0-sidebars.json │ ├── version-2.1.0-sidebars.json │ ├── version-2.2.0-sidebars.json │ ├── version-3.0.0-sidebars.json │ ├── version-3.1.0-sidebars.json │ └── version-3.2.0-sidebars.json ├── versions.json └── yarn.lock ├── frontend ├── .detoxrc.js ├── .eslintignore ├── .gitignore ├── App.ts ├── Config.mock.ts ├── Config.ts ├── apollo.config.js ├── app.json ├── assets │ ├── favicon.png │ ├── icon.png │ ├── icons │ │ ├── Add.svg │ │ ├── AddCircle.svg │ │ ├── AdminPanel.svg │ │ ├── AlternateEmail.svg │ │ ├── ArrowUpward.svg │ │ ├── Ballot.svg │ │ ├── BoldText.svg │ │ ├── BulletList.svg │ │ ├── Cancel.svg │ │ ├── Chart.svg │ │ ├── CheckCircle.svg │ │ ├── ChevronDown.svg │ │ ├── ChevronRight.svg │ │ ├── ChevronUp.svg │ │ ├── Clock.svg │ │ ├── Close.svg │ │ ├── Collapsible.svg │ │ ├── Dark.svg │ │ ├── Delete.svg │ │ ├── Done.svg │ │ ├── Draft.svg │ │ ├── DropdownArrow.svg │ │ ├── Edit.svg │ │ ├── Event.svg │ │ ├── ExpandLess.svg │ │ ├── ExpandMore.svg │ │ ├── Folder.svg │ │ ├── Home.svg │ │ ├── Information.svg │ │ ├── ItalicText.svg │ │ ├── KeyboardHide.svg │ │ ├── Lexicon.svg │ │ ├── Likes.svg │ │ ├── Link.svg │ │ ├── Lock.svg │ │ ├── Mail.svg │ │ ├── More.svg │ │ ├── MoreVert.svg │ │ ├── NoConnection.svg │ │ ├── NotificationActive.svg │ │ ├── Notifications.svg │ │ ├── NumberList.svg │ │ ├── Online.svg │ │ ├── Person.svg │ │ ├── Photo.svg │ │ ├── Pin.svg │ │ ├── PoliceBadge.svg │ │ ├── Power.svg │ │ ├── QuoteText.svg │ │ ├── RemoveCircle.svg │ │ ├── Replies.svg │ │ ├── Search.svg │ │ ├── Send.svg │ │ ├── Settings.svg │ │ ├── SideBar.svg │ │ ├── SideBarAndroid.svg │ │ ├── Triangle.svg │ │ ├── Unreachable.svg │ │ ├── Views.svg │ │ ├── WarningCircle.svg │ │ └── chatBubble.svg │ └── images │ │ ├── imagePlaceholder.png │ │ ├── index.ts │ │ ├── logo.png │ │ ├── logoDark.png │ │ ├── splash.png │ │ └── splashDark.png ├── babel.config.js ├── codegen.ts ├── docs │ ├── DeepLinkRedirect.md │ ├── authentication.md │ ├── expoExperienceId.md │ └── testing │ │ ├── detox.md │ │ └── example-Ios-CI.md ├── e2e │ ├── global │ │ ├── constant.ts │ │ └── index.ts │ ├── helpers │ │ ├── deepLink.ts │ │ ├── index.ts │ │ ├── link.ts │ │ ├── logout.ts │ │ ├── poll.ts │ │ ├── post.ts │ │ ├── privateMessage.ts │ │ ├── tab.ts │ │ └── tooltip.ts │ ├── init.ts │ ├── jest.config.js │ ├── rest-mock │ │ ├── assets │ │ │ ├── grinning.png │ │ │ ├── heart_eyes.png │ │ │ └── smile.png │ │ ├── data │ │ │ ├── categories.ts │ │ │ ├── chat.ts │ │ │ ├── index.ts │ │ │ ├── messageDetails.ts │ │ │ ├── messages.ts │ │ │ ├── postDrafts.ts │ │ │ ├── posts.ts │ │ │ ├── site.ts │ │ │ ├── token.ts │ │ │ ├── topicDetails.ts │ │ │ ├── topics.ts │ │ │ └── users.ts │ │ ├── mswServer.ts │ │ ├── rest │ │ │ ├── aboutHandler.ts │ │ │ ├── categoriesHandler.ts │ │ │ ├── chatHandler.ts │ │ │ ├── draftHandler.ts │ │ │ ├── helper │ │ │ │ ├── index.ts │ │ │ │ └── parseNumber.ts │ │ │ ├── index.ts │ │ │ ├── messagesHandler.ts │ │ │ ├── notificationsHandler.ts │ │ │ ├── pollHandler.ts │ │ │ ├── profileHandler.ts │ │ │ ├── siteHandler.ts │ │ │ ├── timingsHandler.ts │ │ │ ├── topicsHandler.ts │ │ │ ├── userActivityHandler.ts │ │ │ ├── userHandler.ts │ │ │ └── userStatusHandler.ts │ │ └── utils │ │ │ ├── index.ts │ │ │ └── transformSnakeCase.ts │ └── tests │ │ ├── activity.e2e.ts │ │ ├── chat.e2e.ts │ │ ├── collapsible.e2e.ts │ │ ├── deepLink.e2e.ts │ │ ├── draft.e2e.ts │ │ ├── messages.e2e.ts │ │ ├── polls.e2e.ts │ │ ├── profile.e2e.ts │ │ ├── topics.e2e.ts │ │ └── userStatus.e2e.ts ├── eas.json ├── index.js ├── metro.config.js ├── package.json ├── patches │ ├── @react-navigation+stack+6.2.2.patch │ ├── react-native-animated-progress+1.0.2.patch │ ├── react-native-modal-datetime-picker+17.1.0.patch │ ├── react-native-reanimated+3.10.1.patch │ ├── react-native-skeleton-placeholder+5.2.4.patch │ ├── reactotron-core-client+2.9.6.patch │ └── reactotron-react-native+5.1.10.patch ├── reactotronConfig.js ├── scripts │ ├── android-E2E.sh │ └── rename-generated-files.js ├── src │ ├── App.tsx │ ├── __mocks__ │ │ ├── mockData.ts │ │ ├── mockQuery.ts │ │ ├── setup.js │ │ ├── setupLinking.ts │ │ └── svgMock.js │ ├── api │ │ ├── bodyBuilder │ │ │ ├── index.ts │ │ │ ├── newMessage.ts │ │ │ ├── timings.ts │ │ │ └── votePoll.ts │ │ ├── bodySerializers │ │ │ ├── fileEncode.ts │ │ │ └── index.ts │ │ ├── client.ts │ │ ├── dataLoader │ │ │ ├── index.ts │ │ │ └── searchUsersDataLoader.ts │ │ ├── discourse-apollo-rest │ │ │ ├── about.ts │ │ │ ├── addEmail.ts │ │ │ ├── auth.ts │ │ │ ├── changePassword.ts │ │ │ ├── channels.ts │ │ │ ├── chatChannel.ts │ │ │ ├── deleteEmail.ts │ │ │ ├── editProfile.ts │ │ │ ├── flagPost.ts │ │ │ ├── getTopicDetail.ts │ │ │ ├── likePost.ts │ │ │ ├── lookupUrls.ts │ │ │ ├── messages.ts │ │ │ ├── newTopic.ts │ │ │ ├── notification.ts │ │ │ ├── poll.ts │ │ │ ├── postDraft.ts │ │ │ ├── postRaw.ts │ │ │ ├── profile.ts │ │ │ ├── readChat.ts │ │ │ ├── reply.ts │ │ │ ├── replyChat.ts │ │ │ ├── schema.graphql │ │ │ ├── search.ts │ │ │ ├── setPrimaryEmail.ts │ │ │ ├── site.ts │ │ │ ├── thread.ts │ │ │ ├── timings.ts │ │ │ ├── topics.ts │ │ │ ├── upload.ts │ │ │ ├── userActivity.ts │ │ │ ├── userStatus.ts │ │ │ └── utils.ts │ │ ├── pathBuilder │ │ │ ├── chatChannelMessages.ts │ │ │ ├── deleteEmail.ts │ │ │ ├── deletePostDraft.ts │ │ │ ├── getChatChannels.ts │ │ │ ├── helper │ │ │ │ ├── __tests__ │ │ │ │ │ └── parseTopicUrl.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── parseTopicUrl.ts │ │ │ ├── index.ts │ │ │ ├── likeTopicOrPost.ts │ │ │ ├── message.ts │ │ │ ├── notifications.ts │ │ │ ├── postDraft.ts │ │ │ ├── searchPost.ts │ │ │ ├── searchTag.ts │ │ │ ├── threadMessages.ts │ │ │ ├── topicDetail.ts │ │ │ └── topics.ts │ │ ├── resolver │ │ │ ├── helper │ │ │ │ ├── getUpdatedLikedTopic.ts │ │ │ │ └── likeErrorHandler.ts │ │ │ ├── index.ts │ │ │ ├── locale │ │ │ │ └── index.ts │ │ │ ├── mutation │ │ │ │ ├── createAndUpdatePostDraft.ts │ │ │ │ ├── editProfile.ts │ │ │ │ ├── likeTopicOrPost.ts │ │ │ │ └── logout.ts │ │ │ └── query │ │ │ │ └── privateMessage.ts │ │ ├── responseTransformer │ │ │ ├── CheckPostDraftResult.ts │ │ │ ├── JoinLeaveChannelOutput.ts │ │ │ ├── ListPostDraftsResult.ts │ │ │ ├── Post.ts │ │ │ ├── ReplyingToOutput.ts │ │ │ ├── changePasswordOutput.ts │ │ │ ├── helper │ │ │ │ ├── __tests__ │ │ │ │ │ └── transformDraftData.test.ts │ │ │ │ ├── index.ts │ │ │ │ └── transformDraftData.ts │ │ │ ├── index.ts │ │ │ ├── searchTagOutput.ts │ │ │ ├── stringOutput.ts │ │ │ └── userActions.ts │ │ └── typePatcher │ │ │ ├── about.ts │ │ │ ├── categoryList.ts │ │ │ ├── changeProfileOutput.ts │ │ │ ├── chatChannelMessages.ts │ │ │ ├── getChatChannelsOutput.ts │ │ │ ├── getThreadDetailOutput.ts │ │ │ ├── getThreadMessagesOutput.ts │ │ │ ├── helper │ │ │ ├── Post.ts │ │ │ ├── index.ts │ │ │ └── poll.ts │ │ │ ├── index.ts │ │ │ ├── lookupUrls.ts │ │ │ ├── pollActionOutput.ts │ │ │ ├── post.ts │ │ │ ├── postRaw.ts │ │ │ ├── privateMessageDetailOutput.ts │ │ │ ├── privateMessageOutput.ts │ │ │ ├── profileOutput.ts │ │ │ ├── searchOutput.ts │ │ │ ├── searchUserOutput.ts │ │ │ ├── siteOutput.ts │ │ │ ├── topicDetailOutput.ts │ │ │ ├── topicsOutput.ts │ │ │ ├── types │ │ │ └── userActions.ts │ │ │ ├── uploadOutput.ts │ │ │ ├── userActions.ts │ │ │ ├── userUnreadNotifications.ts │ │ │ └── votePollOutput.ts │ ├── components │ │ ├── ActionSheet │ │ │ ├── ActionSheet.tsx │ │ │ └── ActionSheetItem.tsx │ │ ├── AlertBanner.tsx │ │ ├── Author.tsx │ │ ├── AvatarRow.tsx │ │ ├── BottomMenu.tsx │ │ ├── CustomFlatList │ │ │ ├── CustomFlatList.tsx │ │ │ └── index.ts │ │ ├── DateTimePicker.tsx │ │ ├── Dropdown.tsx │ │ ├── ErrorBoundary.tsx │ │ ├── FooterLoadingIndicator.tsx │ │ ├── Header │ │ │ ├── CustomHeader.tsx │ │ │ ├── HeaderItem.tsx │ │ │ ├── ModalHeader.tsx │ │ │ └── index.tsx │ │ ├── KeyboardTextAreaScrollView.tsx │ │ ├── LoadingOrError.tsx │ │ ├── LoadingOverlay.tsx │ │ ├── Markdown.tsx │ │ ├── MarkdownContent.tsx │ │ ├── MentionList.tsx │ │ ├── Metrics │ │ │ ├── MetricItem.tsx │ │ │ └── Metrics.tsx │ │ ├── NestedComment.tsx │ │ ├── Poll │ │ │ ├── ListCreatePoll.tsx │ │ │ ├── PollChoiceCard.tsx │ │ │ ├── PollOptionItem.tsx │ │ │ ├── PollPostPreview.tsx │ │ │ ├── PollPreview.tsx │ │ │ └── index.ts │ │ ├── PostItem │ │ │ ├── HomePostItem.tsx │ │ │ ├── PostDetailHeaderItem.tsx │ │ │ ├── PostGroupings.tsx │ │ │ ├── PostHidden.tsx │ │ │ ├── PostItem.tsx │ │ │ ├── PostItemFooter.tsx │ │ │ ├── SearchPostItem.tsx │ │ │ ├── UserInformationPostItem.tsx │ │ │ └── index.ts │ │ ├── PostList.tsx │ │ ├── RepliedPost.tsx │ │ ├── RequestError.tsx │ │ ├── SearchBar.tsx │ │ ├── SegmentedControl.tsx │ │ ├── SelectImagePreviewEdit.tsx │ │ ├── ShowImageModal.tsx │ │ ├── StackedAvatars.tsx │ │ ├── TextArea.tsx │ │ ├── Toast.tsx │ │ ├── UserStatus.tsx │ │ └── index.ts │ ├── constants │ │ ├── __tests__ │ │ │ └── getDiscourseEndpoint.test.ts │ │ ├── alert.ts │ │ ├── api.ts │ │ ├── app.ts │ │ ├── defaultValues.ts │ │ ├── draftSaveState.ts │ │ ├── emoji.ts │ │ ├── errorTypes.ts │ │ ├── index.ts │ │ ├── links.ts │ │ ├── postDraft.ts │ │ ├── refetch.ts │ │ ├── regex.ts │ │ ├── route.ts │ │ ├── theme │ │ │ ├── animations.ts │ │ │ ├── colors.ts │ │ │ ├── fonts.ts │ │ │ ├── graphs.ts │ │ │ ├── icons.ts │ │ │ ├── images.ts │ │ │ ├── index.ts │ │ │ └── spacing.ts │ │ └── wordings.ts │ ├── core-ui │ │ ├── ActivityIndicator.tsx │ │ ├── AppleSignInButton.tsx │ │ ├── Avatar │ │ │ ├── LetterAvatar.tsx │ │ │ └── index.tsx │ │ ├── Button.tsx │ │ ├── CachedImage.tsx │ │ ├── ChatBubble.tsx │ │ ├── Chip.tsx │ │ ├── ChipRow.tsx │ │ ├── CustomImage.tsx │ │ ├── Divider.tsx │ │ ├── Dot.tsx │ │ ├── Emoji.tsx │ │ ├── FloatingButton.tsx │ │ ├── Icon.tsx │ │ ├── IconWithLabel.tsx │ │ ├── Link.tsx │ │ ├── MentionedText.tsx │ │ ├── RadioButton.tsx │ │ ├── Text.tsx │ │ ├── TextInput.tsx │ │ └── index.ts │ ├── helpers │ │ ├── PrivateTopicAlert.ts │ │ ├── PushNotificationsSetupFailAlert.ts │ │ ├── __tests__ │ │ │ ├── addHour.test.ts │ │ │ ├── automaticFontColor.test.ts │ │ │ ├── capitalizeFirstLetter.test.ts │ │ │ ├── chatMessageSceneHelper.test.ts │ │ │ ├── checkImageFile.test.ts │ │ │ ├── collapsible.test.ts │ │ │ ├── colorScheme.test.ts │ │ │ ├── compareTime.test.ts │ │ │ ├── convertPollMarkdown.test.ts │ │ │ ├── convertUrl.ts │ │ │ ├── deleteQuoteBbCode.test.ts │ │ │ ├── emojiHandler.test.ts │ │ │ ├── existingPostIsValid.test.ts │ │ │ ├── experienceId.test.ts │ │ │ ├── extractAttributes.test.ts │ │ │ ├── fontFormatting.test.ts │ │ │ ├── formatCount.test.ts │ │ │ ├── formatDateTime.test.ts │ │ │ ├── formatExtensions.test.ts │ │ │ ├── formatRelativeTime.test.ts │ │ │ ├── formatTag.test.ts │ │ │ ├── generatePollFormFromMarkdown.test.ts │ │ │ ├── generatePollMarkdown.test.ts │ │ │ ├── generateSlug.test.ts │ │ │ ├── getDistanceToNow.test.ts │ │ │ ├── getFormat.test.ts │ │ │ ├── getHyperlink.test.ts │ │ │ ├── getMimeFromImagePicker.test.ts │ │ │ ├── getUserImage.test.ts │ │ │ ├── linking.test.ts │ │ │ ├── listNumberStep.test.ts │ │ │ ├── newPostIsValid.test.ts │ │ │ ├── paginationHandler.test.ts │ │ │ ├── pollUtility.test.ts │ │ │ ├── postDetailContentHandler.test.ts │ │ │ ├── privateMessageRecipientsDraft.test.ts │ │ │ ├── privateMessageReplyImageHandler.test.ts │ │ │ ├── processRawContent.test.ts │ │ │ ├── relatedUsers.test.ts │ │ │ ├── replaceQuotesWithMarkdown.test.ts │ │ │ ├── stripHTML.test.ts │ │ │ ├── unescapeHTML.test.ts │ │ │ └── updateLike.test.ts │ │ ├── addHour.ts │ │ ├── api │ │ │ ├── __test__ │ │ │ │ ├── getPosterTypeDetails.test.ts │ │ │ │ ├── poll.test.ts │ │ │ │ └── processRawContent.test.ts │ │ │ ├── getPosterTypeDetails.ts │ │ │ ├── getTopicAuthor.ts │ │ │ ├── index.ts │ │ │ ├── poll.ts │ │ │ ├── privateMessagesMerger.ts │ │ │ └── processRawContent.ts │ │ ├── automaticFontColor.ts │ │ ├── bottomMenu.ts │ │ ├── capitalizeFirstLetter.ts │ │ ├── chatMessageSceneHelper.ts │ │ ├── checkImageFile.ts │ │ ├── checkPostDraftAlert.ts │ │ ├── clampWorklet.ts │ │ ├── collapsible.ts │ │ ├── colorScheme.ts │ │ ├── compareTime.ts │ │ ├── convertPollMarkdown.ts │ │ ├── convertUrl.ts │ │ ├── createCachedStorage.mock.tsx │ │ ├── createCachedStorage.tsx │ │ ├── createReactNativeFile.ts │ │ ├── deleteQuoteBbCode.ts │ │ ├── emojiHandler.ts │ │ ├── errorHandler.ts │ │ ├── errorMessage.ts │ │ ├── existingPostIsValid.ts │ │ ├── experienceId.ts │ │ ├── extractAttributes.ts │ │ ├── findChannelByCategoryId.ts │ │ ├── fontFormatting.ts │ │ ├── formatCount.ts │ │ ├── formatDateTime.ts │ │ ├── formatExtensions.ts │ │ ├── formatRelativeTime.ts │ │ ├── formatTag.ts │ │ ├── generatePollFormFromMarkdown.ts │ │ ├── generatePollMarkdown.ts │ │ ├── generateSlug.ts │ │ ├── getDistanceToNow.ts │ │ ├── getExpoPushTokenHandler.mock.ts │ │ ├── getExpoPushTokenHandler.ts │ │ ├── getFetchMorePostIds.ts │ │ ├── getFormat.ts │ │ ├── getHyperlink.ts │ │ ├── getMimeFromImagePicker.ts │ │ ├── getTextInputRules.ts │ │ ├── getTopicDetailOutputCacheBehavior.ts │ │ ├── getUserImage.ts │ │ ├── goBackWithoutSaveDraftAlert.ts │ │ ├── handleDuplicates.ts │ │ ├── imagePickerHandler.ts │ │ ├── imageUploadHandler.ts │ │ ├── index.ts │ │ ├── insertHyperlink.ts │ │ ├── linking.ts │ │ ├── listNumberStep.ts │ │ ├── localStorage.tsx │ │ ├── mentionHelper.ts │ │ ├── messageDetailHandler.ts │ │ ├── navigateInProfile.ts │ │ ├── newPostIsValid.ts │ │ ├── notificationHandler.ts │ │ ├── paginationHandler.ts │ │ ├── parser.ts │ │ ├── pickImage.ts │ │ ├── pollUtility.ts │ │ ├── postDetailContentHandler.ts │ │ ├── postDraftContentHandler.ts │ │ ├── privateMessageRecipientsDraft.ts │ │ ├── privateMessageReplyImageHandler.ts │ │ ├── processRawContent.ts │ │ ├── relatedUsers.ts │ │ ├── replaceQuotesWithMarkdown.ts │ │ ├── saveAndDiscardPostDraftAlert.ts │ │ ├── secureStore.ts │ │ ├── showErrorFormAlert.ts │ │ ├── showLogoutAlert.ts │ │ ├── storage.mock.ts │ │ ├── storage.ts │ │ ├── stripHTML.ts │ │ ├── textArea.ts │ │ ├── token.ts │ │ ├── transformTopicToPost.ts │ │ ├── unescapeHTML.ts │ │ └── updateLike.ts │ ├── hooks │ │ ├── index.ts │ │ ├── rest │ │ │ ├── auth │ │ │ │ ├── useLogout.ts │ │ │ │ └── usePushNotifications.ts │ │ │ ├── chat │ │ │ │ ├── useChatChannelDetail.ts │ │ │ │ ├── useChatChannelMessages.ts │ │ │ │ ├── useCreateThread.ts │ │ │ │ ├── useGetChatChannels.ts │ │ │ │ ├── useGetThreadDetail.ts │ │ │ │ ├── useGetThreadMessages.ts │ │ │ │ ├── useJoinChannel.ts │ │ │ │ ├── useLeaveChannel.ts │ │ │ │ ├── useMarkReadChat.ts │ │ │ │ └── useReplyChat.ts │ │ │ ├── draft │ │ │ │ ├── useCheckPostDraft.ts │ │ │ │ ├── useCreateAndUpdatePostDraft.ts │ │ │ │ ├── useDeletePostDraft.ts │ │ │ │ └── useListPostDrafts.ts │ │ │ ├── poll │ │ │ │ ├── useTogglePollStatus.ts │ │ │ │ ├── useUndoVotePoll.ts │ │ │ │ └── useVotePoll.ts │ │ │ ├── post │ │ │ │ ├── useActivity.ts │ │ │ │ ├── useEditPost.ts │ │ │ │ ├── useEditTopic.ts │ │ │ │ ├── useFlagPost.ts │ │ │ │ ├── useLeaveMessage.ts │ │ │ │ ├── useLikeTopicOrPost.ts │ │ │ │ ├── useLookupUrls.ts │ │ │ │ ├── useMention.ts │ │ │ │ ├── useMessageDetail.ts │ │ │ │ ├── useMessageList.ts │ │ │ │ ├── useNewMessage.ts │ │ │ │ ├── useNewTopic.ts │ │ │ │ ├── usePost.ts │ │ │ │ ├── usePostRaw.ts │ │ │ │ ├── useReplyTopic.ts │ │ │ │ ├── useReplyingTo.ts │ │ │ │ ├── useSearchPost.ts │ │ │ │ ├── useTags.ts │ │ │ │ ├── useTiming.ts │ │ │ │ ├── useTopicDetail.ts │ │ │ │ └── useTopicList.ts │ │ │ ├── profile │ │ │ │ ├── useChangePassword.ts │ │ │ │ ├── useEmail.ts │ │ │ │ ├── useNotification.ts │ │ │ │ └── useProfile.ts │ │ │ ├── site │ │ │ │ ├── useAbout.ts │ │ │ │ ├── useChannels.ts │ │ │ │ └── useSiteSettings.ts │ │ │ ├── useUpload.ts │ │ │ └── user │ │ │ │ ├── useDeleteUserStatus.ts │ │ │ │ ├── useEditUserStatus.ts │ │ │ │ └── useSearchUsers.ts │ │ ├── useAutoSaveManager.ts │ │ ├── useAutoSavePostDraft.ts │ │ ├── useGetUrlEmoji.ts │ │ ├── useInitialLoad.tsx │ │ ├── useKASVWorkaround.ts │ │ ├── useKeyboardListener.ts │ │ ├── useLoadFonts.ts │ │ ├── useLoadMorePost.ts │ │ ├── usePolling.ts │ │ └── useUpdateApp.ts │ ├── i18n │ │ └── translate.ts │ ├── icons.ts │ ├── navigation │ │ ├── AppNavigator.tsx │ │ ├── NavigationService.tsx │ │ ├── ProfileDrawerNavigator.tsx │ │ ├── ProfileStackNavigator.tsx │ │ ├── RootStackNavigator.tsx │ │ └── TabNavigator.tsx │ ├── polyfills.ts │ ├── reactiveVars │ │ ├── index.tsx │ │ ├── tokenReactive.mock.tsx │ │ └── tokenReactive.tsx │ ├── screens │ │ ├── Activity.tsx │ │ ├── AddEmail.tsx │ │ ├── AuthenticationWebView.tsx │ │ ├── ChangePassword.tsx │ │ ├── Channels │ │ │ ├── ChannelSideBarContent.tsx │ │ │ ├── ChannelSideBarDrawer.tsx │ │ │ ├── Channels.tsx │ │ │ ├── Components │ │ │ │ └── ChannelItem.tsx │ │ │ └── index.ts │ │ ├── Chat │ │ │ ├── ChannelChat.tsx │ │ │ ├── ChatChannelDetail.tsx │ │ │ ├── ThreadDetails.tsx │ │ │ └── components │ │ │ │ ├── ChannelItem.tsx │ │ │ │ ├── ChannelList.tsx │ │ │ │ ├── ChatList.tsx │ │ │ │ ├── ChatMessageItem.tsx │ │ │ │ ├── FooterReplyChat.tsx │ │ │ │ ├── Search.tsx │ │ │ │ ├── ThreadDetailsHeader.tsx │ │ │ │ └── index.ts │ │ ├── EditProfile.tsx │ │ ├── EditUserStatus │ │ │ ├── EditUserStatus.tsx │ │ │ └── components │ │ │ │ └── DateTimeButton.tsx │ │ ├── EmailAddress │ │ │ ├── EmailAddress.tsx │ │ │ └── components │ │ │ │ └── EmailAddressItem.tsx │ │ ├── EmojiPicker.tsx │ │ ├── FlagPost.tsx │ │ ├── Home │ │ │ ├── Home.tsx │ │ │ └── components │ │ │ │ ├── HomeNavBar.tsx │ │ │ │ ├── HomeTabletNavBar.tsx │ │ │ │ ├── SearchBar.tsx │ │ │ │ └── index.ts │ │ ├── Hyperlink.tsx │ │ ├── MessageDetail │ │ │ ├── EditPollsList.tsx │ │ │ ├── ImagePreview.tsx │ │ │ ├── MessageDetail.tsx │ │ │ ├── Poll.tsx │ │ │ └── components │ │ │ │ ├── ListImageSelected.tsx │ │ │ │ ├── MessageItem.tsx │ │ │ │ ├── PollChatBubble.tsx │ │ │ │ ├── ReplyInputField.tsx │ │ │ │ ├── ToolTip.tsx │ │ │ │ └── index.ts │ │ ├── Messages │ │ │ ├── Components │ │ │ │ ├── MessageAvatar.tsx │ │ │ │ ├── MessageCard.tsx │ │ │ │ ├── MessageContent.tsx │ │ │ │ ├── MessageNotification.tsx │ │ │ │ └── index.ts │ │ │ └── Messages.tsx │ │ ├── NewMessage.tsx │ │ ├── NewPoll.tsx │ │ ├── NewPost.tsx │ │ ├── Notifications │ │ │ ├── Notifications.tsx │ │ │ └── components │ │ │ │ └── NotificationItem.tsx │ │ ├── PostDetail │ │ │ ├── PostDetail.tsx │ │ │ ├── PostDetailSkeletonLoading.tsx │ │ │ ├── hooks │ │ │ │ ├── index.tsx │ │ │ │ └── useNotificationScroll.tsx │ │ │ └── index.tsx │ │ ├── PostDraft.tsx │ │ ├── PostImagePreview.tsx │ │ ├── PostPreview.tsx │ │ ├── PostReply.tsx │ │ ├── Preferences │ │ │ ├── DarkMode.tsx │ │ │ ├── Preferences.tsx │ │ │ ├── PushNotifications.tsx │ │ │ └── components │ │ │ │ ├── SettingsItem.tsx │ │ │ │ └── SettingsSwitch.tsx │ │ ├── Profile │ │ │ ├── Profile.tsx │ │ │ └── components │ │ │ │ └── MenuItem.tsx │ │ ├── Search.tsx │ │ ├── SelectUser │ │ │ ├── SelectUser.tsx │ │ │ └── components │ │ │ │ └── UserItem.tsx │ │ ├── StackAvatarModal.tsx │ │ ├── Tags │ │ │ ├── Tags.tsx │ │ │ └── components │ │ │ │ ├── AvailableTags.tsx │ │ │ │ ├── SelectedTags.tsx │ │ │ │ ├── TagItem.tsx │ │ │ │ └── index.ts │ │ ├── Troubleshoot.tsx │ │ ├── UserInformation.tsx │ │ ├── Welcome.tsx │ │ └── index.ts │ ├── theme │ │ ├── AppearanceProvider.tsx │ │ ├── ThemeProvider.tsx │ │ ├── index.ts │ │ ├── makeStyles.ts │ │ └── theme.ts │ ├── types │ │ ├── ContentState.ts │ │ ├── DiscourseNotification.ts │ │ ├── ErrorSchema.ts │ │ ├── Form.ts │ │ ├── Hook.ts │ │ ├── Navigation.ts │ │ ├── NumericString.ts │ │ ├── Post.ts │ │ ├── Theme.ts │ │ ├── Types.ts │ │ ├── __tests__ │ │ │ └── NumericString.test.ts │ │ ├── api │ │ │ ├── chat.ts │ │ │ ├── group.ts │ │ │ ├── index.ts │ │ │ ├── message.ts │ │ │ ├── poll.ts │ │ │ ├── post.ts │ │ │ ├── postDraft.ts │ │ │ ├── topic.ts │ │ │ └── user.ts │ │ ├── chat.ts │ │ ├── global.d.ts │ │ ├── imports.d.ts │ │ ├── index.ts │ │ ├── markdown-it-flowdock.d.ts │ │ ├── pagination.ts │ │ └── react-native-animated-progress.d.ts │ └── utils │ │ ├── AuthProvider.tsx │ │ ├── DeviceProvider.tsx │ │ ├── ModalProvider.tsx │ │ ├── OngoingLikedTopicProvider.tsx │ │ ├── PushNotificationsProvider.tsx │ │ ├── RedirectProvider.tsx │ │ ├── index.ts │ │ ├── useLazyQuery.ts │ │ ├── useMutation.ts │ │ └── useQuery.ts ├── tsconfig.json └── yarn.lock ├── package.json └── yarn.lock /.easignore: -------------------------------------------------------------------------------- 1 | node_modules/**/* 2 | npm-debug.* 3 | 4 | .expo/* 5 | */coverage 6 | */.env 7 | */playstore_secret.json 8 | 9 | frontend/web-build/ 10 | frontend/dist 11 | 12 | api/lib 13 | 14 | # macOS 15 | .DS_Store 16 | 17 | # Ignoring other directories 18 | /documentation 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/new_feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New Feature 3 | about: A new Lexicon feature 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Description 11 | 12 | ## Acceptance Criteria 13 | - [ ] 14 | 15 | ## Guidance 16 | -------------------------------------------------------------------------------- /.github/workflows/delete-build-jet-cache.yml: -------------------------------------------------------------------------------- 1 | name: Manually Delete BuildJet Cache 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | cache_key: 7 | description: 'BuildJet Cache Key to Delete' 8 | required: true 9 | type: string 10 | jobs: 11 | manually-delete-buildjet-cache: 12 | runs-on: buildjet-2vcpu-ubuntu-2204 13 | steps: 14 | - name: Checkout 15 | uses: actions/checkout@v3 16 | - uses: buildjet/cache-delete@v1 17 | with: 18 | cache_key: ${{ inputs.cache_key }} 19 | 20 | - name: Stop Workflow 21 | if: ${{ success() }} 22 | run: exit 0 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | node_modules/ 3 | .DS_Store 4 | sync.sh 5 | .expo/ -------------------------------------------------------------------------------- /.tool-versions: -------------------------------------------------------------------------------- 1 | nodejs 16.20.0 -------------------------------------------------------------------------------- /documentation/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /documentation/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /documentation/check-node-version.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | node_required=18 4 | 5 | # Get the major version of Node 6 | node_current=$(node -v | awk -F \. {'print substr($1,2)'}) 7 | 8 | if [[ "$node_current" -lt "$node_required" ]]; then 9 | echo "NOTE: the Lexicon documentation requires Node >= 18.0." 10 | echo "Your current Node version is $(node -v)" 11 | echo "\n" 12 | echo "This is a requirement of our tooling, Docusaurus (>= 3.0)." 13 | echo "To help make this less of a pain, we recommend you install a tool like nvm (Node Version Manager)." 14 | echo "This allows you to easily switch between Node versions for situations like this." 15 | echo "\n" 16 | echo "https://github.com/nvm-sh/nvm" 17 | echo "\n" 18 | 19 | exit 1; 20 | fi; 21 | -------------------------------------------------------------------------------- /documentation/docs/commercial-support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Commercial Support 3 | --- 4 | 5 | With official support, you get expert help straight from the core team. We provide app customization, dedicated support, prioritize feature requests, deployment strategies, advice on best practices, design decisions, and team augmentation. 6 | 7 | Additionally, we are open to engagements for non-technical site owners looking to customize, deploy, and launch a mobile app for their Discourse users. 8 | 9 | Reach out to us for consulting at support@kodefox.com. 10 | -------------------------------------------------------------------------------- /documentation/docs/email-deep-linking/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: intro 3 | title: Introduction 4 | slug: discourse-plugin/email-deep-linking 5 | --- 6 | 7 | The Lexicon Discourse plugin provides support for integrating Discourse's email notifications with your Lexicon-powered mobile app. Our plugin modifies links in specific Discourse emails so that when a relevant link is tapped and the user has your Lexicon-powered mobile app installed, it will open the app to the relevant topic or post. Otherwise, it will fall back to opening the topic in the device's web browser as it normally would. 8 | 9 | This section of the documentation offers step-by-step instructions to integrate email deep linking into your Discourse site so that your users have a more seamless experience with your Lexicon-powered mobile app. 10 | -------------------------------------------------------------------------------- /documentation/docs/publish-app.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Publishing your App 3 | --- 4 | 5 | :::danger Progress 6 | This page has not been started yet or needs a lot more work. 7 | ::: 8 | 9 | Expo workflow, benefits of, etc. 10 | 11 | Over the air updates? 12 | -------------------------------------------------------------------------------- /documentation/docs/push-notifications/introduction.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Introduction 3 | slug: /push-notifications 4 | --- 5 | 6 | The Lexicon Discourse plugin provides support for native push notifications for your Lexicon-powered mobile app. This works for both Android and iOS, and is handled by Expo's [push notifications service](https://docs.expo.dev/push-notifications/overview/). 7 | 8 | This documentation offers step-by-step instructions to seamlessly integrate push notifications into your Discourse site so that your users receive them in your Lexicon-powered mobile app. By following this guide, you will be able to enhance the UX of your users by ensuring they receive timely and engaging notifications about activity on your Discourse site. 9 | -------------------------------------------------------------------------------- /documentation/docs/white-labeling.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Overview 3 | --- 4 | 5 | The Lexicon Mobile App allows you to customize its appearance through a process known as **White Labeling**. 6 | 7 | If you're unfamiliar with this term, it's essentially the process of branding an existing application specifically for your users. 8 | 9 | White Labeling allows you to configure the app with your own logo, app icon, color theme, fonts, and so on. 10 | 11 | The idea is that your users won't know that the Lexicon team built this app. Its appearance will be completely customized to your brand. 12 | 13 | To learn more about White Labeling the Lexicon Mobile App, continue to the next section. 14 | -------------------------------------------------------------------------------- /documentation/src/css/image.css: -------------------------------------------------------------------------------- 1 | .image-container-center-multiple { 2 | display: flex; 3 | align-items: center; 4 | justify-content: space-evenly; 5 | } 6 | 7 | .image-container-center { 8 | text-align: center; 9 | } 10 | 11 | .image-container-resize { 12 | max-width: 50%; 13 | } 14 | -------------------------------------------------------------------------------- /documentation/src/pages/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Redirect } from 'react-router-dom'; 3 | 4 | export default function Home() { 5 | return ; 6 | } 7 | -------------------------------------------------------------------------------- /documentation/src/pages/playground.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default () => { 4 | return ( 5 |