mirror of
https://github.com/tooot-app/app
synced 2025-06-05 22:19:13 +02:00
Fix #595
This commit is contained in:
@ -254,9 +254,6 @@
|
|||||||
"content_true": "Enabled",
|
"content_true": "Enabled",
|
||||||
"content_false": "Disabled"
|
"content_false": "Disabled"
|
||||||
},
|
},
|
||||||
"update": {
|
|
||||||
"title": "Update to latest version"
|
|
||||||
},
|
|
||||||
"logout": {
|
"logout": {
|
||||||
"button": "Log out",
|
"button": "Log out",
|
||||||
"alert": {
|
"alert": {
|
||||||
|
@ -2,13 +2,11 @@ import GracefullyImage from '@components/GracefullyImage'
|
|||||||
import haptics from '@components/haptics'
|
import haptics from '@components/haptics'
|
||||||
import Icon from '@components/Icon'
|
import Icon from '@components/Icon'
|
||||||
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
|
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'
|
||||||
import { useAppDispatch } from '@root/store'
|
|
||||||
import { RootStackScreenProps, ScreenTabsStackParamList } from '@utils/navigation/navigators'
|
import { RootStackScreenProps, ScreenTabsStackParamList } from '@utils/navigation/navigators'
|
||||||
import { getVersionUpdate, retrieveVersionLatest } from '@utils/slices/appSlice'
|
|
||||||
import { getPreviousTab } from '@utils/slices/contextsSlice'
|
import { getPreviousTab } from '@utils/slices/contextsSlice'
|
||||||
import { getInstanceAccount, getInstanceActive } from '@utils/slices/instancesSlice'
|
import { getInstanceAccount, getInstanceActive } from '@utils/slices/instancesSlice'
|
||||||
import { useTheme } from '@utils/styles/ThemeManager'
|
import { useTheme } from '@utils/styles/ThemeManager'
|
||||||
import React, { useCallback, useEffect, useMemo } from 'react'
|
import React, { useCallback, useMemo } from 'react'
|
||||||
import { Platform } from 'react-native'
|
import { Platform } from 'react-native'
|
||||||
import { useSelector } from 'react-redux'
|
import { useSelector } from 'react-redux'
|
||||||
import TabLocal from './Tabs/Local'
|
import TabLocal from './Tabs/Local'
|
||||||
@ -55,17 +53,6 @@ const ScreenTabs = React.memo(
|
|||||||
|
|
||||||
const previousTab = useSelector(getPreviousTab, () => true)
|
const previousTab = useSelector(getPreviousTab, () => true)
|
||||||
|
|
||||||
const versionUpdate = useSelector(getVersionUpdate)
|
|
||||||
const dispatch = useAppDispatch()
|
|
||||||
useEffect(() => {
|
|
||||||
dispatch(retrieveVersionLatest())
|
|
||||||
}, [])
|
|
||||||
const tabMeOptions = useMemo(() => {
|
|
||||||
if (versionUpdate) {
|
|
||||||
return { tabBarBadge: 1 }
|
|
||||||
}
|
|
||||||
}, [versionUpdate])
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tab.Navigator
|
<Tab.Navigator
|
||||||
initialRouteName={instanceActive !== -1 ? previousTab : 'Tab-Me'}
|
initialRouteName={instanceActive !== -1 ? previousTab : 'Tab-Me'}
|
||||||
@ -121,12 +108,7 @@ const ScreenTabs = React.memo(
|
|||||||
<Tab.Screen name='Tab-Public' component={TabPublic} />
|
<Tab.Screen name='Tab-Public' component={TabPublic} />
|
||||||
<Tab.Screen name='Tab-Compose' component={composeComponent} listeners={composeListeners} />
|
<Tab.Screen name='Tab-Compose' component={composeComponent} listeners={composeListeners} />
|
||||||
<Tab.Screen name='Tab-Notifications' component={TabNotifications} />
|
<Tab.Screen name='Tab-Notifications' component={TabNotifications} />
|
||||||
<Tab.Screen
|
<Tab.Screen name='Tab-Me' component={TabMe} listeners={meListeners} />
|
||||||
name='Tab-Me'
|
|
||||||
component={TabMe}
|
|
||||||
options={tabMeOptions}
|
|
||||||
listeners={meListeners}
|
|
||||||
/>
|
|
||||||
</Tab.Navigator>
|
</Tab.Navigator>
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
@ -12,12 +12,8 @@ import accountReducer from '@screens/Tabs/Shared/Account/utils/reducer'
|
|||||||
import { useProfileQuery } from '@utils/queryHooks/profile'
|
import { useProfileQuery } from '@utils/queryHooks/profile'
|
||||||
import { getInstanceActive } from '@utils/slices/instancesSlice'
|
import { getInstanceActive } from '@utils/slices/instancesSlice'
|
||||||
import React, { useReducer, useRef } from 'react'
|
import React, { useReducer, useRef } from 'react'
|
||||||
import Animated, {
|
import Animated, { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated'
|
||||||
useAnimatedScrollHandler,
|
|
||||||
useSharedValue
|
|
||||||
} from 'react-native-reanimated'
|
|
||||||
import { useSelector } from 'react-redux'
|
import { useSelector } from 'react-redux'
|
||||||
import Update from './Root/Update'
|
|
||||||
|
|
||||||
const TabMeRoot: React.FC = () => {
|
const TabMeRoot: React.FC = () => {
|
||||||
const instanceActive = useSelector(getInstanceActive)
|
const instanceActive = useSelector(getInstanceActive)
|
||||||
@ -29,10 +25,7 @@ const TabMeRoot: React.FC = () => {
|
|||||||
const scrollRef = useRef<Animated.ScrollView>(null)
|
const scrollRef = useRef<Animated.ScrollView>(null)
|
||||||
useScrollToTop(scrollRef)
|
useScrollToTop(scrollRef)
|
||||||
|
|
||||||
const [accountState, accountDispatch] = useReducer(
|
const [accountState, accountDispatch] = useReducer(accountReducer, accountInitialState)
|
||||||
accountReducer,
|
|
||||||
accountInitialState
|
|
||||||
)
|
|
||||||
|
|
||||||
const scrollY = useSharedValue(0)
|
const scrollY = useSharedValue(0)
|
||||||
const onScroll = useAnimatedScrollHandler(event => {
|
const onScroll = useAnimatedScrollHandler(event => {
|
||||||
@ -41,22 +34,15 @@ const TabMeRoot: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<AccountContext.Provider value={{ accountState, accountDispatch }}>
|
<AccountContext.Provider value={{ accountState, accountDispatch }}>
|
||||||
{instanceActive !== -1 && data ? (
|
{instanceActive !== -1 && data ? <AccountNav scrollY={scrollY} account={data} /> : null}
|
||||||
<AccountNav scrollY={scrollY} account={data} />
|
|
||||||
) : null}
|
|
||||||
<Animated.ScrollView
|
<Animated.ScrollView
|
||||||
ref={scrollRef}
|
ref={scrollRef}
|
||||||
keyboardShouldPersistTaps='handled'
|
keyboardShouldPersistTaps='handled'
|
||||||
onScroll={onScroll}
|
onScroll={onScroll}
|
||||||
scrollEventThrottle={16}
|
scrollEventThrottle={16}
|
||||||
>
|
>
|
||||||
{instanceActive !== -1 ? (
|
{instanceActive !== -1 ? <MyInfo account={data} /> : <ComponentInstance />}
|
||||||
<MyInfo account={data} />
|
|
||||||
) : (
|
|
||||||
<ComponentInstance />
|
|
||||||
)}
|
|
||||||
{instanceActive !== -1 ? <Collections /> : null}
|
{instanceActive !== -1 ? <Collections /> : null}
|
||||||
<Update />
|
|
||||||
<Settings />
|
<Settings />
|
||||||
{instanceActive !== -1 ? <AccountInformationSwitch /> : null}
|
{instanceActive !== -1 ? <AccountInformationSwitch /> : null}
|
||||||
{instanceActive !== -1 ? <Logout /> : null}
|
{instanceActive !== -1 ? <Logout /> : null}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
import { MenuContainer, MenuRow } from '@components/Menu'
|
|
||||||
import { getVersionUpdate } from '@utils/slices/appSlice'
|
|
||||||
import React from 'react'
|
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { Linking, Platform } from 'react-native'
|
|
||||||
import { useSelector } from 'react-redux'
|
|
||||||
|
|
||||||
const Update: React.FC = () => {
|
|
||||||
const { t } = useTranslation('screenTabs')
|
|
||||||
|
|
||||||
const versionUpdate = useSelector(getVersionUpdate)
|
|
||||||
|
|
||||||
return versionUpdate ? (
|
|
||||||
<MenuContainer>
|
|
||||||
<MenuRow
|
|
||||||
iconFront='ChevronsUp'
|
|
||||||
iconBack='ExternalLink'
|
|
||||||
title={t('me.root.update.title')}
|
|
||||||
badge
|
|
||||||
onPress={() => {
|
|
||||||
if (Platform.OS === 'ios') {
|
|
||||||
Linking.openURL('itms-appss://itunes.apple.com/app/id1549772269')
|
|
||||||
} else {
|
|
||||||
Linking.openURL('https://tooot.app')
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
</MenuContainer>
|
|
||||||
) : null
|
|
||||||
}
|
|
||||||
|
|
||||||
export default Update
|
|
@ -1,8 +1,6 @@
|
|||||||
import apiTooot from '@api/tooot'
|
|
||||||
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
|
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
|
||||||
import { RootState } from '@root/store'
|
import { RootState } from '@root/store'
|
||||||
import { isDevelopment } from '@utils/checkEnvironment'
|
import { isDevelopment } from '@utils/checkEnvironment'
|
||||||
import Constants from 'expo-constants'
|
|
||||||
import * as Notifications from 'expo-notifications'
|
import * as Notifications from 'expo-notifications'
|
||||||
|
|
||||||
export const retrieveExpoToken = createAsyncThunk('app/expoToken', async (): Promise<string> => {
|
export const retrieveExpoToken = createAsyncThunk('app/expoToken', async (): Promise<string> => {
|
||||||
@ -17,22 +15,12 @@ export const retrieveExpoToken = createAsyncThunk('app/expoToken', async (): Pro
|
|||||||
return res.data
|
return res.data
|
||||||
})
|
})
|
||||||
|
|
||||||
export const retrieveVersionLatest = createAsyncThunk(
|
|
||||||
'app/versionUpdate',
|
|
||||||
async (): Promise<string> => {
|
|
||||||
const res = await apiTooot<{ latest: string }>({ method: 'get', url: 'version.json' })
|
|
||||||
return res.body.latest
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
export type AppState = {
|
export type AppState = {
|
||||||
expoToken?: string
|
expoToken?: string
|
||||||
versionUpdate: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const appInitialState: AppState = {
|
export const appInitialState: AppState = {
|
||||||
expoToken: undefined,
|
expoToken: undefined
|
||||||
versionUpdate: false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const appSlice = createSlice({
|
const appSlice = createSlice({
|
||||||
@ -40,22 +28,14 @@ const appSlice = createSlice({
|
|||||||
initialState: appInitialState,
|
initialState: appInitialState,
|
||||||
reducers: {},
|
reducers: {},
|
||||||
extraReducers: builder => {
|
extraReducers: builder => {
|
||||||
builder
|
builder.addCase(retrieveExpoToken.fulfilled, (state, action) => {
|
||||||
.addCase(retrieveExpoToken.fulfilled, (state, action) => {
|
if (action.payload) {
|
||||||
if (action.payload) {
|
state.expoToken = action.payload
|
||||||
state.expoToken = action.payload
|
}
|
||||||
}
|
})
|
||||||
})
|
|
||||||
.addCase(retrieveVersionLatest.fulfilled, (state, action) => {
|
|
||||||
if (action.payload && Constants.expoConfig?.version) {
|
|
||||||
state.versionUpdate =
|
|
||||||
parseFloat(action.payload) > parseFloat(Constants.expoConfig.version)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
export const getExpoToken = (state: RootState) => state.app.expoToken
|
export const getExpoToken = (state: RootState) => state.app.expoToken
|
||||||
export const getVersionUpdate = (state: RootState) => state.app.versionUpdate
|
|
||||||
|
|
||||||
export default appSlice.reducer
|
export default appSlice.reducer
|
||||||
|
Reference in New Issue
Block a user