Skip to content

Commit

Permalink
v2.14.0
Browse files Browse the repository at this point in the history
  • Loading branch information
putuadityabayu committed Oct 24, 2021
1 parent 9fcf922 commit 1f72006
Show file tree
Hide file tree
Showing 28 changed files with 505 additions and 536 deletions.
10 changes: 8 additions & 2 deletions activity/auth/AppNavigator.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useContext } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator,TransitionPresets } from '@react-navigation/stack';
import { createStackNavigator,TransitionPresets,HeaderStyleInterpolators,TransitionSpecs,CardStyleInterpolators } from '@react-navigation/stack';
import {useTheme} from '@ui-kitten/components'
import {setStatusBarBackgroundColor,setStatusBarStyle} from 'expo-status-bar'
import analytics from '@react-native-firebase/analytics'
Expand Down Expand Up @@ -49,7 +49,13 @@ export default function(){
<MainStack.Navigator initialRouteName="Login" screenOptions={{
headerShown:false,
gestureEnabled:true,
...TransitionPresets.SlideFromRightIOS
...TransitionPresets.SlideFromRightIOS,
cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS,
transitionSpec:{
open: TransitionSpecs.TransitionIOSSpec,
close: TransitionSpecs.TransitionIOSSpec
},
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit
}}>
<MainStack.Screen name="Login" component={Login} />
<MainStack.Screen name="Register" component={Register} />
Expand Down
157 changes: 15 additions & 142 deletions activity/auth/AuthProvider.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useRef, useEffect, useReducer } from 'react';
import React, { useRef, useEffect } from 'react';
import * as eva from '@eva-design/eva'
import {ApplicationProvider, IconRegistry} from '@ui-kitten/components'
import {EvaIconsPack} from '@ui-kitten/eva-icons'
Expand All @@ -7,15 +7,12 @@ import { default as theme } from '../../theme.json';
import {default as mapping} from '../../mapping.json'
import * as Applications from 'expo-application'
import NetInfo from '@react-native-community/netinfo'
import useRootNavigation,{handleLinking,getPath} from './useRootNavigation'
import useRootNavigation from './useRootNavigation'
//import {useColorScheme} from 'react-native-appearance'
import {useColorScheme,PermissionsAndroid,LogBox} from 'react-native'
import {useColorScheme,LogBox} from 'react-native'
import AsyncStorage from '@react-native-async-storage/async-storage'
import {PortalProvider} from'@gorhom/portal'
import RNFS from 'react-native-fs'
import {addEventListener as ExpoAddListener,removeEventListener as ExpoRemoveListener,getInitialURL} from 'expo-linking'
import {requestPermissionsAsync as AdsRequest} from 'expo-ads-admob'
import verifyApps from '@pn/utils/VerifyApps'
import * as Notifications from 'expo-notifications'
import {FontAwesomeIconsPack} from '../../components/utils/FontAwesomeIconsPack'
import {IoniconsPack} from '../../components/utils/IoniconsPack'
Expand All @@ -28,11 +25,10 @@ import useForceUpdate from '@pn/utils/useFoceUpdate'
import {default as en_locale} from '@pn/locale/en.json'
import {default as id_locale} from '@pn/locale/id.json'
import {useSelector,changeLang,changeTheme,useDispatch} from '@pn/provider/actions'
import verifyApps from '@pn/utils/VerifyApps'

LogBox.ignoreLogs(['Setting a timer for a long period of time']);

const urlParse = require('url-parse')

