diff --git a/package.json b/package.json index 772841de..d6b6b5c6 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@sentry/react-native": "^4.2.2", "@sharcoux/slider": "^6.0.3", "axios": "^0.27.2", - "expo": "^46.0.6", + "expo": "^46.0.7", "expo-auth-session": "^3.7.1", "expo-av": "^12.0.4", "expo-constants": "^13.2.3", diff --git a/patches/expo-modules-core+0.11.3.patch b/patches/expo-modules-core+0.11.3.patch new file mode 100644 index 00000000..1f603ec7 --- /dev/null +++ b/patches/expo-modules-core+0.11.3.patch @@ -0,0 +1,22 @@ +diff --git a/node_modules/expo-modules-core/android/build.gradle b/node_modules/expo-modules-core/android/build.gradle +index a57c367..47c7bd6 100644 +--- a/node_modules/expo-modules-core/android/build.gradle ++++ b/node_modules/expo-modules-core/android/build.gradle +@@ -422,7 +422,7 @@ task prepareFolly(dependsOn: [downloadFolly], type: Copy) { + } + // END FOLLy + +-task prepareHermes() { ++task prepareHermes(dependsOn: createNativeDepsDirectories) { + if (!FOR_HERMES) { + return + } +@@ -444,7 +444,7 @@ afterEvaluate { + } + + tasks.whenTaskAdded { task -> +- if (!task.name.contains("Clean") && (task.name.contains('externalNativeBuild') || task.name.startsWith('configureCMake'))) { ++ if (!task.name.contains("Clean") && (task.name.contains('externalNativeBuild'))) { + def buildType = task.name.endsWith('Debug') ? 'Debug' : 'Release' + task.dependsOn(extractAARHeaders) + task.dependsOn(extractJNIFiles) diff --git a/src/components/Header/Center.tsx b/src/components/Header/Center.tsx index efbccd30..9ea53fba 100644 --- a/src/components/Header/Center.tsx +++ b/src/components/Header/Center.tsx @@ -1,31 +1,53 @@ +import Icon from '@components/Icon' import CustomText from '@components/Text' +import { StyleConstants } from '@utils/styles/constants' import { useTheme } from '@utils/styles/ThemeManager' import React from 'react' +import { View } from 'react-native' export interface Props { - content: React.ReactNode | string + content?: string inverted?: boolean onPress?: () => void + dropdown?: boolean } // Used for Android mostly const HeaderCenter: React.FC = ({ content, inverted = false, - onPress + onPress, + dropdown = false }) => { const { colors } = useTheme() return ( - + > + + {dropdown ? ( + + ) : null} + ) } diff --git a/src/components/Parse/HTML.tsx b/src/components/Parse/HTML.tsx index 5a112634..b42b28c8 100644 --- a/src/components/Parse/HTML.tsx +++ b/src/components/Parse/HTML.tsx @@ -277,7 +277,7 @@ const ParseHTML = React.memo( color: colors.primaryDefault, marginRight: StyleConstants.Spacing.S }} - children={t(`HTML.expanded.${expanded.toString()}`, { + children={t('HTML.expanded', { hint: expandHint, totalLines: numberOfLines > 1 && typeof totalLines === 'number' diff --git a/src/components/Timeline/Shared/Attachment.tsx b/src/components/Timeline/Shared/Attachment.tsx index 0d2f5c40..7c49a47c 100644 --- a/src/components/Timeline/Shared/Attachment.tsx +++ b/src/components/Timeline/Shared/Attachment.tsx @@ -47,20 +47,6 @@ const TimelineAttachment = React.memo( >([]) const navigation = useNavigation>() const navigateToImagesViewer = (id: string) => { - status.media_attachments.forEach(attachment => { - switch (attachment.type) { - case 'image': - imageUrls.current.push({ - id: attachment.id, - preview_url: attachment.preview_url, - url: attachment.url, - remote_url: attachment.remote_url, - blurhash: attachment.blurhash, - width: attachment.meta?.original?.width, - height: attachment.meta?.original?.height - }) - } - }) navigation.navigate('Screen-ImagesViewer', { imageUrls: imageUrls.current, id @@ -82,6 +68,15 @@ const TimelineAttachment = React.memo( {status.media_attachments.map((attachment, index) => { switch (attachment.type) { case 'image': + imageUrls.current.push({ + id: attachment.id, + preview_url: attachment.preview_url, + url: attachment.url, + remote_url: attachment.remote_url, + blurhash: attachment.blurhash, + width: attachment.meta?.original?.width, + height: attachment.meta?.original?.height + }) return ( = ({ opacity: sensitiveShown ? 0 : 1 }} usePoster + resizeMode={ResizeMode.COVER} {...(gifv ? { shouldPlay: true, @@ -107,7 +108,6 @@ const AttachmentVideo: React.FC = ({ source: { uri: video.url } } : { - resizeMode: ResizeMode.COVER, posterSource: { uri: video.preview_url }, posterStyle: { resizeMode: ResizeMode.COVER } })} diff --git a/src/i18n/de/components/parse.json b/src/i18n/de/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/de/components/parse.json +++ b/src/i18n/de/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/de/components/timeline.json b/src/i18n/de/components/timeline.json index f43f65f5..17e7ad6d 100644 --- a/src/i18n/de/components/timeline.json +++ b/src/i18n/de/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "Zum Profil von {{name}}" }, "content": { - "expandHint": "" + "expandHint": "Ausgeblendeter Inhalt" }, "filtered": "Ausgeblendet", "fullConversation": "Unterhaltung anzeigen", diff --git a/src/i18n/en/components/parse.json b/src/i18n/en/components/parse.json index 7d27c1d0..2305906a 100644 --- a/src/i18n/en/components/parse.json +++ b/src/i18n/en/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "Tap to expand or collapse content", - "expanded": { - "true": "{{hint}}{{totalLines}}", - "false": "{{hint}}{{totalLines}}" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": " ({{count}} lines)", "defaultHint": "Long toot" } diff --git a/src/i18n/it/components/parse.json b/src/i18n/it/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/it/components/parse.json +++ b/src/i18n/it/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/it/components/timeline.json b/src/i18n/it/components/timeline.json index 75f492d2..55a85ff5 100644 --- a/src/i18n/it/components/timeline.json +++ b/src/i18n/it/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "Premi per aprire il profilo di {{name}}" }, "content": { - "expandHint": "" + "expandHint": "Contenuto nascosto" }, "filtered": "Filtrato", "fullConversation": "Leggi la conversazione", diff --git a/src/i18n/ja/components/parse.json b/src/i18n/ja/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/ja/components/parse.json +++ b/src/i18n/ja/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/ko/components/parse.json b/src/i18n/ko/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/ko/components/parse.json +++ b/src/i18n/ko/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/ko/components/timeline.json b/src/i18n/ko/components/timeline.json index ea92aaf6..2cdda060 100644 --- a/src/i18n/ko/components/timeline.json +++ b/src/i18n/ko/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "{{name}}의 페이지로 가려면 탭하세요" }, "content": { - "expandHint": "" + "expandHint": "숨겨진 콘텐츠" }, "filtered": "필터됨", "fullConversation": "대화 보기", diff --git a/src/i18n/pt_BR/components/parse.json b/src/i18n/pt_BR/components/parse.json index 4cc149c6..4b07729b 100644 --- a/src/i18n/pt_BR/components/parse.json +++ b/src/i18n/pt_BR/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { - "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "accessibilityHint": "Toque para expandir ou recolher conteúdo", + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/pt_BR/components/timeline.json b/src/i18n/pt_BR/components/timeline.json index a44f6b91..c5f3f967 100644 --- a/src/i18n/pt_BR/components/timeline.json +++ b/src/i18n/pt_BR/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "Toque para ir à página de {{name}}" }, "content": { - "expandHint": "" + "expandHint": "Conteúdo oculto" }, "filtered": "Filtrado", "fullConversation": "Ler conversas", diff --git a/src/i18n/vi/components/parse.json b/src/i18n/vi/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/vi/components/parse.json +++ b/src/i18n/vi/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/i18n/vi/components/timeline.json b/src/i18n/vi/components/timeline.json index 0c46d07f..4b1c863c 100644 --- a/src/i18n/vi/components/timeline.json +++ b/src/i18n/vi/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "Đến trang của {{name}}" }, "content": { - "expandHint": "" + "expandHint": "Nội dung ẩn" }, "filtered": "Đã lọc", "fullConversation": "Xem thêm", diff --git a/src/i18n/zh-Hans/components/contextMenu.json b/src/i18n/zh-Hans/components/contextMenu.json index 6c186931..cd6339a6 100644 --- a/src/i18n/zh-Hans/components/contextMenu.json +++ b/src/i18n/zh-Hans/components/contextMenu.json @@ -15,8 +15,8 @@ } }, "copy": { - "action": "", - "succeed": "" + "action": "复制嘟文", + "succeed": "已复制" }, "instance": { "title": "实例操作", diff --git a/src/i18n/zh-Hans/components/parse.json b/src/i18n/zh-Hans/components/parse.json index 4cc149c6..dc86c41a 100644 --- a/src/i18n/zh-Hans/components/parse.json +++ b/src/i18n/zh-Hans/components/parse.json @@ -1,11 +1,8 @@ { "HTML": { - "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, - "totalLines": "", - "defaultHint": "" + "accessibilityHint": "点击展开或折叠内容", + "expanded": "{{hint}}{{totalLines}}", + "totalLines": " ({{count}} 行)", + "defaultHint": "长嘟文" } } \ No newline at end of file diff --git a/src/i18n/zh-Hans/components/timeline.json b/src/i18n/zh-Hans/components/timeline.json index 02b1843f..3fcbbf1d 100644 --- a/src/i18n/zh-Hans/components/timeline.json +++ b/src/i18n/zh-Hans/components/timeline.json @@ -81,7 +81,7 @@ "accessibilityHint": "点击进入{{name}}的页面" }, "content": { - "expandHint": "" + "expandHint": "隐藏内容" }, "filtered": "已过滤", "fullConversation": "阅读全部对话", diff --git a/src/i18n/zh-Hans/screens/accountSelection.json b/src/i18n/zh-Hans/screens/accountSelection.json index b16795a6..49a8ec4a 100644 --- a/src/i18n/zh-Hans/screens/accountSelection.json +++ b/src/i18n/zh-Hans/screens/accountSelection.json @@ -1,6 +1,6 @@ { - "heading": "", + "heading": "分享到...", "content": { - "select_account": "" + "select_account": "选择帐号" } } \ No newline at end of file diff --git a/src/i18n/zh-Hans/screens/tabs.json b/src/i18n/zh-Hans/screens/tabs.json index 339ce8f7..2a3f661d 100644 --- a/src/i18n/zh-Hans/screens/tabs.json +++ b/src/i18n/zh-Hans/screens/tabs.json @@ -146,7 +146,7 @@ "label": "标签", "content": "内容" }, - "mediaSelectionFailed": "" + "mediaSelectionFailed": "图片处理失败,请重试" }, "push": { "notAvailable": "您的手机不支持tooot推送通知", diff --git a/src/i18n/zh-Hant/components/parse.json b/src/i18n/zh-Hant/components/parse.json index 4cc149c6..fc364f0e 100644 --- a/src/i18n/zh-Hant/components/parse.json +++ b/src/i18n/zh-Hant/components/parse.json @@ -1,10 +1,7 @@ { "HTML": { "accessibilityHint": "", - "expanded": { - "true": "", - "false": "" - }, + "expanded": "{{hint}}{{totalLines}}", "totalLines": "", "defaultHint": "" } diff --git a/src/screens/ImagesViewer.tsx b/src/screens/ImagesViewer.tsx index 23dfb816..555c5353 100644 --- a/src/screens/ImagesViewer.tsx +++ b/src/screens/ImagesViewer.tsx @@ -2,13 +2,9 @@ import analytics from '@components/analytics' import { HeaderCenter, HeaderLeft, HeaderRight } from '@components/Header' import { Message } from '@components/Message' import { useActionSheet } from '@expo/react-native-action-sheet' -import { NativeStackNavigationProp } from '@react-navigation/native-stack' -import { - RootStackParamList, - RootStackScreenProps -} from '@utils/navigation/navigators' +import { RootStackScreenProps } from '@utils/navigation/navigators' import { useTheme } from '@utils/styles/ThemeManager' -import React, { RefObject, useCallback, useRef, useState } from 'react' +import React, { useCallback, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { Platform, Share, StatusBar, View } from 'react-native' import FlashMessage from 'react-native-flash-message' diff --git a/src/screens/Tabs/Local.tsx b/src/screens/Tabs/Local.tsx index b46f5b79..2b2ae681 100644 --- a/src/screens/Tabs/Local.tsx +++ b/src/screens/Tabs/Local.tsx @@ -1,7 +1,5 @@ import analytics from '@components/analytics' import { HeaderCenter, HeaderRight } from '@components/Header' -import Icon from '@components/Icon' -import CustomText from '@components/Text' import Timeline from '@components/Timeline' import TimelineDefault from '@components/Timeline/Default' import { createNativeStackNavigator } from '@react-navigation/native-stack' @@ -11,26 +9,22 @@ import { } from '@utils/navigation/navigators' import { useListsQuery } from '@utils/queryHooks/lists' import { QueryKeyTimeline } from '@utils/queryHooks/timeline' -import { StyleConstants } from '@utils/styles/constants' import layoutAnimation from '@utils/styles/layoutAnimation' -import { useTheme } from '@utils/styles/ThemeManager' import React, { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' -import { Pressable, StyleSheet, Text, View } from 'react-native' +import ContextMenu from 'react-native-context-menu-view' import TabSharedRoot from './Shared/Root' const Stack = createNativeStackNavigator() const TabLocal = React.memo( ({ navigation }: ScreenTabsScreenProps<'Tab-Local'>) => { - const { colors } = useTheme() const { t } = useTranslation('screenTabs') const { data: lists } = useListsQuery({}) - const [listsShown, setListsShown] = useState(false) useEffect(() => { layoutAnimation() - }, [listsShown]) + }, [lists?.length]) const [queryKey, setQueryKey] = useState([ 'Timeline', @@ -43,25 +37,42 @@ const TabLocal = React.memo( name='Tab-Local-Root' options={{ headerTitle: () => ( - { - if (lists?.length) { - setListsShown(!listsShown) - } + ({ + id: list.id, + title: list.title, + disabled: + queryKey[1].page === 'List' && + queryKey[1].list === list.id + })) + ] + : undefined + } + onPress={({ nativeEvent: { id } }) => { + id.length + ? setQueryKey(['Timeline', { page: 'List', list: id }]) + : setQueryKey(['Timeline', { page: 'Following' }]) }} - content={ - <> - {t('tabs.local.name')} - {lists?.length ? ( - - ) : null} - + children={ + 0} + content={ + queryKey[1].page === 'List' && queryKey[1].list?.length + ? lists?.find(list => list.id === queryKey[1].list) + ?.title + : t('tabs.local.name') + } + /> } /> ), @@ -81,68 +92,15 @@ const TabLocal = React.memo( ) }} children={() => ( - <> - ( - - ) - }} - /> - {listsShown ? ( - - { - setQueryKey(['Timeline', { page: 'Following' }]) - setListsShown(!listsShown) - }} - > - - Default - - - {lists?.map(list => ( - { - setQueryKey([ - 'Timeline', - { page: 'List', list: list.id } - ]) - setListsShown(!listsShown) - }} - > - - {list.title} - - - ))} - - ) : null} - + ( + + ) + }} + /> )} /> {TabSharedRoot({ Stack })} diff --git a/src/startup/audio.ts b/src/startup/audio.ts index 73cedcd4..aab659d2 100644 --- a/src/startup/audio.ts +++ b/src/startup/audio.ts @@ -5,7 +5,7 @@ const audio = () => { log('log', 'audio', 'setting audio playback default options') Audio.setAudioModeAsync({ playsInSilentModeIOS: true, - interruptionModeIOS: InterruptionModeIOS.DuckOthers, + interruptionModeIOS: InterruptionModeIOS.MixWithOthers, interruptionModeAndroid: InterruptionModeAndroid.DuckOthers }) } diff --git a/src/startup/sentry.ts b/src/startup/sentry.ts index d9d55ffd..2655e99c 100644 --- a/src/startup/sentry.ts +++ b/src/startup/sentry.ts @@ -4,6 +4,7 @@ import log from './log' const sentry = () => { log('log', 'Sentry', 'initializing') Sentry.init({ + // @ts-ignore dsn: 'https://53348b60ff844d52886e90251b3a5f41@o917354.ingest.sentry.io/6410576', enableInExpoDevelopment: false, autoSessionTracking: true diff --git a/yarn.lock b/yarn.lock index e7cf2ae9..8a6314f4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1104,10 +1104,10 @@ mv "~2" safe-json-stringify "~1" -"@expo/cli@0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.2.8.tgz#a5403d3abca844ee6489041e1af5aa39d842c954" - integrity sha512-8+LBXRKommR7Nmmp+anGNnTQaHyGQDvofcbujmo6pjGI99Z07F5lFyeZNL4h5ZJAMxgzjDfJeLxsRHzo0gy4pA== +"@expo/cli@0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.2.9.tgz#5d1bf563dd63b7c14fc7796d7fbb018a17f22f2e" + integrity sha512-CUWtHH5yYEgEA4nf/k7LYW39FKORIB94ROvG+wuxZC4b5IrJs6DAsoFgunqUFFQZ7Jga2XPyx5+d27n2Ez3LCA== dependencies: "@babel/runtime" "^7.14.0" "@expo/code-signing-certificates" "^0.0.2" @@ -4205,13 +4205,13 @@ expo-web-browser@^11.0.0, expo-web-browser@~11.0.0: dependencies: compare-urls "^2.0.0" -expo@^46.0.6: - version "46.0.6" - resolved "https://registry.yarnpkg.com/expo/-/expo-46.0.6.tgz#fd1bd159ef5d87196ab13502e86080052e3f573b" - integrity sha512-60fM7sqLppVd6jP73uWuqiLW7BbC20WxFRfAz+r4a7bRkrD/jUwvdQlVKIj9KpQQHWaDeuASj3rSGtU9CytPhg== +expo@^46.0.7: + version "46.0.7" + resolved "https://registry.yarnpkg.com/expo/-/expo-46.0.7.tgz#ab4dd82584f18758777178bdf60d6098715c4b28" + integrity sha512-vBn3/K2CxIVQvHUA6t1qn3ewsJvUvs5xTMFa7wbf275fj5OoiVTfH3qpbkj6K5msN6dMOQ7MqMjrsDmTnMrgqA== dependencies: "@babel/runtime" "^7.14.0" - "@expo/cli" "0.2.8" + "@expo/cli" "0.2.9" "@expo/vector-icons" "^13.0.0" babel-preset-expo "~9.2.0" cross-spawn "^6.0.5"