├── .nvmrc ├── src ├── i18n │ ├── cs │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── common.json │ ├── eu │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── mediaSelector.json │ │ │ ├── parse.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── index.ts │ ├── ja │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── common.json │ │ └── index.ts │ ├── ko │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── common.json │ │ └── index.ts │ ├── zh-Hans │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── common.json │ │ └── index.ts │ ├── zh-Hant │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── common.json │ │ └── index.ts │ ├── no │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── sv │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── ca │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── de │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── index.ts │ ├── en │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── nl │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── pl │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── vi │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ ├── relationship.json │ │ │ └── instance.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── be │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── el │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── actions.json │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── index.ts │ ├── es │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── fr │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── index.ts │ ├── it │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── ru │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── mediaSelector.json │ │ │ ├── parse.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ └── common.json │ ├── uk │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ ├── pt_BR │ │ ├── components │ │ │ ├── emojis.json │ │ │ ├── parse.json │ │ │ ├── mediaSelector.json │ │ │ └── relationship.json │ │ ├── screens │ │ │ ├── accountSelection.json │ │ │ ├── announcements.json │ │ │ └── imageViewer.json │ │ ├── screens.json │ │ ├── index.ts │ │ └── common.json │ └── locales.ts ├── utils │ ├── storage │ │ ├── global │ │ │ └── index.ts │ │ ├── account │ │ │ └── index.ts │ │ ├── migrations │ │ │ └── legacy │ │ │ │ ├── app.ts │ │ │ │ ├── settings.ts │ │ │ │ └── contexts.ts │ │ └── index.ts │ ├── helpers │ │ ├── androidActionSheetStyles.ts │ │ ├── getLanguage.ts │ │ ├── permissions.ts │ │ ├── detectLanguage.ts │ │ ├── isMyAccount.ts │ │ ├── removeHTML.ts │ │ ├── browserPackage.ts │ │ └── appendRemote.ts │ ├── navigation │ │ ├── navigationRef.ts │ │ └── usePopToTop.ts │ ├── styles │ │ ├── scaling.ts │ │ ├── layoutAnimation.ts │ │ └── constants.ts │ ├── startup │ │ ├── dev.ts │ │ ├── push.ts │ │ ├── netInfo.ts │ │ ├── audio.ts │ │ └── sentry.ts │ └── queryHooks │ │ ├── utils.ts │ │ ├── index.ts │ │ ├── reports.ts │ │ └── neodb.ts ├── components │ ├── Parse │ │ └── index.tsx │ ├── Menu │ │ ├── index.tsx │ │ ├── Container.tsx │ │ └── Header.tsx │ ├── Relationship │ │ └── index.tsx │ ├── Header │ │ └── index.tsx │ ├── Loading.tsx │ ├── Hr.tsx │ ├── discardConfirmation.ts │ ├── RelativeTime.tsx │ └── haptics.ts ├── @types │ ├── untyped.d.ts │ └── app.d.ts └── screens │ ├── Compose │ ├── utils │ │ └── createContext.ts │ ├── Posting.tsx │ └── Root │ │ └── Header │ │ └── index.tsx │ └── Tabs │ ├── Shared │ └── Account │ │ └── Context.tsx │ ├── Me │ ├── Root │ │ ├── MyInfo.tsx │ │ ├── Switch.tsx │ │ └── Settings.tsx │ ├── Settings │ │ └── index.tsx │ ├── Bookmarks.tsx │ └── Favourites.tsx │ ├── Public │ └── index.tsx │ └── Local │ └── index.tsx ├── fastlane ├── metadata │ ├── zh-Hans │ │ ├── name.txt │ │ ├── subtitle.txt │ │ ├── release_notes.txt │ │ └── description.txt │ ├── default │ │ ├── name.txt │ │ ├── subtitle.txt │ │ ├── description.txt │ │ └── release_notes.txt │ ├── en-US │ │ ├── subtitle.txt │ │ ├── name.txt │ │ ├── release_notes.txt │ │ └── description.txt │ ├── android │ │ ├── en-US │ │ │ ├── title.txt │ │ │ ├── short_description.txt │ │ │ ├── full_description.txt │ │ │ └── images │ │ │ │ └── phoneScreenshots │ │ │ │ ├── 0_65.png │ │ │ │ ├── 1_65.png │ │ │ │ ├── 2_65.png │ │ │ │ └── 3_65.png │ │ ├── zh-CN │ │ │ ├── title.txt │ │ │ ├── full_description.txt │ │ │ ├── short_description.txt │ │ │ └── images │ │ │ │ ├── phoneScreenshots │ │ │ │ ├── 0_65.png │ │ │ │ ├── 1_65.png │ │ │ │ ├── 2_65.png │ │ │ │ └── 3_65.png │ │ │ │ ├── icon.png │ │ │ │ └── featureGraphic.png │ │ └── it-IT │ │ │ ├── full_description.txt │ │ │ └── short_description.txt │ └── it │ │ ├── subtitle.txt │ │ └── description.txt ├── Gymfile ├── Appfile ├── .gitignore ├── screenshots │ ├── en-US │ │ ├── 0_55.png │ │ ├── 0_65.png │ │ ├── 0_iPad.png │ │ ├── 1_55.png │ │ ├── 1_65.png │ │ ├── 1_iPad.png │ │ ├── 2_55.png │ │ ├── 2_65.png │ │ ├── 2_iPad.png │ │ ├── 3_55.png │ │ ├── 3_65.png │ │ ├── 3_iPad.png │ │ ├── 0_ipadPro129.png │ │ ├── 1_ipadPro129.png │ │ ├── 2_ipadPro129.png │ │ └── 3_ipadPro129.png │ └── zh-Hans │ │ ├── 0_55.png │ │ ├── 0_65.png │ │ ├── 1_55.png │ │ ├── 1_65.png │ │ ├── 2_55.png │ │ ├── 2_65.png │ │ ├── 3_55.png │ │ ├── 3_65.png │ │ ├── 0_iPad.png │ │ ├── 1_iPad.png │ │ ├── 2_iPad.png │ │ ├── 3_iPad.png │ │ ├── 0_ipadPro129.png │ │ ├── 1_ipadPro129.png │ │ ├── 2_ipadPro129.png │ │ └── 3_ipadPro129.png ├── Matchfile ├── Pluginfile └── Deliverfile ├── .github └── FUNDING.yml ├── ios ├── Podfile.properties.json ├── tooot │ ├── boop.mp3 │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── SplashScreen.imageset │ │ │ ├── splashscreen.png │ │ │ └── dark_splashscreen.png │ │ └── AppIcon.appiconset │ │ │ ├── App-Icon-20x20@1x.png │ │ │ ├── App-Icon-20x20@2x.png │ │ │ ├── App-Icon-20x20@3x.png │ │ │ ├── App-Icon-29x29@1x.png │ │ │ ├── App-Icon-29x29@2x.png │ │ │ ├── App-Icon-29x29@3x.png │ │ │ ├── App-Icon-40x40@1x.png │ │ │ ├── App-Icon-40x40@2x.png │ │ │ ├── App-Icon-40x40@3x.png │ │ │ ├── App-Icon-60x60@2x.png │ │ │ ├── App-Icon-60x60@3x.png │ │ │ ├── App-Icon-76x76@1x.png │ │ │ ├── App-Icon-76x76@2x.png │ │ │ ├── ItunesArtwork@2x.png │ │ │ └── App-Icon-83.5x83.5@2x.png │ ├── RootViewColor.xcassets │ │ └── Contents.json │ ├── noop-file.swift │ ├── AppDelegate.h │ ├── main.m │ └── tooot.entitlements ├── sentry.properties ├── File.swift ├── zh-Hans.lproj │ └── InfoPlist.strings ├── zh-Hant.lproj │ └── InfoPlist.strings ├── ko.lproj │ └── InfoPlist.strings ├── tooot-Bridging-Header.h ├── ja.lproj │ └── InfoPlist.strings ├── nb.lproj │ └── InfoPlist.strings ├── sv.lproj │ └── InfoPlist.strings ├── be.lproj │ └── InfoPlist.strings ├── en.lproj │ └── InfoPlist.strings ├── pt-BR.lproj │ └── InfoPlist.strings ├── ca.lproj │ └── InfoPlist.strings ├── pl.lproj │ └── InfoPlist.strings ├── nl.lproj │ └── InfoPlist.strings ├── es.lproj │ └── InfoPlist.strings ├── eu.lproj │ └── InfoPlist.strings ├── vi.lproj │ └── InfoPlist.strings ├── de.lproj │ └── InfoPlist.strings ├── el.lproj │ └── InfoPlist.strings ├── fr.lproj │ └── InfoPlist.strings ├── uk.lproj │ └── InfoPlist.strings ├── it.lproj │ └── InfoPlist.strings ├── ShareExtension │ ├── ShareExtension-Bridging-Header.h │ └── ShareExtension.entitlements ├── tooot.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── .gitignore └── .xcode.env ├── assets ├── sounds │ └── boop.mp3 └── images │ └── welcome.png ├── android ├── .gitignore ├── app │ ├── debug.keystore │ ├── src │ │ ├── main │ │ │ └── res │ │ │ │ ├── raw │ │ │ │ └── boop.mp3 │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable │ │ │ │ ├── splashscreen_image.png │ │ │ │ └── splashscreen.xml │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ ├── ic_launcher_round.png │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-night │ │ │ │ └── splashscreen_image.png │ │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_stat_notifications.png │ │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_stat_notifications.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ └── ic_stat_notifications.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_stat_notifications.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── ic_stat_notifications.png │ │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ │ ├── values-night │ │ │ │ └── colors.xml │ │ │ │ └── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ └── debug │ │ │ └── AndroidManifest.xml │ └── proguard-rules.pro ├── sentry.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── settings.gradle └── build.gradle ├── demo └── screenshots │ ├── Tab-Me.png │ ├── Tab-Local.png │ ├── Tab-Public.png │ ├── Tab-Me-Switch.png │ ├── Tab-Me-List-Edit.png │ ├── Tab-Me-List_Menu.png │ ├── Tab-Me-Profile.png │ ├── Tab-Me-Push_Top.png │ ├── Tab-Me-Settings.png │ ├── Tab-Shared-Toot.png │ ├── Component-Instance.png │ ├── Tab-Me-List_Delete.png │ ├── Tab-Me-Push_Bottom.png │ ├── Tab-Notifications.png │ ├── Tab-Shared-Account.png │ ├── Tab-Shared-Hashtag.png │ ├── Tab-Shared-History.png │ ├── Tab-Shared-Report.png │ ├── Tab-Shared-Search.png │ ├── Logout-Confirmation.png │ ├── Tab-Me-Profile-Fields.png │ ├── Tab-Me-Push_ReEnable.png │ ├── Component-MediaSelector.png │ ├── Screen-AccountSelection.png │ ├── Tab-Me-Profile_Feedback.png │ ├── Tab-Shared-Attachments.png │ ├── Tab-Me-ListAccounts_Empty.png │ ├── Tab-Me-ListAccounts_Error.png │ ├── Tab-Me-Push_NotAvailable.png │ ├── Tab-Me-Settings-Appearance.png │ ├── Tab-Me-Settings-DarkTheme.png │ ├── Tab-Me-Settings-FontSize.png │ ├── Tab-Notifications-Filter.png │ ├── Tab-Shared-AccountInLists.png │ ├── Tab-Me-Push_MissingServerKey.png │ └── Tab-Me-Settings-OpeningLink.png ├── index.js ├── .yarnrc.yml ├── crowdin.yml ├── metro.config.js ├── react-native.config.js ├── tsconfig.json ├── Gemfile ├── .envrc.example ├── babel.config.js └── app.config.ts /.nvmrc: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /src/i18n/cs/components/emojis.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /src/i18n/eu/components/emojis.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/name.txt: -------------------------------------------------------------------------------- 1 | tooot - 探索联邦宇宙 -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/subtitle.txt: -------------------------------------------------------------------------------- 1 | 简约,想你所想 -------------------------------------------------------------------------------- /fastlane/metadata/default/name.txt: -------------------------------------------------------------------------------- 1 | ../en-US/name.txt -------------------------------------------------------------------------------- /fastlane/metadata/en-US/subtitle.txt: -------------------------------------------------------------------------------- 1 | Simple, just works -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | ../../en-US/name.txt -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/title.txt: -------------------------------------------------------------------------------- 1 | ../../zh-Hans/name.txt -------------------------------------------------------------------------------- /fastlane/metadata/default/subtitle.txt: -------------------------------------------------------------------------------- 1 | ../en-US/subtitle.txt -------------------------------------------------------------------------------- /fastlane/metadata/default/description.txt: -------------------------------------------------------------------------------- 1 | ../en-US/description.txt -------------------------------------------------------------------------------- /fastlane/metadata/en-US/name.txt: -------------------------------------------------------------------------------- 1 | tooot - fediverse and Mastodon 2 | -------------------------------------------------------------------------------- /fastlane/metadata/it/subtitle.txt: -------------------------------------------------------------------------------- 1 | App open source per Mastodon 2 | -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/release_notes.txt: -------------------------------------------------------------------------------- 1 | tooot-ing愉快!此版本包括改进和修复。 -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ['https://www.buymeacoffee.com/xmflsct'] 2 | -------------------------------------------------------------------------------- /fastlane/Gymfile: -------------------------------------------------------------------------------- 1 | scheme "tooot" 2 | workspace "./ios/tooot.xcworkspace" -------------------------------------------------------------------------------- /fastlane/metadata/default/release_notes.txt: -------------------------------------------------------------------------------- 1 | ../en-US/release_notes.txt -------------------------------------------------------------------------------- /ios/Podfile.properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "expo.jsEngine": "hermes" 3 | } 4 | -------------------------------------------------------------------------------- /src/i18n/ja/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "よく使う絵文字" 3 | } -------------------------------------------------------------------------------- /src/i18n/ko/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "자주 사용" 3 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "常用" 3 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "常用" 3 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | ../../en-US/subtitle.txt -------------------------------------------------------------------------------- /fastlane/metadata/android/it-IT/full_description.txt: -------------------------------------------------------------------------------- 1 | ../../it/description.txt -------------------------------------------------------------------------------- /fastlane/metadata/android/it-IT/short_description.txt: -------------------------------------------------------------------------------- 1 | ../../it/subtitle.txt -------------------------------------------------------------------------------- /src/i18n/no/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Ofte brukt" 3 | } -------------------------------------------------------------------------------- /src/i18n/sv/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Ofta använda" 3 | } -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 | ../../en-US/description.txt -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/full_description.txt: -------------------------------------------------------------------------------- 1 | ../../zh-Hans/description.txt -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/short_description.txt: -------------------------------------------------------------------------------- 1 | ../../zh-Hans/subtitle.txt -------------------------------------------------------------------------------- /src/i18n/ca/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "D'ús freqüent" 3 | } -------------------------------------------------------------------------------- /src/i18n/de/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Häufig genutzt" 3 | } -------------------------------------------------------------------------------- /src/i18n/en/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Frequent used" 3 | } -------------------------------------------------------------------------------- /src/i18n/nl/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Vaak gebruikt" 3 | } -------------------------------------------------------------------------------- /src/i18n/pl/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Często używane" 3 | } -------------------------------------------------------------------------------- /src/i18n/vi/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Sử dụng gần đây" 3 | } -------------------------------------------------------------------------------- /ios/tooot/boop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/boop.mp3 -------------------------------------------------------------------------------- /src/i18n/be/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Часта выкарыстоўваецца" 3 | } -------------------------------------------------------------------------------- /src/i18n/el/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Χρησιμοποιούνται συχνά" 3 | } -------------------------------------------------------------------------------- /src/i18n/es/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Usados frecuentemente" 3 | } -------------------------------------------------------------------------------- /src/i18n/fr/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Fréquemment utilisés" 3 | } -------------------------------------------------------------------------------- /src/i18n/it/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Usate di frequente" 3 | } -------------------------------------------------------------------------------- /src/i18n/ru/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Часто используемые" 3 | } -------------------------------------------------------------------------------- /src/i18n/uk/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Часто використовувані" 3 | } -------------------------------------------------------------------------------- /assets/sounds/boop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/assets/sounds/boop.mp3 -------------------------------------------------------------------------------- /src/i18n/pt_BR/components/emojis.json: -------------------------------------------------------------------------------- 1 | { 2 | "frequentUsed": "Usados frequentemente" 3 | } -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier "com.xmflsct.app.tooot" 2 | package_name "com.xmflsct.app.tooot" -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | .idea 3 | .gradle 4 | local.properties 5 | *.iml 6 | *.hprof 7 | *.jks -------------------------------------------------------------------------------- /android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/debug.keystore -------------------------------------------------------------------------------- /assets/images/welcome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/assets/images/welcome.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me.png -------------------------------------------------------------------------------- /fastlane/metadata/en-US/release_notes.txt: -------------------------------------------------------------------------------- 1 | Enjoy toooting! This version includes improvements and fixes. -------------------------------------------------------------------------------- /ios/sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=tooot 3 | defaults.project=app -------------------------------------------------------------------------------- /android/sentry.properties: -------------------------------------------------------------------------------- 1 | defaults.url=https://sentry.io/ 2 | defaults.org=tooot 3 | defaults.project=app -------------------------------------------------------------------------------- /fastlane/.gitignore: -------------------------------------------------------------------------------- 1 | *.key 2 | *.jks 3 | *.p8 4 | *.p12 5 | 6 | /README.md 7 | /report.xml 8 | Preview.html -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/0_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/en-US/0_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/1_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/en-US/1_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/2_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/en-US/2_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/phoneScreenshots/3_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/en-US/3_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/0_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/zh-Hans/0_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/1_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/zh-Hans/1_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/2_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/zh-Hans/2_65.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/phoneScreenshots/3_65.png: -------------------------------------------------------------------------------- 1 | ../../../../../screenshots/zh-Hans/3_65.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Local.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Public.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Public.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Switch.png -------------------------------------------------------------------------------- /android/app/src/main/res/raw/boop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/raw/boop.mp3 -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-List-Edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-List-Edit.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-List_Menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-List_Menu.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Profile.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Push_Top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Push_Top.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Settings.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Toot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Toot.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/0_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/0_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/0_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/0_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/0_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/0_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/1_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/1_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/1_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/2_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/2_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/2_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/3_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/3_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/3_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/0_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/0_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/0_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/0_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/1_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/1_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/1_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/1_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/2_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/2_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/2_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/2_65.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/3_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/3_55.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/3_65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/3_65.png -------------------------------------------------------------------------------- /src/utils/storage/global/index.ts: -------------------------------------------------------------------------------- 1 | import { GlobalV0 } from './v0' 2 | 3 | export type { GlobalV0 as StorageGlobal } 4 | -------------------------------------------------------------------------------- /demo/screenshots/Component-Instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Component-Instance.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-List_Delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-List_Delete.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Push_Bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Push_Bottom.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Notifications.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Account.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Account.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Hashtag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Hashtag.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-History.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-History.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Report.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Search.png -------------------------------------------------------------------------------- /fastlane/Matchfile: -------------------------------------------------------------------------------- 1 | storage_mode "git" 2 | app_identifier ["com.xmflsct.app.tooot", "com.xmflsct.app.tooot.ShareExtension"] 3 | -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/0_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/0_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/1_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/1_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/2_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/2_iPad.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/3_iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/3_iPad.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { registerRootComponent } from 'expo' 2 | import App from './src/App' 3 | 4 | registerRootComponent(App) 5 | -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/i18n/cs/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "", 3 | "content": { 4 | "select_account": "" 5 | } 6 | } -------------------------------------------------------------------------------- /src/utils/storage/account/index.ts: -------------------------------------------------------------------------------- 1 | import { AccountV0 } from "./v0"; 2 | 3 | export type { AccountV0 as StorageAccount } 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /demo/screenshots/Logout-Confirmation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Logout-Confirmation.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Profile-Fields.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Profile-Fields.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Push_ReEnable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Push_ReEnable.png -------------------------------------------------------------------------------- /ios/tooot/RootViewColor.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/storage/migrations/legacy/app.ts: -------------------------------------------------------------------------------- 1 | export type LegacyApp = { 2 | expoToken?: string 3 | versionUpdate: boolean 4 | } 5 | -------------------------------------------------------------------------------- /demo/screenshots/Component-MediaSelector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Component-MediaSelector.png -------------------------------------------------------------------------------- /demo/screenshots/Screen-AccountSelection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Screen-AccountSelection.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Profile_Feedback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Profile_Feedback.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-Attachments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-Attachments.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/0_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/0_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/1_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/2_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/en-US/3_ipadPro129.png -------------------------------------------------------------------------------- /src/i18n/ja/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "共有先", 3 | "content": { 4 | "select_account": "アカウントを選択" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/ko/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "공유하기...", 3 | "content": { 4 | "select_account": "계정 선택" 5 | } 6 | } -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-ListAccounts_Empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-ListAccounts_Empty.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-ListAccounts_Error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-ListAccounts_Error.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Push_NotAvailable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Push_NotAvailable.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Settings-Appearance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Settings-Appearance.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Settings-DarkTheme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Settings-DarkTheme.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Settings-FontSize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Settings-FontSize.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Notifications-Filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Notifications-Filter.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Shared-AccountInLists.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Shared-AccountInLists.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/metadata/android/zh-CN/images/icon.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/0_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/0_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/1_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/1_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/2_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/2_ipadPro129.png -------------------------------------------------------------------------------- /fastlane/screenshots/zh-Hans/3_ipadPro129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/screenshots/zh-Hans/3_ipadPro129.png -------------------------------------------------------------------------------- /ios/File.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // tooot 4 | // 5 | // Created by Zhiyuan Zheng on 2021-08-22. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /src/i18n/el/screens/actions.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "altText": { 4 | "heading": "Εναλλακτικό κείμενο" 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "分享到...", 3 | "content": { 4 | "select_account": "选择帐号" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "分享到...", 3 | "content": { 4 | "select_account": "選擇帳號" 5 | } 6 | } -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Push_MissingServerKey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Push_MissingServerKey.png -------------------------------------------------------------------------------- /demo/screenshots/Tab-Me-Settings-OpeningLink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/demo/screenshots/Tab-Me-Settings-OpeningLink.png -------------------------------------------------------------------------------- /src/components/Parse/index.tsx: -------------------------------------------------------------------------------- 1 | import ParseEmojis from './Emojis' 2 | import ParseHTML from './HTML' 3 | 4 | export { ParseEmojis, ParseHTML } 5 | -------------------------------------------------------------------------------- /src/i18n/no/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Del tut...", 3 | "content": { 4 | "select_account": "Velg konto" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/sv/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Dela med ...", 3 | "content": { 4 | "select_account": "Välj konto" 5 | } 6 | } -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/tooot/noop-file.swift: -------------------------------------------------------------------------------- 1 | // 2 | // @generated 3 | // A blank Swift file must be created for native modules with Swift files to work correctly. 4 | // -------------------------------------------------------------------------------- /ios/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "允许tooot保存图片至相册"; 2 | "NSPhotoLibraryUsageDescription" = "允许tooot保存图片至相册"; 3 | -------------------------------------------------------------------------------- /ios/zh-Hant.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "允許tooot保存圖片至相冊"; 2 | "NSPhotoLibraryUsageDescription" = "允許tooot保存圖片至相冊"; 3 | -------------------------------------------------------------------------------- /src/i18n/de/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Teilen mit...", 3 | "content": { 4 | "select_account": "Konto auswählen" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/en/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Share to ...", 3 | "content": { 4 | "select_account": "Select account" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/pl/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Udostępnij...", 3 | "content": { 4 | "select_account": "Wybierz konto" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/vi/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Chia sẻ tới...", 3 | "content": { 4 | "select_account": "Chọn tài khoản" 5 | } 6 | } -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | compressionLevel: mixed 2 | 3 | enableGlobalCache: false 4 | 5 | nodeLinker: node-modules 6 | 7 | yarnPath: .yarn/releases/yarn-4.1.0.cjs 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /src/i18n/eu/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Hona partekatu ...", 3 | "content": { 4 | "select_account": "Aukeratu kontua" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/it/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Condividi con...", 3 | "content": { 4 | "select_account": "Seleziona profilo" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/nl/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Delen met...", 3 | "content": { 4 | "select_account": "Selecteer account" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/ru/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Поделиться...", 3 | "content": { 4 | "select_account": "Выберите аккаунт" 5 | } 6 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /fastlane/metadata/android/zh-CN/images/featureGraphic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/fastlane/metadata/android/zh-CN/images/featureGraphic.png -------------------------------------------------------------------------------- /src/i18n/be/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Абагуліць з ...", 3 | "content": { 4 | "select_account": "Выберыце ўліковы запіс" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/ca/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Comparteix amb...", 3 | "content": { 4 | "select_account": "Selecciona el compte" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/el/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Κοινοποίηση σε ...", 3 | "content": { 4 | "select_account": "Επιλέξτε λογαριασμό" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/es/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Compartir con...", 3 | "content": { 4 | "select_account": "Seleccionar cuenta" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/fr/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Partager avec...", 3 | "content": { 4 | "select_account": "Sélectionnez un compte" 5 | } 6 | } -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /src/i18n/en/**/*.json 3 | translation: /src/i18n/%osx_locale%/**/%original_file_name% 4 | ignore: 5 | - '*.ts' 6 | -------------------------------------------------------------------------------- /src/i18n/pt_BR/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Compartilhar com ...", 3 | "content": { 4 | "select_account": "Selecione a conta" 5 | } 6 | } -------------------------------------------------------------------------------- /src/i18n/uk/screens/accountSelection.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Поділитися з ...", 3 | "content": { 4 | "select_account": "Виберіть обліковий запис" 5 | } 6 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-night/splashscreen_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-night/splashscreen_image.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /ios/ko.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "tooot가 이미지를 카메라 롤에 저장하도록 허용"; 2 | "NSPhotoLibraryUsageDescription" = "tooot가 이미지를 카메라 롤에 저장하도록 허용"; 3 | -------------------------------------------------------------------------------- /ios/tooot-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import 2 | // 3 | // Use this file to import your target's public headers that you would like to expose to Swift. 4 | // 5 | 6 | -------------------------------------------------------------------------------- /src/i18n/cs/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "", 4 | "expanded": "", 5 | "moreLines": "", 6 | "defaultHint": "" 7 | } 8 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_stat_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-hdpi/ic_stat_notifications.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_stat_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-mdpi/ic_stat_notifications.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "tooot が画像をカメラロールに保存できるようにします"; 2 | "NSPhotoLibraryUsageDescription" = "tooot が画像をカメラロールに保存できるようにします"; 3 | -------------------------------------------------------------------------------- /ios/tooot/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | @interface AppDelegate : EXAppDelegateWrapper 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/SplashScreen.imageset/splashscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/SplashScreen.imageset/splashscreen.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_stat_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-xhdpi/ic_stat_notifications.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_stat_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_stat_notifications.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/ic_stat_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/drawable-xxxhdpi/ic_stat_notifications.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@1x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-20x20@3x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@1x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-29x29@3x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@1x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-40x40@3x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-60x60@3x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@1x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-76x76@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/SplashScreen.imageset/dark_splashscreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/SplashScreen.imageset/dark_splashscreen.png -------------------------------------------------------------------------------- /ios/nb.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "La tooot lagre bilder på kamerarullen"; 2 | "NSPhotoLibraryUsageDescription" = "La tooot lagre bilder på kamerarullen"; 3 | -------------------------------------------------------------------------------- /ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tooot-app/app/HEAD/ios/tooot/Images.xcassets/AppIcon.appiconset/App-Icon-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Låt toooot spara bilder på din kamerarulle"; 2 | "NSPhotoLibraryUsageDescription" = "Låt toooot spara bilder på din kamerarulle"; 3 | -------------------------------------------------------------------------------- /src/i18n/cs/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "", 3 | "content": { 4 | "published": "", 5 | "button": { 6 | "read": "", 7 | "unread": "" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ios/be.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Дазвольце tooot захоўваць выявы ў папку камеры"; 2 | "NSPhotoLibraryUsageDescription" = "Дазвольце tooot захоўваць выявы ў папку камеры"; 3 | -------------------------------------------------------------------------------- /ios/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Allow tooot to save images to your camera roll"; 2 | "NSPhotoLibraryUsageDescription" = "Allow tooot to save images to your camera roll"; 3 | -------------------------------------------------------------------------------- /ios/pt-BR.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Permita guardar imagens em seu rolo de câmera"; 2 | "NSPhotoLibraryUsageDescription" = "Permita guardar imagens em seu rolo de câmera"; 3 | -------------------------------------------------------------------------------- /src/i18n/cs/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "", 3 | "message": "", 4 | "options": { 5 | "image": "", 6 | "image_max": "", 7 | "video": "", 8 | "video_max": "" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/eu/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "", 3 | "message": "", 4 | "options": { 5 | "image": "", 6 | "image_max": "", 7 | "video": "", 8 | "video_max": "" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/ru/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "", 3 | "message": "", 4 | "options": { 5 | "image": "", 6 | "image_max": "", 7 | "video": "", 8 | "video_max": "" 9 | } 10 | } -------------------------------------------------------------------------------- /ios/ca.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Permet que tooot desi imatges al carret de la càmera"; 2 | "NSPhotoLibraryUsageDescription" = "Permet que tooot desi imatges al carret de la càmera"; 3 | -------------------------------------------------------------------------------- /src/i18n/ja/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "お知らせ", 3 | "content": { 4 | "published": "公開 <0 />", 5 | "button": { 6 | "read": "既読", 7 | "unread": "既読にする" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ios/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Zezwól toootowi na zapisywanie zdjęć w rolce z aparatu"; 2 | "NSPhotoLibraryUsageDescription" = "Zezwól toootowi na zapisywanie zdjęć w rolce z aparatu"; 3 | -------------------------------------------------------------------------------- /src/i18n/ko/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "공지", 3 | "content": { 4 | "published": "<0 />에 작성됨", 5 | "button": { 6 | "read": "읽음", 7 | "unread": "읽음으로 표시" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "点击展开或折叠内容", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": "(还有 {{count}} 行)", 6 | "defaultHint": "长嘟文" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "公告", 3 | "content": { 4 | "published": "发布于 <0 />", 5 | "button": { 6 | "read": "已读", 7 | "unread": "标记为已读" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "點擊以展開或折疊內容", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": "(還有 {{count}} 行)", 6 | "defaultHint": "長嘟文" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "公告", 3 | "content": { 4 | "published": "發佈於 <0 />", 5 | "button": { 6 | "read": "已讀", 7 | "unread": "標記為已讀" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ios/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Sta tooot toe om afbeeldingen op te slaan in je filmrol"; 2 | "NSPhotoLibraryUsageDescription" = "Sta tooot toe om afbeeldingen op te slaan in je filmrol"; 3 | -------------------------------------------------------------------------------- /src/i18n/ja/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "タップして内容を展開または折りたたむ", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} 行以上)", 6 | "defaultHint": "長いトゥート" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/ko/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "탭 하여 내용을 펼치거나 접기", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}}줄 더 보기)", 6 | "defaultHint": "긴 툿" 7 | } 8 | } -------------------------------------------------------------------------------- /ios/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Permita que tooot guarde imágenes en el rollo de su cámara"; 2 | "NSPhotoLibraryUsageDescription" = "Permita que tooot guarde imágenes en el rollo de su cámara"; 3 | -------------------------------------------------------------------------------- /ios/eu.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Baimendu tooot-i irudiak zure kameraren rollean gordetzeko"; 2 | "NSPhotoLibraryUsageDescription" = "Baimendu tooot-i irudiak zure kameraren rollean gordetzeko"; 3 | -------------------------------------------------------------------------------- /ios/vi.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Cho phép quá nhiều để lưu hình ảnh vào thư viện ảnh của bạn"; 2 | "NSPhotoLibraryUsageDescription" = "Cho phép quá nhiều để lưu hình ảnh vào thư viện ảnh của bạn"; 3 | -------------------------------------------------------------------------------- /ios/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Erlauben Sie tooot, Bilder in Ihrer Kamerarolle zu speichern"; 2 | "NSPhotoLibraryUsageDescription" = "Erlauben Sie tooot, Bilder in Ihrer Kamerarolle zu speichern"; 3 | -------------------------------------------------------------------------------- /ios/el.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας"; 2 | "NSPhotoLibraryUsageDescription" = "Επιτρέψτε στο tooot να αποθηκεύει εικόνες στο ρολό της κάμερας"; 3 | -------------------------------------------------------------------------------- /ios/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule"; 2 | "NSPhotoLibraryUsageDescription" = "Autoriser tooot à enregistrer des images sur votre pellicule"; 3 | -------------------------------------------------------------------------------- /ios/uk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Дозвольте tooot зберігати зображення у вашій папці фотоапарата"; 2 | "NSPhotoLibraryUsageDescription" = "Дозвольте tooot зберігати зображення у вашій папці фотоапарата"; 3 | -------------------------------------------------------------------------------- /src/components/Menu/index.tsx: -------------------------------------------------------------------------------- 1 | import MenuContainer from '@components/Menu/Container' 2 | import MenuHeader from '@components/Menu/Header' 3 | import MenuRow from '@components/Menu/Row' 4 | 5 | export { MenuContainer, MenuHeader, MenuRow } 6 | -------------------------------------------------------------------------------- /src/i18n/fr/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Annonces", 3 | "content": { 4 | "published": "Publié <0 />", 5 | "button": { 6 | "read": "Lire", 7 | "unread": "Marqué comme lu" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/components/Relationship/index.tsx: -------------------------------------------------------------------------------- 1 | import RelationshipIncoming from '@components/Relationship/Incoming' 2 | import RelationshipOutgoing from '@components/Relationship/Outgoing' 3 | 4 | export { RelationshipIncoming, RelationshipOutgoing } 5 | -------------------------------------------------------------------------------- /src/i18n/en/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Announcements", 3 | "content": { 4 | "published": "Published <0 />", 5 | "button": { 6 | "read": "Read", 7 | "unread": "Mark as read" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/es/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Avisos", 3 | "content": { 4 | "published": "<0 /> publicado", 5 | "button": { 6 | "read": "Leer", 7 | "unread": "Marcar como leído" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/it/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Annunci", 3 | "content": { 4 | "published": "Pubblicato <0 />", 5 | "button": { 6 | "read": "Letto", 7 | "unread": "Segna come letto" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/no/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Kunngjøringer", 3 | "content": { 4 | "published": "Publisert <0 />", 5 | "button": { 6 | "read": "Les", 7 | "unread": "Merk som lest" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/vi/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Có gì mới?", 3 | "content": { 4 | "published": "Đã đăng <0 />", 5 | "button": { 6 | "read": "Đọc", 7 | "unread": "Đánh dấu là đã đọc" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ios/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSPhotoLibraryAddUsageDescription" = "Consentire a tooot di salvare le immagini nel rullino fotografico"; 2 | "NSPhotoLibraryUsageDescription" = "Consentire a tooot di salvare le immagini nel rullino fotografico"; 3 | -------------------------------------------------------------------------------- /src/i18n/pt_BR/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Comunicados", 3 | "content": { 4 | "published": "Publicado <0 />", 5 | "button": { 6 | "read": "Ler", 7 | "unread": "Marcar como lido" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/sv/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Meddelanden", 3 | "content": { 4 | "published": "Publicerad <0 />", 5 | "button": { 6 | "read": "Läst", 7 | "unread": "Markera som läst" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-yarn' 6 | gem 'fastlane-plugin-json' 7 | gem 'fastlane-plugin-versioning_android' 8 | gem 'fastlane-plugin-sentry' 9 | -------------------------------------------------------------------------------- /src/components/Header/index.tsx: -------------------------------------------------------------------------------- 1 | import HeaderCenter from '@components/Header/Center' 2 | import HeaderLeft from '@components/Header/Left' 3 | import HeaderRight from '@components/Header/Right' 4 | 5 | export { HeaderLeft, HeaderCenter, HeaderRight } 6 | -------------------------------------------------------------------------------- /src/i18n/ca/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Avisos", 3 | "content": { 4 | "published": "S'ha publicat <0 />", 5 | "button": { 6 | "read": "Llegit", 7 | "unread": "Marca-ho com a llegit" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/en/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Tap to expand or collapse content", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} more lines)", 6 | "defaultHint": "Long toot" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/nl/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Mededelingen", 3 | "content": { 4 | "published": "Gepubliceerd <0 />", 5 | "button": { 6 | "read": "Lees", 7 | "unread": "Markeren als gelezen" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/vi/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Nhấn để mở rộng hoặc thu gọn nội dung", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} dòng nữa)", 6 | "defaultHint": "Tút dài" 7 | } 8 | } -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | tooot 3 | contain 4 | false 5 | -------------------------------------------------------------------------------- /src/i18n/be/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Аб'явы", 3 | "content": { 4 | "published": "Апублікавана <0 />", 5 | "button": { 6 | "read": "Прачытана", 7 | "unread": "Адзначыць як прачытанае" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/de/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Ankündigungen", 3 | "content": { 4 | "published": "<0 /> veröffentlicht", 5 | "button": { 6 | "read": "Lesen", 7 | "unread": "Als gelesen markieren" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/eu/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Sakatu edukia zabaldu edo ixteko", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} lerro gehiago)", 6 | "defaultHint": "Tut luzea" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/eu/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Abisuak", 3 | "content": { 4 | "published": "<0 /> argitaratua", 5 | "button": { 6 | "read": "Irakurri", 7 | "unread": "Irakurritako gisa ezarri" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/uk/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Оголошення", 3 | "content": { 4 | "published": "Опубліковано <0 />", 5 | "button": { 6 | "read": "Прочитано", 7 | "unread": "Позначити прочитаним" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /ios/tooot/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char *argv[]) { 6 | @autoreleasepool { 7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 8 | } 9 | } 10 | 11 | -------------------------------------------------------------------------------- /src/i18n/el/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Ανακοινώσεις", 3 | "content": { 4 | "published": "Δημοσιευμένα <0 />", 5 | "button": { 6 | "read": "Αναγνωσμένα", 7 | "unread": "Σήμανση ως αναγνωσμένο" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/es/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Toca para expandir o contraer contenido", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} líneas más)", 6 | "defaultHint": "Toot largo" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/no/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Trykk for å utvide eller skjule innhold", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} flere linjer)", 6 | "defaultHint": "Lang tut" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/ru/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Объявления", 3 | "content": { 4 | "published": "Опубликовано <0 />", 5 | "button": { 6 | "read": "Прочитано", 7 | "unread": "Отметить как прочитанное" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/sv/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Tryck för att utöka eller dölja innehåll", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} rader till)", 6 | "defaultHint": "Långt inlägg" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/de/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Tippen, um Inhalt aus- oder einzuklappen", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} weitere Zeilen)", 6 | "defaultHint": "Langer Tröt" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/it/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Tocca per espandere o comprimere il contenuto", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " (altre{{count}} linee)", 6 | "defaultHint": "Toot lungo" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/nl/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Tik om inhoud uit te vouwen of in te klappen", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} meer lijnen)", 6 | "defaultHint": "Lange toot" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/pl/screens/announcements.json: -------------------------------------------------------------------------------- 1 | { 2 | "heading": "Ważne ogłoszenia", 3 | "content": { 4 | "published": "Opublikowano <0 />", 5 | "button": { 6 | "read": "Przeczytane", 7 | "unread": "Oznacz jako przeczytane" 8 | } 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/pt_BR/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Toque para expandir ou recolher conteúdo", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} mais linhas)", 6 | "defaultHint": "Toot longo" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/uk/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Торкніться, щоб розгорнути або згорнути вміст", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " (ще {{count}} рядків)", 6 | "defaultHint": "Довгий дмух" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/be/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Націсніце, каб разгарнуць або згарнуць змесціва", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " (яшчэ {{count}} радкоў)", 6 | "defaultHint": "Доўгі допіс" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/ca/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Prem per expandir o contraure el contingut", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} línies més)", 6 | "defaultHint": "Publicació llarga" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/fr/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Touchez pour développer ou réduire le contenu", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} lignes en plus)", 6 | "defaultHint": "Pouet long" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "选择媒体", 3 | "message": "媒体EXIF数据不被上传", 4 | "options": { 5 | "image": "上传图片", 6 | "image_max": "上传照片(上限 {{max}})", 7 | "video": "上传视频", 8 | "video_max": "上传视频(上限 {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /fastlane/metadata/zh-Hans/description.txt: -------------------------------------------------------------------------------- 1 | tooot起始于专注中文社区的简洁、开源长毛象手机客户端。使用此客户端需要已经拥有一个长毛象(https://joinmastodon.org/)账号。 2 | 3 | tooot支持: 4 | - 跨平台,及iPadOS、MacOS 5 | - 多账号登录 6 | - 黑暗或自适应模式 7 | - 可调正文字体尺寸 8 | - 消息推送 9 | 10 | 如有使用建议或意见,请联系@tooot@xmflsct.com或者support@tooot.app。 -------------------------------------------------------------------------------- /src/i18n/el/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Αγγίξτε για επέκταση ή σύμπτυξη περιεχομένου", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} σειρές ακόμα)", 6 | "defaultHint": "Μακροσκελής ανάρτηση" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/ru/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Нажмите, чтобы развернуть или свернуть содержимое", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} больше строк)", 6 | "defaultHint": "Длинное сообщение" 7 | } 8 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "選擇媒體來源", 3 | "message": "媒體 Exif 資訊不會被上傳", 4 | "options": { 5 | "image": "上傳照片", 6 | "image_max": "上傳照片(最多 {{max}} 張)", 7 | "video": "上傳影片", 8 | "video_max": "上傳影片(最多 {{max}} 支)" 9 | } 10 | } -------------------------------------------------------------------------------- /src/utils/helpers/androidActionSheetStyles.ts: -------------------------------------------------------------------------------- 1 | export const androidActionSheetStyles = (colors: any) => ({ 2 | containerStyle: { backgroundColor: colors.backgroundDefault }, 3 | textStyle: { color: colors.primaryDefault }, 4 | titleTextStyle: { color: colors.secondary } 5 | }) 6 | -------------------------------------------------------------------------------- /src/i18n/pl/components/parse.json: -------------------------------------------------------------------------------- 1 | { 2 | "HTML": { 3 | "accessibilityHint": "Dotknij, by rozwinąć lub zwinąć zawartość", 4 | "expanded": "{{hint}}{{moreLines}}", 5 | "moreLines": " ({{count}} więcej linii tekstu)", 6 | "defaultHint": "Tootek o znacznej długości" 7 | } 8 | } -------------------------------------------------------------------------------- /src/utils/storage/migrations/legacy/settings.ts: -------------------------------------------------------------------------------- 1 | export type LegacySettings = { 2 | fontsize: -1 | 0 | 1 | 2 | 3 | string 3 | language: string 4 | theme: 'light' | 'dark' | 'auto' 5 | darkTheme: 'lighter' | 'darker' 6 | browser: 'internal' | 'external' 7 | staticEmoji: boolean 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/navigation/navigationRef.ts: -------------------------------------------------------------------------------- 1 | import { createNavigationContainerRef } from '@react-navigation/native' 2 | import { RootStackParamList } from '@utils/navigation/navigators' 3 | 4 | const navigationRef = createNavigationContainerRef() 5 | 6 | export default navigationRef 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #121212 5 | 6 | -------------------------------------------------------------------------------- /src/@types/untyped.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'gl-react-blurhash' 2 | declare module 'react-native-toast-message' 3 | declare module 'rtl-detect' 4 | 5 | declare module '@helpers/features' { 6 | const features: { feature: string; version: number; reference?: string }[] 7 | export default features 8 | } 9 | -------------------------------------------------------------------------------- /src/i18n/ko/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "미디어 소스 선택", 3 | "message": "미디어의 EXIF 데이터는 업로드되지 않습니다.", 4 | "options": { 5 | "image": "사진 업로드", 6 | "image_max": "사진 업로드 (최대 {{max}}개)", 7 | "video": "동영상 업로드", 8 | "video_max": "동영상 업로드 (최대 {{max}}개)" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/ja/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "メディアソースを選択", 3 | "message": "メディアの EXIF データはアップロードされません", 4 | "options": { 5 | "image": "写真をアップロード", 6 | "image_max": "写真をアップロード (最大{{max}}枚)", 7 | "video": "動画をアップロード", 8 | "video_max": "動画をアップロード (最大{{max}}本)" 9 | } 10 | } -------------------------------------------------------------------------------- /src/utils/styles/scaling.ts: -------------------------------------------------------------------------------- 1 | import { Platform } from 'react-native' 2 | 3 | export const adaptiveScale = (size: number, factor: number = 0) => 4 | factor ? Math.round(size + size * (factor / 8)) : size 5 | 6 | export const isLargeDevice = (Platform.OS === 'ios' && Platform.isPad) || Platform.OS === 'macos' 7 | -------------------------------------------------------------------------------- /ios/ShareExtension/ShareExtension-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import 6 | #import 7 | #import 8 | #import 9 | -------------------------------------------------------------------------------- /ios/tooot.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/tooot.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /ios/tooot.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/i18n/cs/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "" 4 | }, 5 | "block": { 6 | "function": "" 7 | }, 8 | "button": { 9 | "error": "", 10 | "blocked_by": "", 11 | "blocking": "", 12 | "following": "", 13 | "requested": "", 14 | "default": "" 15 | } 16 | } -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/i18n/vi/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Chọn nguồn", 3 | "message": "Chưa tải lên EXIF hình ảnh", 4 | "options": { 5 | "image": "Tải ảnh lên", 6 | "image_max": "Tải ảnh lên (tối đa {{max}})", 7 | "video": "Tải video lên", 8 | "video_max": "Tải video lên (tối đa {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/@types/app.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace App { 2 | type Pages = 3 | | 'Following' 4 | | 'Local' 5 | | 'LocalPublic' 6 | | 'Explore' 7 | | 'Notifications' 8 | | 'Hashtag' 9 | | 'List' 10 | | 'Toot' 11 | | 'Account' 12 | | 'Conversations' 13 | | 'Bookmarks' 14 | | 'Favourites' 15 | } 16 | -------------------------------------------------------------------------------- /src/i18n/cs/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "", 5 | "accessibilityHint": "" 6 | }, 7 | "options": { 8 | "save": "", 9 | "share": "" 10 | }, 11 | "save": { 12 | "succeed": "", 13 | "failed": "" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/ru/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "", 5 | "accessibilityHint": "" 6 | }, 7 | "options": { 8 | "save": "", 9 | "share": "" 10 | }, 11 | "save": { 12 | "succeed": "", 13 | "failed": "" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/en/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Select media source", 3 | "message": "Media EXIF data are not uploaded", 4 | "options": { 5 | "image": "Upload photos", 6 | "image_max": "Upload photos (max {{max}})", 7 | "video": "Upload video", 8 | "video_max": "Upload video (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/cs/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "", 4 | "message": "" 5 | }, 6 | "localCorrupt": { 7 | "message": "" 8 | }, 9 | "pushError": { 10 | "message": "", 11 | "description": "" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "", 15 | "videoNotSupported": "" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/no/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Velg mediekilde", 3 | "message": "Media EXIF-data er ikke lastet opp", 4 | "options": { 5 | "image": "Last opp bilder", 6 | "image_max": "Last opp bilder (maks {{max}})", 7 | "video": "Last opp video", 8 | "video_max": "Last opp video (maks {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/ca/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selecciona origen multimèdia", 3 | "message": "Les dades multimèdia EXIF no es penjen", 4 | "options": { 5 | "image": "Penja fotos", 6 | "image_max": "Penja fotos (màx. {{max}})", 7 | "video": "Penja vídeo", 8 | "video_max": "Penja vídeo (màx. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/es/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Elegir origen multimedia", 3 | "message": "Los datos multimedia EXIF no se han subido", 4 | "options": { 5 | "image": "Subir fotos", 6 | "image_max": "Subir fotos (máx. {{max}})", 7 | "video": "Subir vídeo", 8 | "video_max": "Subir vídeo (máx. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/sv/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Välj mediakälla", 3 | "message": "EXIF-data för media laddas inte upp", 4 | "options": { 5 | "image": "Ladda upp bilder", 6 | "image_max": "Ladda upp bilder (max {{max}})", 7 | "video": "Ladda upp video", 8 | "video_max": "Ladda upp video (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/de/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Medienquelle wählen", 3 | "message": "EXIF-Metadaten werden nicht hochgeladen", 4 | "options": { 5 | "image": "Fotos hochladen", 6 | "image_max": "Fotos hochladen (max {{max}})", 7 | "video": "Video hochladen", 8 | "video_max": "Video hochladen (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/nl/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selecteer mediabron", 3 | "message": "Media EXIF gegevens worden niet geüpload", 4 | "options": { 5 | "image": "Foto's uploaden", 6 | "image_max": "Foto's uploaden (max {{max}})", 7 | "video": "Video uploaden", 8 | "video_max": "Video uploaden (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/pl/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Wybierz źródło multimediów", 3 | "message": "Pliki EXIF nie są obsługiwane", 4 | "options": { 5 | "image": "Prześlij zdjęcia", 6 | "image_max": "Prześlij zdjęcia (maks. {{max}})", 7 | "video": "Prześlij film", 8 | "video_max": "Prześlij film (maks. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/be/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Выбар крыніцы медыя", 3 | "message": "Файлы EXIF ​​не падтрымліваюцца", 4 | "options": { 5 | "image": "Запампаваць фота", 6 | "image_max": "Запампаваць фота (макс. {{max}})", 7 | "video": "Запампаваць відэа", 8 | "video_max": "Запампаваць відэа (макс. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/it/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Seleziona origine media", 3 | "message": "I dati EXIF multimediali non sono stati caricati", 4 | "options": { 5 | "image": "Carica foto", 6 | "image_max": "Carica foto (massimo {{max}})", 7 | "video": "Carica video", 8 | "video_max": "Carica video (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/pt_BR/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Selecionar fonte de mídia", 3 | "message": "Os dados EXIF ​​de mídia não são enviados", 4 | "options": { 5 | "image": "Enviar fotos", 6 | "image_max": "Carregar fotos (máx. {{max}})", 7 | "video": "Enviar vídeo", 8 | "video_max": "Carregar vídeo (máx. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "关注" 4 | }, 5 | "block": { 6 | "function": "屏蔽" 7 | }, 8 | "button": { 9 | "error": "读取错误", 10 | "blocked_by": "被用户屏蔽", 11 | "blocking": "取消屏蔽", 12 | "following": "取消关注", 13 | "requested": "取消关注请求", 14 | "default": "关注" 15 | } 16 | } -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | /Pods/ 2 | /build/ 3 | 4 | # Xcode 5 | # 6 | build/ 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | xcuserdata 16 | *.xccheckout 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | *.xcuserstate 22 | project.xcworkspace -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config') 2 | 3 | /** 4 | * Metro configuration 5 | * https://facebook.github.io/metro/docs/configuration 6 | * 7 | * @type {import('metro-config').MetroConfig} 8 | */ 9 | const config = {}; 10 | 11 | module.exports = mergeConfig(getDefaultConfig(__dirname), config) 12 | -------------------------------------------------------------------------------- /src/i18n/uk/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Вибір джерела медіа", 3 | "message": "Дані Media EXIF не вивантажені", 4 | "options": { 5 | "image": "Вивантажити світлини", 6 | "image_max": "Вивантажити світлини (макс. {{max}})", 7 | "video": "Вивантажити відео", 8 | "video_max": "Вивантажити відео (макс. {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "跟隨使用者" 4 | }, 5 | "block": { 6 | "function": "封鎖使用者" 7 | }, 8 | "button": { 9 | "error": "載入錯誤", 10 | "blocked_by": "已被使用者封鎖", 11 | "blocking": "解除封鎖", 12 | "following": "取消跟隨", 13 | "requested": "收回要求", 14 | "default": "跟隨" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/ko/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "사용자 팔로우" 4 | }, 5 | "block": { 6 | "function": "사용자 차단" 7 | }, 8 | "button": { 9 | "error": "불러오기 오류", 10 | "blocked_by": "차단된 사용자", 11 | "blocking": "차단 해제", 12 | "following": "팔로우 해제", 13 | "requested": "요청 취소", 14 | "default": "팔로우" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "更多此圖片的操作", 5 | "accessibilityHint": "您可以儲存或分享此圖片" 6 | }, 7 | "options": { 8 | "save": "儲存圖片", 9 | "share": "分享圖片" 10 | }, 11 | "save": { 12 | "succeed": "圖片已儲存", 13 | "failed": "儲存圖片失敗" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/startup/dev.ts: -------------------------------------------------------------------------------- 1 | import { queryClient } from '@utils/queryHooks' 2 | import log from './log' 3 | 4 | export const dev = () => { 5 | if (__DEV__) { 6 | log('log', 'dev', 'loading tools') 7 | // @ts-ignore 8 | // import('react-query-native-devtools').then(({ addPlugin }) => { 9 | // addPlugin({ queryClient }) 10 | // }) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/splashscreen.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/i18n/zh-Hans/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "更多此图像的操作", 5 | "accessibilityHint": "您可以保存或分享此图片" 6 | }, 7 | "options": { 8 | "save": "保存图片", 9 | "share": "分享图片" 10 | }, 11 | "save": { 12 | "succeed": "图片保存成功", 13 | "failed": "保存图片失败" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/styles/layoutAnimation.ts: -------------------------------------------------------------------------------- 1 | import { AccessibilityInfo, LayoutAnimation } from 'react-native' 2 | 3 | const layoutAnimation = async () => { 4 | const disable = await AccessibilityInfo.isReduceMotionEnabled() 5 | if (disable) return 6 | 7 | LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut) 8 | } 9 | 10 | export default layoutAnimation 11 | -------------------------------------------------------------------------------- /src/i18n/el/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Επιλέξτε πηγή πολυμέσων", 3 | "message": "Τα δεδομένα πολυμέσων EXIF δεν θα αναρτηθούν", 4 | "options": { 5 | "image": "Μεταφόρτωση εικόνας", 6 | "image_max": "Μεταφόρτωση εικόνων (μέχρι {{max}})", 7 | "video": "Μεταφόρτωση βίντεο", 8 | "video_max": "Μεταφόρτωση βίντεο (μέχρι {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/screens/Compose/utils/createContext.ts: -------------------------------------------------------------------------------- 1 | import { createContext, Dispatch } from 'react' 2 | import { ComposeAction, ComposeState } from './types' 3 | 4 | type ContextType = { 5 | composeState: ComposeState 6 | composeDispatch: Dispatch 7 | } 8 | const ComposeContext = createContext({} as ContextType) 9 | 10 | export default ComposeContext 11 | -------------------------------------------------------------------------------- /src/i18n/ja/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "ユーザーをフォロー" 4 | }, 5 | "block": { 6 | "function": "ユーザーをブロック" 7 | }, 8 | "button": { 9 | "error": "読み込みエラー", 10 | "blocked_by": "ユーザーによってブロック", 11 | "blocking": "ブロックを解除", 12 | "following": "フォローをやめる", 13 | "requested": "リクエストを削除", 14 | "default": "フォロー" 15 | } 16 | } -------------------------------------------------------------------------------- /src/screens/Tabs/Shared/Account/Context.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react' 2 | 3 | type AccountContextType = { 4 | account?: Mastodon.Account 5 | relationship?: Mastodon.Relationship 6 | pageMe?: boolean 7 | localInstance: boolean 8 | } 9 | const AccountContext = createContext({} as AccountContextType) 10 | 11 | export default AccountContext 12 | -------------------------------------------------------------------------------- /src/i18n/ja/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "この画像に対するほかのアクション", 5 | "accessibilityHint": "この画像を保存または共有できます" 6 | }, 7 | "options": { 8 | "save": "画像を保存", 9 | "share": "画像を共有" 10 | }, 11 | "save": { 12 | "succeed": "画像を保存しました", 13 | "failed": "画像の保存に失敗しました" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/helpers/getLanguage.ts: -------------------------------------------------------------------------------- 1 | import { getGlobalStorage } from '@utils/storage/actions' 2 | import * as Localization from 'expo-localization' 3 | import { Platform } from 'react-native' 4 | 5 | const getLanguage = (): string | undefined => { 6 | return Platform.OS === 'ios' ? Localization.locale : getGlobalStorage.string('app.language') 7 | } 8 | 9 | export default getLanguage 10 | -------------------------------------------------------------------------------- /src/i18n/fr/components/mediaSelector.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Sélectionnez la source du média", 3 | "message": "Les données Media EXIF ne sont pas téléchargées", 4 | "options": { 5 | "image": "Télécharger des photos", 6 | "image_max": "Télécharger des photos (max {{max}})", 7 | "video": "Télécharger une vidéo", 8 | "video_max": "Télécharger une vidéo (max {{max}})" 9 | } 10 | } -------------------------------------------------------------------------------- /src/i18n/ko/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "이 이미지의 더 많은 동작", 5 | "accessibilityHint": "이 이미지를 저장하거나 공유할 수 있어요" 6 | }, 7 | "options": { 8 | "save": "이미지 저장", 9 | "share": "이미지 공유" 10 | }, 11 | "save": { 12 | "succeed": "이미지 저장됨", 13 | "failed": "이미지 저장 실패" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/screens/Tabs/Me/Root/MyInfo.tsx: -------------------------------------------------------------------------------- 1 | import AccountHeader from '@screens/Tabs/Shared/Account/Header' 2 | import AccountInformation from '@screens/Tabs/Shared/Account/Information' 3 | import React from 'react' 4 | 5 | const MyInfo: React.FC = () => { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | ) 12 | } 13 | 14 | export default MyInfo 15 | -------------------------------------------------------------------------------- /src/i18n/en/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Follow user" 4 | }, 5 | "block": { 6 | "function": "Block user" 7 | }, 8 | "button": { 9 | "error": "Loading error", 10 | "blocked_by": "Blocked by user", 11 | "blocking": "Unblock", 12 | "following": "Unfollow", 13 | "requested": "Withdraw request", 14 | "default": "Follow" 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/storage/index.ts: -------------------------------------------------------------------------------- 1 | import createSecureStore from '@neverdull-agency/expo-unlimited-secure-store' 2 | import { MMKV } from 'react-native-mmkv' 3 | 4 | export const storage: { global: MMKV; account?: MMKV } = { global: new MMKV(), account: undefined } 5 | 6 | export const secureStorage = createSecureStore() 7 | 8 | export const GLOBAL: { connect?: boolean } = { 9 | connect: undefined 10 | } 11 | -------------------------------------------------------------------------------- /react-native.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | dependencies: { 3 | '@react-native-firebase/app': { 4 | platforms: { 5 | ios: null 6 | } 7 | }, 8 | '@react-native-menu/menu': { 9 | platforms: { 10 | ios: null 11 | } 12 | }, 13 | 'react-native-ios-context-menu': { 14 | platforms: { 15 | android: null 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/i18n/vi/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Theo dõi người này" 4 | }, 5 | "block": { 6 | "function": "Chặn người này" 7 | }, 8 | "button": { 9 | "error": "Xảy ra lỗi khi tải", 10 | "blocked_by": "Đã chặn", 11 | "blocking": "Bỏ chặn", 12 | "following": "Bỏ theo dõi", 13 | "requested": "Yêu cầu theo dõi", 14 | "default": "Theo dõi" 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/helpers/permissions.ts: -------------------------------------------------------------------------------- 1 | export const PERMISSION_MANAGE_REPORTS = 0x0000000000000010 2 | export const PERMISSION_MANAGE_USERS = 0x0000000000000400 3 | 4 | export const checkPermission = (permission: number, permissions?: string | number): boolean => 5 | permissions 6 | ? !!( 7 | (typeof permissions === 'string' ? parseInt(permissions || '0') : permissions) & permission 8 | ) 9 | : false 10 | -------------------------------------------------------------------------------- /src/i18n/de/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Folgen" 4 | }, 5 | "block": { 6 | "function": "Blockieren" 7 | }, 8 | "button": { 9 | "error": "Fehler beim Laden", 10 | "blocked_by": "Zugriff durch Nutzer:in verweigert", 11 | "blocking": "Entblocken", 12 | "following": "Entfolgen", 13 | "requested": "Anfrage zurückziehen", 14 | "default": "Folgen" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/no/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Følg bruker" 4 | }, 5 | "block": { 6 | "function": "Blokker bruker" 7 | }, 8 | "button": { 9 | "error": "Feil med lasting", 10 | "blocked_by": "Blokkert av bruker", 11 | "blocking": "Fjern blokkering", 12 | "following": "Slutt å følge", 13 | "requested": "Avbryt forespørsel", 14 | "default": "Følg" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/sv/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Följ användare" 4 | }, 5 | "block": { 6 | "function": "Blockera användare" 7 | }, 8 | "button": { 9 | "error": "Laddningsfel", 10 | "blocked_by": "Blockerad av användare", 11 | "blocking": "Avblockera", 12 | "following": "Sluta följ", 13 | "requested": "Återkalla förfrågan", 14 | "default": "Följ" 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/startup/push.ts: -------------------------------------------------------------------------------- 1 | import * as Notifications from 'expo-notifications' 2 | import log from './log' 3 | 4 | const push = () => { 5 | log('log', 'Push', 'initializing') 6 | Notifications.setNotificationHandler({ 7 | handleNotification: async () => ({ 8 | shouldShowAlert: false, 9 | shouldPlaySound: false, 10 | shouldSetBadge: false 11 | }) 12 | }) 13 | } 14 | 15 | export default push 16 | -------------------------------------------------------------------------------- /src/i18n/it/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Segui utente" 4 | }, 5 | "block": { 6 | "function": "Blocca utente" 7 | }, 8 | "button": { 9 | "error": "Errore di caricamento", 10 | "blocked_by": "Bloccato dall'utente", 11 | "blocking": "Sblocca", 12 | "following": "Smetti di seguire", 13 | "requested": "Annulla la richiesta", 14 | "default": "Segui" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/nl/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Volg gebruiker" 4 | }, 5 | "block": { 6 | "function": "Gebruiker blokkeren" 7 | }, 8 | "button": { 9 | "error": "Fout bij het laden", 10 | "blocked_by": "Geblokkeerd door gebruiker", 11 | "blocking": "Deblokkeer", 12 | "following": "Ontvolg", 13 | "requested": "Aanvraag intrekken", 14 | "default": "Volg" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/vi/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Thêm hành động cho ảnh này", 5 | "accessibilityHint": "Bạn có thể lưu hoặc chia sẻ ảnh này" 6 | }, 7 | "options": { 8 | "save": "Lưu ảnh", 9 | "share": "Chia sẻ ảnh" 10 | }, 11 | "save": { 12 | "succeed": "Đã lưu ảnh", 13 | "failed": "Lưu ảnh thất bại" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/helpers/detectLanguage.ts: -------------------------------------------------------------------------------- 1 | import detect from 'react-native-language-detection'; 2 | 3 | const detectLanguage = async ( 4 | text: string 5 | ): Promise<{ language: string; confidence: number } | null> => { 6 | const possibleLanguages = await detect(text).catch(() => {}) 7 | return possibleLanguages ? possibleLanguages.filter(lang => lang.confidence > 0.5)?.[0] : null 8 | } 9 | 10 | export default detectLanguage 11 | -------------------------------------------------------------------------------- /src/utils/helpers/isMyAccount.ts: -------------------------------------------------------------------------------- 1 | import { getAccountStorage } from '@utils/storage/actions' 2 | 3 | export const checkIsMyAccount = (id?: Mastodon.Account['id']): boolean => { 4 | if (!id) return false 5 | 6 | const accountId = getAccountStorage.string('auth.account.id') 7 | const accountDomain = getAccountStorage.string('auth.account.domain') 8 | return accountId === id || `${accountId}@${accountDomain}` === id 9 | } 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | #FAFAFA 9 | #FFFFFF 10 | #023c69 11 | 12 | -------------------------------------------------------------------------------- /src/i18n/en/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "More actions of this image", 5 | "accessibilityHint": "You can save or share this image" 6 | }, 7 | "options": { 8 | "save": "Save image", 9 | "share": "Share image" 10 | }, 11 | "save": { 12 | "succeed": "Image saved", 13 | "failed": "Saving image failed" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/es/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Seguir usuario" 4 | }, 5 | "block": { 6 | "function": "Bloquear usuario" 7 | }, 8 | "button": { 9 | "error": "Error al cargar", 10 | "blocked_by": "Bloqueado por el usuario", 11 | "blocking": "Desbloquear", 12 | "following": "Dejar de seguir", 13 | "requested": "Retirar solicitud", 14 | "default": "Seguir" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/sv/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Fler åtgärder för denna bild", 5 | "accessibilityHint": "Du kan spara eller dela denna bild" 6 | }, 7 | "options": { 8 | "save": "Spara bild", 9 | "share": "Dela bild" 10 | }, 11 | "save": { 12 | "succeed": "Bild sparad", 13 | "failed": "Kunde inte spara bild" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/components/Loading.tsx: -------------------------------------------------------------------------------- 1 | import { useTheme } from '@utils/styles/ThemeManager' 2 | import { ActivityIndicator, ViewProps } from 'react-native' 3 | 4 | export type Props = { 5 | size?: 'small' | 'large' 6 | } & ViewProps 7 | 8 | export const Loading: React.FC = ({ size = 'small', ...rest }) => { 9 | const { colors } = useTheme() 10 | 11 | return 12 | } 13 | -------------------------------------------------------------------------------- /src/i18n/pt_BR/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Seguir usuário" 4 | }, 5 | "block": { 6 | "function": "Bloquear usuário" 7 | }, 8 | "button": { 9 | "error": "Erro ao carregar", 10 | "blocked_by": "Bloqueado pelo usuário", 11 | "blocking": "Desbloquear", 12 | "following": "Deixar de seguir", 13 | "requested": "Cancelar a solicitação", 14 | "default": "Seguir" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "隐私保护", 4 | "message": "请确保不要泄露其它用户的敏感信息,例如用户名、头像等,谢谢!" 5 | }, 6 | "localCorrupt": { 7 | "message": "登录已过期,请重新登录" 8 | }, 9 | "pushError": { 10 | "message": "推送服务错误", 11 | "description": "请在设置中重新尝试启用推送通知" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "不支持{{type}}类型的图像", 15 | "videoNotSupported": "不支持{{type}}类型的视频" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "隱私權保護", 4 | "message": "請不要散佈使用者的身份,像是使用者名稱、大頭照等,謝謝你!" 5 | }, 6 | "localCorrupt": { 7 | "message": "登入狀態已過期,請重新登入" 8 | }, 9 | "pushError": { 10 | "message": "推播服務錯誤", 11 | "description": "請在設定中重新啟用推播" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "不支援 {{type}} 類型的圖片", 15 | "videoNotSupported": "不支援 {{type}} 類型的影片" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/ca/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Segueix l'usuari" 4 | }, 5 | "block": { 6 | "function": "Bloqueja l'usuari" 7 | }, 8 | "button": { 9 | "error": "Error en carregar", 10 | "blocked_by": "Bloquejat per l'usuari", 11 | "blocking": "Desbloquejar", 12 | "following": "Deixa de seguir", 13 | "requested": "Retirar la sol·licitud", 14 | "default": "Segueix" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/fr/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Suivre l'utilisateur" 4 | }, 5 | "block": { 6 | "function": "Bloquer l'utilisateur" 7 | }, 8 | "button": { 9 | "error": "Erreur de chargement", 10 | "blocked_by": "Bloqué par l'utilisateur", 11 | "blocking": "Débloquer", 12 | "following": "Ne plus suivre", 13 | "requested": "Retirer la demande", 14 | "default": "Suivre" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/no/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Flere handlinger med dette bildet", 5 | "accessibilityHint": "Du kan lagre eller dele dette bildet" 6 | }, 7 | "options": { 8 | "save": "Lagre bilde", 9 | "share": "Del bilde" 10 | }, 11 | "save": { 12 | "succeed": "Bilde lagret", 13 | "failed": "Lagring av bilde feilet" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/pl/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Obserwuj użytkownika" 4 | }, 5 | "block": { 6 | "function": "Zablokuj użytkownika" 7 | }, 8 | "button": { 9 | "error": "Błąd wczytywania", 10 | "blocked_by": "Zablokowany przez użytkownika", 11 | "blocking": "Odblokuj", 12 | "following": "Przestań obserwować", 13 | "requested": "Wycofaj żądanie", 14 | "default": "Obserwuj" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/eu/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Erabiltzailea jarraitu" 4 | }, 5 | "block": { 6 | "function": "Erabiltzailea blokeatu" 7 | }, 8 | "button": { 9 | "error": "Errorea kargatzean", 10 | "blocked_by": "Erabiltzaileak blokeatua", 11 | "blocking": "Desblokeatu", 12 | "following": "Jarraitzeari utzi", 13 | "requested": "Eskaera baztertu", 14 | "default": "Jarraitu" 15 | } 16 | } -------------------------------------------------------------------------------- /src/utils/startup/netInfo.ts: -------------------------------------------------------------------------------- 1 | import NetInfo from '@react-native-community/netinfo' 2 | import { onlineManager } from '@tanstack/react-query' 3 | import log from './log' 4 | 5 | const netInfo = () => { 6 | log('log', 'netInfo', 'initializing') 7 | 8 | onlineManager.setEventListener(setOnline => { 9 | return NetInfo.addEventListener(state => { 10 | setOnline(!!state.isConnected) 11 | }) 12 | }) 13 | } 14 | 15 | export default netInfo 16 | -------------------------------------------------------------------------------- /src/i18n/be/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Падпісацца на карыстальніка" 4 | }, 5 | "block": { 6 | "function": "Заблакіраваць карыстальніка" 7 | }, 8 | "button": { 9 | "error": "Памылка загрузкі", 10 | "blocked_by": "Заблакіраваны карыстальнікам", 11 | "blocking": "Разблакіраваць", 12 | "following": "Адпісацца", 13 | "requested": "Скасаваць запыт", 14 | "default": "Падпісацца" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/ca/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Més accions per aquesta imatge", 5 | "accessibilityHint": "Pots desar o compartir aquesta imatge" 6 | }, 7 | "options": { 8 | "save": "Desa la imatge", 9 | "share": "Comparteix la imatge" 10 | }, 11 | "save": { 12 | "succeed": "Imatge desada", 13 | "failed": "Error al desar la imatge" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/es/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Más acciones para esta imagen", 5 | "accessibilityHint": "Puedes guardar o compartir esta imagen" 6 | }, 7 | "options": { 8 | "save": "Guardar imagen", 9 | "share": "Compartir imagen" 10 | }, 11 | "save": { 12 | "succeed": "Imagen guardada", 13 | "failed": "Error al guardar la imagen" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/eu/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Ekintza gehiago irudi hontarako", 5 | "accessibilityHint": "Irudi hau gorde edo partekatu dezakezu" 6 | }, 7 | "options": { 8 | "save": "Gorde irudia", 9 | "share": "Partekatu irudia" 10 | }, 11 | "save": { 12 | "succeed": "Irudia gordeta", 13 | "failed": "Akatsa irudia gordetzean" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/pt_BR/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Mais ações desta imagem", 5 | "accessibilityHint": "Você pode salvar ou compartilhar esta imagem" 6 | }, 7 | "options": { 8 | "save": "Salvar imagem", 9 | "share": "Compartilhar Imagem" 10 | }, 11 | "save": { 12 | "succeed": "Imagem salva", 13 | "failed": "Falha ao salvar imagem" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/ru/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Подписаться на пользователя" 4 | }, 5 | "block": { 6 | "function": "Заблокировать пользователя" 7 | }, 8 | "button": { 9 | "error": "Ошибка загрузки", 10 | "blocked_by": "Заблокирован пользователем", 11 | "blocking": "Разблокировать", 12 | "following": "Отписаться", 13 | "requested": "Отменить запрос", 14 | "default": "Подписаться" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/uk/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Підписатися на користувача" 4 | }, 5 | "block": { 6 | "function": "Заблокувати користувача" 7 | }, 8 | "button": { 9 | "error": "Помилка завантаження", 10 | "blocked_by": "Заблокований користувачем", 11 | "blocking": "Розблокувати", 12 | "following": "Відписатися", 13 | "requested": "Відкликати запит", 14 | "default": "Підписатися" 15 | } 16 | } -------------------------------------------------------------------------------- /fastlane/metadata/en-US/description.txt: -------------------------------------------------------------------------------- 1 | tooot is an open source, simple yet elegant Mastodon mobile client. A Mastodon (https://joinmastodon.org/) account is required to use this app. 2 | 3 | tooot supports: 4 | - Cross platform, including iPadOS and MacOS 5 | - Multiple accounts 6 | - Dark mode or adapt to system 7 | - Adjustable toot font size 8 | - Push notification 9 | 10 | If you have suggestions, please reach out to @tooot@xmflsct.com or support@tooot.app. 11 | -------------------------------------------------------------------------------- /src/i18n/de/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Weitere Funktionen für das Bild", 5 | "accessibilityHint": "Das Bild kann gespeichert oder geteilt werden" 6 | }, 7 | "options": { 8 | "save": "Bild speichern", 9 | "share": "Bild teilen" 10 | }, 11 | "save": { 12 | "succeed": "Bild gespeichert", 13 | "failed": "Speichern fehlgeschlagen" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/el/components/relationship.json: -------------------------------------------------------------------------------- 1 | { 2 | "follow": { 3 | "function": "Παρακολούθηση χρήστη" 4 | }, 5 | "block": { 6 | "function": "Αποκλεισμός χρήστη" 7 | }, 8 | "button": { 9 | "error": "Σφάλμα φόρτωσης", 10 | "blocked_by": "Αποκλεισμός από χρήστη", 11 | "blocking": "Κατάργηση αποκλεισμού", 12 | "following": "Διακοπή παρακολούθησης", 13 | "requested": "Ανάκληση αιτήματος", 14 | "default": "Παρακολούθηση" 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/it/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Altre azioni per questa immagine", 5 | "accessibilityHint": "Puoi salvare o condividere questa immagine" 6 | }, 7 | "options": { 8 | "save": "Salva immagine", 9 | "share": "Condividi immagine" 10 | }, 11 | "save": { 12 | "succeed": "Immagine salvata", 13 | "failed": "Salvataggio immagine fallito" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/nl/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Meer acties van deze afbeelding", 5 | "accessibilityHint": "Je kunt deze afbeelding opslaan of delen" 6 | }, 7 | "options": { 8 | "save": "Afbeelding opslaan", 9 | "share": "Afbeelding delen" 10 | }, 11 | "save": { 12 | "succeed": "Afbeelding opgeslagen", 13 | "failed": "Afbeelding opslaan mislukt" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/pl/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Więcej działań dla tego obrazka", 5 | "accessibilityHint": "Możesz zapisać lub udostępnić ten obrazek" 6 | }, 7 | "options": { 8 | "save": "Zapisz obraz", 9 | "share": "Udostępnij obraz" 10 | }, 11 | "save": { 12 | "succeed": "Zapisano zdjęcie", 13 | "failed": "Zapisywanie obrazka nie powiodło się" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/be/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Больш дзеянняў на гэтым відарысе", 5 | "accessibilityHint": "Вы можаце захаваць або абагуліць гэты відарыс" 6 | }, 7 | "options": { 8 | "save": "Захаваць відарыс", 9 | "share": "Абагуліць відарыс" 10 | }, 11 | "save": { 12 | "succeed": "Відарыс захаваны", 13 | "failed": "Не атрымалася захаваць відарыс" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/cs/components/instance.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "textInput": { 4 | "placeholder": "" 5 | }, 6 | "whitelisted": "", 7 | "button": "", 8 | "information": { 9 | "name": "", 10 | "description": "" 11 | }, 12 | "disclaimer": { 13 | "base": "" 14 | }, 15 | "terms": { 16 | "base": "" 17 | } 18 | }, 19 | "update": { 20 | "alert": { 21 | "title": "", 22 | "message": "" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@react-native/typescript-config/tsconfig.json", 3 | "compilerOptions": { 4 | "resolveJsonModule": true, 5 | "baseUrl": "./", 6 | "paths": { 7 | "@components/*": [ 8 | "./src/components/*" 9 | ], 10 | "@i18n/*": [ 11 | "./src/i18n/*" 12 | ], 13 | "@screens/*": [ 14 | "./src/screens/*" 15 | ], 16 | "@utils/*": [ 17 | "./src/utils/*" 18 | ] 19 | } 20 | } 21 | } -------------------------------------------------------------------------------- /src/i18n/fr/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Plus d'actions pour cette image", 5 | "accessibilityHint": "Vous pouvez enregistrer ou partager cette image" 6 | }, 7 | "options": { 8 | "save": "Enregistrer l'image", 9 | "share": "Partager l'image" 10 | }, 11 | "save": { 12 | "succeed": "Image enregistrée", 13 | "failed": "L'enregistrement de l'image a échoué" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /src/i18n/ko/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "개인정보 보호", 4 | "message": "다른 사용자의 이름이나, 프로필 사진 등의 정보를 유출하지 말아주세요. 고마워요!" 5 | }, 6 | "localCorrupt": { 7 | "message": "로그인이 만료되었어요. 다시 로그인해주세요" 8 | }, 9 | "pushError": { 10 | "message": "푸시 서비스 오류", 11 | "description": "푸시 알림을 설정에서 다시 활성화해주세요" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "{{type}} 사진 타입은 지원되지 않아요", 15 | "videoNotSupported": "{{type}} 동영상 타입은 지원되지 않아요" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/uk/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Більше дій на цьому зображення", 5 | "accessibilityHint": "Ви можете зберегти чи поділитися цим зображенням" 6 | }, 7 | "options": { 8 | "save": "Зберегти зображення", 9 | "share": "Поділитись зображенням" 10 | }, 11 | "save": { 12 | "succeed": "Зображення збережено", 13 | "failed": "Не вдалося зберегти зображення" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /fastlane/metadata/it/description.txt: -------------------------------------------------------------------------------- 1 | tooot è un client Mastodon semplice e open source. Per utilizzare questo client, devi disporre di un account Mastodon. (https://joinmastodon.org/). 2 | 3 | Tooot supporta: 4 | - Multipiattaforma, inclusi iPadOS e MacOS 5 | - Accesso a più account 6 | - Modalità scura o adattiva 7 | - Dimensione del carattere del testo regolabile 8 | - Notifiche push e altre funzioni 9 | 10 | Per suggerimenti o commenti sull'utilizzo, contattare @tooot@xmflsct.com o support@tooot.app. -------------------------------------------------------------------------------- /src/i18n/ja/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "プライバシー保護", 4 | "message": "ユーザー名やアバターなど、他のユーザーを特定する情報は公開しないでください。" 5 | }, 6 | "localCorrupt": { 7 | "message": "ログインの有効期限が切れました。もう一度ログインしてください。" 8 | }, 9 | "pushError": { 10 | "message": "プッシュサービスのエラー", 11 | "description": "設定でプッシュ通知を再度有効にしてください" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "画像ファイル形式 {{type}} はサポートされていません", 15 | "videoNotSupported": "動画ファイル形式 {{type}} はサポートされていません" 16 | } 17 | } -------------------------------------------------------------------------------- /src/utils/queryHooks/utils.ts: -------------------------------------------------------------------------------- 1 | import { InfiniteData } from '@tanstack/react-query' 2 | import { PagedResponse } from '@utils/api/helpers' 3 | 4 | export const infinitePageParams = { 5 | getPreviousPageParam: (firstPage: PagedResponse) => firstPage.links?.prev, 6 | getNextPageParam: (lastPage: PagedResponse) => lastPage.links?.next 7 | } 8 | 9 | export const flattenPages = (data: InfiniteData> | undefined): T[] | [] => 10 | data?.pages.flatMap(page => page.body) || [] 11 | -------------------------------------------------------------------------------- /src/utils/startup/audio.ts: -------------------------------------------------------------------------------- 1 | import { Audio, InterruptionModeAndroid, InterruptionModeIOS } from 'expo-av' 2 | import log from './log' 3 | 4 | const audio = () => { 5 | log('log', 'audio', 'setting audio playback default options') 6 | Audio.setAudioModeAsync({ 7 | interruptionModeIOS: InterruptionModeIOS.DoNotMix, 8 | interruptionModeAndroid: InterruptionModeAndroid.DoNotMix, 9 | playsInSilentModeIOS: true, 10 | staysActiveInBackground: false 11 | }) 12 | } 13 | 14 | export default audio 15 | -------------------------------------------------------------------------------- /src/i18n/el/screens/imageViewer.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": { 3 | "actions": { 4 | "accessibilityLabel": "Περισσότερες ενέργειες για αυτή την εικόνα", 5 | "accessibilityHint": "Μπορείτε να αποθηκεύσετε ή να μοιραστείτε αυτή την εικόνα" 6 | }, 7 | "options": { 8 | "save": "Αποθήκευση εικόνας", 9 | "share": "Κοινοποίηση εικόνας" 10 | }, 11 | "save": { 12 | "succeed": "Η εικόνα αποθηκεύτηκε", 13 | "failed": "Η αποθήκευση της εικόνας απέτυχε" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | # NODE_BINARY variable contains the PATH to the node executable. 6 | # 7 | # Customize the NODE_BINARY variable here. 8 | # For example, to use nvm with brew, add the following line 9 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 10 | export NODE_BINARY=$(command -v node) -------------------------------------------------------------------------------- /src/i18n/locales.ts: -------------------------------------------------------------------------------- 1 | const LOCALES = { 2 | be: 'Беларуская', 3 | ca: 'Català', 4 | de: 'Deutsch', 5 | el: 'Ελληνικά', 6 | en: 'English', 7 | es: 'Español', 8 | eu: 'Euskara', 9 | fr: 'Français', 10 | it: 'Italiano', 11 | ja: '日本語', 12 | ko: '한국어', 13 | nl: 'Nederlands', 14 | no: 'Norsk', 15 | pl: 'Polski', 16 | 'pt-br': 'Português (Brasil)', 17 | sv: 'Svenska', 18 | uk: 'українська', 19 | vi: 'Tiếng Việt', 20 | 'zh-hans': '简体中文', 21 | 'zh-hant': '繁體中文' 22 | } 23 | 24 | export { LOCALES } 25 | -------------------------------------------------------------------------------- /src/utils/queryHooks/index.ts: -------------------------------------------------------------------------------- 1 | import { QueryClient } from '@tanstack/react-query' 2 | 3 | export const globalRetry = (failureCount: number) => failureCount <= 2 4 | 5 | export const queryClient = new QueryClient({ 6 | defaultOptions: { 7 | queries: { 8 | staleTime: 1000 * 60 * 5, 9 | retry: (failureCount, error: any) => { 10 | if ([401, 404].includes(error?.status)) { 11 | return false 12 | } 13 | 14 | return globalRetry(failureCount) 15 | } 16 | } 17 | } 18 | }) 19 | -------------------------------------------------------------------------------- /ios/ShareExtension/ShareExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.com.xmflsct.app.tooot 10 | 11 | com.apple.security.personal-information.photos-library 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version 4 | ruby ">= 2.6.10" 5 | 6 | # Cocoapods 1.15 introduced a bug which break the build. We will remove the upper 7 | # bound in the template on Cocoapods with next React Native release. 8 | gem 'cocoapods', '>= 1.13', '< 1.15' 9 | gem 'activesupport', '>= 6.1.7.5', '< 7.1.0' 10 | 11 | gem "fastlane" 12 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 13 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 14 | -------------------------------------------------------------------------------- /src/utils/helpers/removeHTML.ts: -------------------------------------------------------------------------------- 1 | import * as htmlparser2 from 'htmlparser2' 2 | 3 | const removeHTML = (text: string): string => { 4 | if (!text) return '' 5 | 6 | let raw: string = '' 7 | 8 | const parser = new htmlparser2.Parser({ 9 | ontext: (text: string) => { 10 | raw = raw + text 11 | }, 12 | onclosetag: (tag: string) => { 13 | if (['p', 'br'].includes(tag)) raw = raw + `\n` 14 | } 15 | }) 16 | 17 | parser.write(text) 18 | parser.end() 19 | 20 | return raw.replace(new RegExp(/\s$/), '') 21 | } 22 | 23 | export default removeHTML 24 | -------------------------------------------------------------------------------- /src/i18n/en/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Privacy Protection", 4 | "message": "Please do not disclose other user's identity, such as username, avatar, etc. Thank you!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Login expired, please login again" 8 | }, 9 | "pushError": { 10 | "message": "Push service error", 11 | "description": "Please re-enable push notification in settings" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Image type {{type}} not supported", 15 | "videoNotSupported": "Video type {{type}} not supported" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hant/components/instance.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "textInput": { 4 | "placeholder": "站點的網域" 5 | }, 6 | "whitelisted": "這可能是一個白名單站點,在登入前無法檢索資料。", 7 | "button": "登入", 8 | "information": { 9 | "name": "名稱", 10 | "description": "簡介" 11 | }, 12 | "disclaimer": { 13 | "base": "將使用系統內建的瀏覽器來登入,tooot 無法讀取您的帳號資訊。" 14 | }, 15 | "terms": { 16 | "base": "登入則表示您同意<0>隱私政策和<1>使用條款。" 17 | } 18 | }, 19 | "update": { 20 | "alert": { 21 | "title": "已登入站點", 22 | "message": "您可以登入其它的帳號,已登入的帳號會被保留" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/i18n/it/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Tutela della privacy", 4 | "message": "Per favore, non rivelare l'identità degli altri utenti (nome, foto profilo, ecc..). Grazie!" 5 | }, 6 | "localCorrupt": { 7 | "message": "La sessione è scaduta, devi riaccedere" 8 | }, 9 | "pushError": { 10 | "message": "Errore servizio push", 11 | "description": "Riabilita le notifiche push nelle impostazioni" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Tipo immagine {{type}} non supportato", 15 | "videoNotSupported": "Tipo video {{type}} non supportato" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/zh-Hans/components/instance.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "textInput": { 4 | "placeholder": "实例域名" 5 | }, 6 | "whitelisted": "这可能是一个白名单实例,在登录前无法获取数据。", 7 | "button": "登录", 8 | "information": { 9 | "name": "社区名称", 10 | "description": "简介" 11 | }, 12 | "disclaimer": { 13 | "base": "登录过程将使用系统浏览器,你的账号登录信息tooot应用无法读取。" 14 | }, 15 | "terms": { 16 | "base": "登录即表示您同意<0>隐私政策和<1>服务条款。" 17 | } 18 | }, 19 | "update": { 20 | "alert": { 21 | "title": "此社区已登录", 22 | "message": "你可以登录同个社区的另一个账号,不影响已登录的账号" 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /src/i18n/no/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Personvernbeskyttelse", 4 | "message": "Vennligst ikke avslør brukerens identitet, som f. eks. brukernavn, profilbilde, osv. Tusen takk!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Din økt er utløpt, vennligst logg inn igjen" 8 | }, 9 | "pushError": { 10 | "message": "Feil ved push-tjeneste", 11 | "description": "Vennligst aktiver push-varsling i innstillingene" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Bildetype {{type}} støttes ikke", 15 | "videoNotSupported": "Videotype {{type}} støttes ikke" 16 | } 17 | } -------------------------------------------------------------------------------- /src/utils/storage/migrations/legacy/contexts.ts: -------------------------------------------------------------------------------- 1 | import { ScreenTabsStackParamList } from '@utils/navigation/navigators' 2 | 3 | export type LegacyContexts = { 4 | storeReview: { 5 | context: Readonly 6 | current: number 7 | shown: boolean 8 | } 9 | publicRemoteNotice: { 10 | context: Readonly 11 | current: number 12 | hidden: boolean 13 | } 14 | previousTab: Extract< 15 | keyof ScreenTabsStackParamList, 16 | 'Tab-Local' | 'Tab-Public' | 'Tab-Notifications' | 'Tab-Me' 17 | > 18 | previousSegment?: Extract 19 | } 20 | -------------------------------------------------------------------------------- /src/components/Hr.tsx: -------------------------------------------------------------------------------- 1 | import { StyleConstants } from '@utils/styles/constants' 2 | import { useTheme } from '@utils/styles/ThemeManager' 3 | import { View, ViewStyle } from 'react-native' 4 | 5 | const Hr: React.FC<{ style?: ViewStyle }> = ({ style }) => { 6 | const { colors } = useTheme() 7 | 8 | return ( 9 | 20 | ) 21 | } 22 | 23 | export default Hr 24 | -------------------------------------------------------------------------------- /src/i18n/sv/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Integritetsskydd", 4 | "message": "Vänligen avslöja inte någon annan användares identitet, såsom användarnamn, profilbild etc. Tack!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Inloggningen har gått ut. Försök att logga in igen" 8 | }, 9 | "pushError": { 10 | "message": "Fel i push-tjänster", 11 | "description": "Vänligen återaktivera pushnotiser i inställningar" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Bildformatet {{type}} stöds inte", 15 | "videoNotSupported": "Videoformatet {{type}} stöds inte" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/vi/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Bảo vệ quyền riêng tư", 4 | "message": "Hãy tôn trọng thông tin cá nhân của người khác như tên tài khoản, ảnh đại diện, nhắn riêng etc. Cám ơn!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Phiên đăng nhập hết hạn, hãy đăng nhập lại!" 8 | }, 9 | "pushError": { 10 | "message": "Lỗi thông báo đẩy", 11 | "description": "Hãy cho phép thông báo đẩy trong mục cài đặt!" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Không hỗ trợ định dạng ảnh {{type}}", 15 | "videoNotSupported": "Không hỗ trợ định dạng video {{type}}" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/cs/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "buttons": { 3 | "OK": "", 4 | "apply": "", 5 | "cancel": "", 6 | "discard": "", 7 | "continue": "", 8 | "create": "", 9 | "delete": "", 10 | "done": "", 11 | "confirm": "", 12 | "add": "" 13 | }, 14 | "customEmoji": { 15 | "accessibilityLabel": "" 16 | }, 17 | "message": { 18 | "success": { 19 | "message": "" 20 | }, 21 | "warning": { 22 | "message": "" 23 | }, 24 | "error": { 25 | "message": "" 26 | } 27 | }, 28 | "separator": "", 29 | "discard": { 30 | "title": "", 31 | "message": "" 32 | } 33 | } -------------------------------------------------------------------------------- /src/i18n/pl/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Ochrona Prywatności", 4 | "message": "Proszę nie ujawniać tożsamości innych użytkowników, takich jak nazwa użytkownika, awatar itp. Dziękujemy!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Sesja wygasła, zaloguj się ponownie" 8 | }, 9 | "pushError": { 10 | "message": "Błąd usługi push", 11 | "description": "Proszę włączyć ponownie powiadomienia push w ustawieniach" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Typ obrazu {{type}} nie jest wspierany", 15 | "videoNotSupported": "Typ nagrania {{type}} nie jest wspierany" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/be/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Абарона прыватнасці", 4 | "message": "Калі ласка, не раскрывайце асобу іншых карыстальнікаў, такіх як імя карыстальніка, аватар і г.д. Дзякуй!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Тэрмін дзеяння ўваходу скончыўся. Увайдзіце яшчэ раз" 8 | }, 9 | "pushError": { 10 | "message": "Памылка сэрвісу Push", 11 | "description": "Паўторна ўключыце push-апавяшчэнне ў наладах" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "Тып відарыса {{type}} не падтрымліваецца", 15 | "videoNotSupported": "Тып відэа {{type}} не падтрымліваецца" 16 | } 17 | } -------------------------------------------------------------------------------- /src/i18n/eu/screens.json: -------------------------------------------------------------------------------- 1 | { 2 | "screenshot": { 3 | "title": "Pribatutasun-babesa", 4 | "message": "Mesedez, ez ezagutarazi besteen identitatea, adibidez: erabiltzailea, abatarra, etab. Eskerrik asko!" 5 | }, 6 | "localCorrupt": { 7 | "message": "Saioa iraungita, mesedez, hasi saioa berriro" 8 | }, 9 | "pushError": { 10 | "message": "Push zerbitzuaren errorea", 11 | "description": "Mesedez, gaitu berriro push jakinarazpenak ezarpenetan" 12 | }, 13 | "shareError": { 14 | "imageNotSupported": "{{type}} irudi-mota ez da bateragarria", 15 | "videoNotSupported": "{{type}} bideo-mota ez da bateragarria" 16 | } 17 | } -------------------------------------------------------------------------------- /src/screens/Tabs/Me/Root/Switch.tsx: -------------------------------------------------------------------------------- 1 | import Button from '@components/Button' 2 | import { useNavigation } from '@react-navigation/native' 3 | import React from 'react' 4 | import { useTranslation } from 'react-i18next' 5 | 6 | const AccountInformationSwitch: React.FC = () => { 7 | const navigation = useNavigation() 8 | const { t } = useTranslation('screenTabs') 9 | 10 | return ( 11 |