Notifications.setNotificationHandler({
handleNotification: async()=>({
shouldShowAlert:true,
Expand All @@ -41,48 +37,15 @@ Notifications.setNotificationHandler({
})
})

const getNotifOption=(id)=>({
name:id,
importance:Notifications.AndroidImportance.HIGH,
lockscreenVisibility:Notifications.AndroidNotificationVisibility.PUBLIC,
sound:'default',
vibrationPattern:[250],
enableVibrate:true
})

const AuthProviderFunc = (props) => {
const dropdownRef=useRef(null)
const currentInternet=useRef(true);
const colorScheme = useColorScheme()
const forceUpdate = useForceUpdate();
const {navigationRef} = useRootNavigation()
const lastNotif = Notifications.useLastNotificationResponse();
const dispatch = useDispatch();
const context = useSelector(type=>({theme:type.theme,userTheme:type.userTheme,lang:type.lang,user:type.user}));

const setTheme=React.useCallback(async(val)=>{
if(['light','auto','dark'].indexOf(val) !== -1) {
try {
await AsyncStorage.setItem("theme",val)
const theme=(colorScheme==='dark' && val === 'auto' || val === 'dark') ? "dark" : "light";
dispatch(changeTheme(theme,val));
} catch(e) {
setNotif(true,"Error",i18n.t('errors.general'))
}
}
},[])

const setLang=React.useCallback(async(val)=>{
if(['id','auto','en'].indexOf(val) !== -1) {
try {
await AsyncStorage.setItem("lang",val)
dispatch(changeLang(val));
} catch(e) {
setNotif(true,"Error",i18n.t('errors.general'))
}
}
},[])

const setNotif=React.useCallback((type,title,msg,data={})=>{
let tipe=type;
if(typeof type === 'boolean') {
Expand All @@ -93,7 +56,6 @@ const AuthProviderFunc = (props) => {

const sendReport=React.useCallback((type,params={})=>{
return;

},[navigationRef])

const {refreshToken} = useLogin({setNotif})
Expand All @@ -105,10 +67,17 @@ const AuthProviderFunc = (props) => {
let [res,lang,ads] = await Promise.all([AsyncStorage.getItem("theme"),AsyncStorage.getItem("lang"),AsyncStorage.getItem("ads")])

if(res !== null) {
const theme=(colorScheme==='dark' && context.userTheme === 'auto' || context.userTheme === 'dark') ? "dark" : "light";
dispatch(changeTheme(theme,res));
const theme=(colorScheme==='dark' && res === 'auto' || res === 'dark') ? "dark" : "light";
dispatch(changeTheme(theme,(res)));
} else {
const theme=(colorScheme==='dark') ? "dark" : "light";
dispatch(changeTheme(theme,'auto'));
}
if(lang !== null) {
dispatch(changeLang((lang)));
} else {
dispatch(changeLang('auto'));
}
if(lang !== null) dispatch(changeLang(lang));

try {
if(ads==null) {
Expand All @@ -127,29 +96,6 @@ const AuthProviderFunc = (props) => {
}
};

async function setNotificationChannel(){
try {
await Promise.all([
Notifications.setNotificationChannelAsync("Download", getNotifOption("Download")),
Notifications.setNotificationChannelAsync("General", getNotifOption("General")),
Notifications.setNotificationChannelAsync("News", getNotifOption("News")),
])
} catch(e){
console.log("Notification channel error",e);
}

}

async function createFolder() {
const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE)
if(granted === PermissionsAndroid.RESULTS.GRANTED) {
const ada = await RNFS.exists(`${RNFS.ExternalStorageDirectoryPath}/Portalnesia`);
if(!ada) {
await RNFS.mkdir(`${RNFS.ExternalStorageDirectoryPath}/Portalnesia`)
}
}
}

const netInfoListener = NetInfo.addEventListener(state=>{
if(state.isInternetReachable && !currentInternet.current) {
setNotif(false,i18n.t('net_online'));
Expand All @@ -160,14 +106,7 @@ const AuthProviderFunc = (props) => {
}
})

asyncTask().then(()=>{
if(props?.main) checkAndUpdateOTA()
})

if(props?.main) {
setNotificationChannel();
createFolder();
}
asyncTask();

return ()=>{
netInfoListener();
Expand Down Expand Up @@ -199,75 +138,10 @@ const AuthProviderFunc = (props) => {
}
},[context.lang])

/* NOTIFICATION & DEEP LINK */
useEffect(()=>{
/* HANDLE DEEP LINK */
async function getInitialLink() {
const url = await getInitialURL();
if(typeof url === 'string') {
const parsed = urlParse(url,true);
if(parsed?.query?.msg) {
setTimeout(()=>setNotif(parsed?.query?.msg_type==='danger' || false,"Notification",parsed?.query?.msg),1000)
}
handleLinking(url);
}
}
function handleURL({url}){
console.log("URL",url);
if(url !== null) {
const parsed = urlParse(url,true);
if(parsed?.query?.msg) {
setNotif(parsed?.query?.msg_type==='danger' || false,"Notification",parsed?.query?.msg)
}
handleLinking(url)
}
}
/* HANDLE DEEP LINK */

if(context.user !== null && props?.main) {
ExpoAddListener('url',handleURL)
setTimeout(()=>{
getInitialLink();
},200)
}
return ()=>{
ExpoRemoveListener('url',handleURL);
}
},[context.user])

/* Local Notification */
React.useEffect(()=>{
async function checkNotification(){
if(lastNotif && lastNotif?.notification?.request?.content?.data?.url) {
const id = lastNotif?.notification?.request?.identifier;
const res = await AsyncStorage.getItem("last_notification");
if(res!==id){
const urls = lastNotif?.notification?.request?.content?.data?.url;
if(typeof urls === 'string'){
handleLinking(urls);
}
await AsyncStorage.setItem("last_notification",id);
}
}
}
if(context.user !== null && props?.main) {
setTimeout(checkNotification,200);
}
},[lastNotif,context.user])

const onTap=React.useCallback((dt)=>{
const urls = dt?.payload?.link
if(urls) {
handleLinking(urls);
}
},[])

return (
<AuthContext.Provider
value={{
setNotif,
setTheme,
setLang,
sendReport,
}}
>
Expand All @@ -281,7 +155,6 @@ const AuthProviderFunc = (props) => {
activeStatusBarStyle='light-content'
inactiveStatusBarStyle={context.theme==='light' ? "dark-content" : "light-content"}
inactiveStatusBarBackgroundColor={context.theme==='light' ? "#FFFFFF" : "#222B45"}
onTap={onTap}
renderImage={()=>null}
ref={dropdownRef} />
</ApplicationProvider>
Expand Down
78 changes: 50 additions & 28 deletions activity/share/ShareActivity.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import ShareModule from '@pn/module/Share'
import Layout from '@pn/components/global/Layout'
import ListItem from '@pn/components/global/ListItem'
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator,TransitionPresets } from '@react-navigation/stack';
import { createStackNavigator,TransitionPresets,HeaderStyleInterpolators,TransitionSpecs,CardStyleInterpolators } from '@react-navigation/stack';

import TopNavigationAction from '@pn/components/navigation/TopAction'
import TopNav from '@pn/components/navigation/TopNav'
import BaseActivity from '../BaseActivity'
import Backdrop from '@pn/components/global/Backdrop';
Expand Down Expand Up @@ -207,7 +206,7 @@ const ShareImage=React.memo(({data,user,token,menu,onCloseMenu})=>{
)
})

function Share(){
function Share({navigation}){
const [data,setData]=React.useState(null);
const [user,setUser]=React.useState(null);
const [token,setToken] = React.useState(null);
Expand Down Expand Up @@ -247,48 +246,71 @@ function Share(){
},[])

const accessoryLeft=React.useCallback(()=>{
return <TopNavigationAction tooltip={i18n.t('close')} icon={CloseIcon} onPress={handleBack} />
return <TopAction tooltip={i18n.t('close')} icon={CloseIcon} onPress={handleBack} />
},[])

const Header=React.useMemo(()=>(
<TopNav title="Portalnesia Share" accessoryLeft={accessoryLeft} align="center" menu={()=><TopAction icon={SendIcon} tooltip={i18n.t('send')} onPress={()=>setMenu(true)} />} />
const accessoryRight=React.useCallback(()=>(
<TopAction icon={SendIcon} tooltip={i18n.t('send')} onPress={()=>setMenu(true)} />
),[])

return (
<BaseActivity>
<Layout custom={Header} whiteBg>
{(data===null || user===null) ? (
<Lay style={{flex:1,justifyContent:'center',alignItems:'center'}}>
<Spinner size="large" />
</Lay>
) : (
<ScrollView
contentContainerStyle={{flexGrow:1,backgroundColor:theme['background-basic-color-1']}}
>
{data?.mimeType==='text/plain' ? (
<ShareText data={data} user={user} token={token} menu={menu} onCloseMenu={onCloseMenu} />
) : data?.mimeType?.match(/^image\/+/) ? (
<ShareImage data={data} user={user} token={token} menu={menu} onCloseMenu={onCloseMenu} />
) : null }
</ScrollView>
)}
</Layout>
</BaseActivity>
<Layout navigation={navigation} title="Portalnesia Share" left={accessoryLeft} menu={accessoryRight} whiteBg notAskExit>
{(data===null || user===null) ? (
<Lay style={{flex:1,justifyContent:'center',alignItems:'center'}}>
<Spinner size="large" />
</Lay>
) : (
<ScrollView
contentContainerStyle={{flexGrow:1,backgroundColor:theme['background-basic-color-1']}}
>
{data?.mimeType==='text/plain' ? (
<ShareText data={data} user={user} token={token} menu={menu} onCloseMenu={onCloseMenu} />
) : data?.mimeType?.match(/^image\/+/) ? (
<ShareImage data={data} user={user} token={token} menu={menu} onCloseMenu={onCloseMenu} />
) : null }
</ScrollView>
)}
</Layout>
)
}

const MainStack = createStackNavigator();

export default function(){
const Navigator=React.memo(()=>{
const theme=useTheme();
return (
<NavigationContainer>
<MainStack.Navigator initialRouteName="Share" screenOptions={{
headerShown:false,
headerShown:true,
gestureEnabled:true,
...TransitionPresets.SlideFromRightIOS
headerStyle:{
backgroundColor:theme['background-basic-color-1'],
elevation:5
},
headerLeftContainerStyle:{
paddingLeft:10
},
headerRightContainerStyle:{
paddingRight:10
},
...TransitionPresets.SlideFromRightIOS,
cardStyleInterpolator: CardStyleInterpolators.forHorizontalIOS,
transitionSpec:{
open: TransitionSpecs.TransitionIOSSpec,
close: TransitionSpecs.TransitionIOSSpec
},
headerStyleInterpolator: HeaderStyleInterpolators.forUIKit
}}>
<MainStack.Screen name="Share" component={Share} />
</MainStack.Navigator>
</NavigationContainer>
)
})

export default function(){
return (
<BaseActivity>
<Navigator />
</BaseActivity>
)
}
Loading

0 comments on commit 1f72006

Please sign in to comment.