diff --git a/src/components/pages/discover.js b/src/components/pages/discover.js index 1f3db1f..2e0ce38 100644 --- a/src/components/pages/discover.js +++ b/src/components/pages/discover.js @@ -1,5 +1,12 @@ import React, { useEffect, useState } from "react"; -import { View, TextInput, Text, Dimensions } from "react-native"; +import { + ScrollView, + TouchableOpacity, + View, + TextInput, + Text, + Dimensions +} from "react-native"; import { TabView, TabBar, SceneMap } from "react-native-tab-view"; @@ -142,24 +149,26 @@ const Discover = (props) => { return ( <> { state.loaded - ? <> - props.navigation.navigate("Search") }> - - - - Search... - - - - + ? + + props.navigation.navigate("Search") + }/> + + + + - + : <> } @@ -169,10 +178,25 @@ const Discover = (props) => { const SCREEN_WIDTH = Dimensions.get("window").width; const styles = { form: { - justifyContent: "center", - backgroundColor: "white", - padding: 20 + container: { + flexDirection: "row", + justifyContent: "center", + backgroundColor: "white", + padding: 20, + }, + + input: { + flexGrow: 1, + padding: 10, + fontSize: 17, + color: "#888" + }, + + submit: { + padding: 20, + } }, + searchBar: { padding: 10, fontSize: 17, diff --git a/src/components/pages/discover/search.js b/src/components/pages/discover/search.js index 279b6ac..4e75504 100644 --- a/src/components/pages/discover/search.js +++ b/src/components/pages/discover/search.js @@ -1,5 +1,6 @@ import React, { useState, useEffect } from "react"; import { + ScrollView, View, TextInput, Text, @@ -7,7 +8,7 @@ import { Image, } from "react-native"; import { TabView, TabBar, SceneMap } from "react-native-tab-view"; -import { FontAwesome } from '@expo/vector-icons'; +import { Ionicons, FontAwesome5 } from '@expo/vector-icons'; import AsyncStorage from "@react-native-async-storage/async-storage"; import * as requests from "src/requests"; @@ -112,7 +113,7 @@ const Search = ({navigation}) => { const [ routes ] = useState([ { key: "accounts", - icon: "user", + icon: "user-alt", }, { key: "hashtags", @@ -152,7 +153,7 @@ const Search = ({navigation}) => { ); const renderIcon = ({ route, color }) => ( - @@ -161,7 +162,7 @@ const Search = ({navigation}) => { return ( <> { state.loaded - ? <> + ? { - + { state.results @@ -194,7 +195,7 @@ const Search = ({navigation}) => { initialLayout = { { width: SCREEN_WIDTH } } /> : <> } - + : <> } diff --git a/src/components/pages/discover/view-hashtag.js b/src/components/pages/discover/view-hashtag.js index d9f422e..c595f9f 100644 --- a/src/components/pages/discover/view-hashtag.js +++ b/src/components/pages/discover/view-hashtag.js @@ -1,14 +1,14 @@ import React, { useState, useEffect } from "react"; -import { View, Image, Dimensions, Text } from "react-native"; +import { ScrollView, View, Image, Dimensions, Text } from "react-native"; import PagedGrid from "src/components/posts/paged-grid"; import * as requests from "src/requests"; import AsyncStorage from "@react-native-async-storage/async-storage"; -const ViewHashtag = ({navigation}) => { +const ViewHashtag = ({ navigation, route }) => { const FETCH_LIMIT = 18; let [state, setState] = useState({ - tag: navigation.getParam("tag", null), + tag: route.params.tag, posts: [], offset: 0, followed: false, @@ -66,10 +66,16 @@ const ViewHashtag = ({navigation}) => { }); }; - const latest = state.tag.history[0]; + // A hashtag's history describes how actively it's being used. There's + // one element in the history array for every set interval of time. + // state.tag.history may be undefined, and its length might be 0. + let latest = null; + if (state.tag.history && state.tag.history.length > 0) { + latest = state.tag.history[0]; + } return ( - <> + @@ -105,17 +111,19 @@ const ViewHashtag = ({navigation}) => { <> { state.loaded && state.posts.length > 0 - ? - : - Nothing to show - + ? state.posts.length > 0 + ? + : + Nothing to show + + : <> } - + ); }; diff --git a/src/components/pages/profile.js b/src/components/pages/profile.js index dc4688a..1090d46 100644 --- a/src/components/pages/profile.js +++ b/src/components/pages/profile.js @@ -6,6 +6,7 @@ import { Text, TouchableOpacity, FlatList, + ScrollView, } from "react-native"; import * as Linking from "expo-linking"; @@ -13,7 +14,12 @@ import AsyncStorage from "@react-native-async-storage/async-storage"; import { activeOrNot } from "src/interface/interactions"; import HTML from "react-native-render-html"; -import { withLeadingAcct, withoutHTML, pluralize } from "src/interface/rendering"; +import { + withLeadingAcct, + withoutHTML, + pluralize, + StatusBarSpace, +} from "src/interface/rendering"; import * as requests from "src/requests"; import GridView from "src/components/posts/grid-view"; @@ -56,11 +62,11 @@ const HTMLLink = ({link}) => { } } -const ViewProfile = ({navigation}) => { +const ViewProfile = ({ navigation, route }) => { // As rendered when opened from somewhere other than the tab bar const [state, setState] = useState({ loaded: false, - profile: navigation.getParam("profile"), + profile: route.params.profile, }); useEffect(() => { @@ -159,9 +165,7 @@ const ViewProfile = ({navigation}) => { return ( <> { state.loaded - ? <> - active = { navigation.getParam("originTab") } - navigation = { navigation }> + ? { listedUsers = { state.listedUsers } followed = { state.followed } posts = { state.posts }/> - + : <> } @@ -184,57 +188,65 @@ const Profile = ({ navigation }) => { loaded: false, }); - useEffect(() => { - let profile; - let notifs; - let domain; - let accessToken; + const init = async () => { + const [ + profilePair, + notifPair, + instancePair, + tokenPair + ] = await AsyncStorage.multiGet([ + "@user_profile", + "@user_notifications", + "@user_instance", + "@user_token", + ]); - AsyncStorage - .multiGet([ + const profile = JSON.parse(profilePair[1]); + const notifs = JSON.parse(notifPair[1]); + const instance = instancePair[1]; + const accessToken = JSON.parse(tokenPair[1]).access_token; + + const latestProfile = + await requests.fetchProfile(instance, profile.id, accessToken); + const posts = + await requests.fetchAccountStatuses(instance, profile.id, accessToken); + const followers = + await requests.fetchFollowers(instance, profile.id, accessToken); + + const latestProfileString = JSON.stringify(latestProfile); + + // Update the profile in AsyncStorage if it's changed + if(latestProfileString != JSON.stringify(profile)) { + await AsyncStorage.setItem( "@user_profile", - "@user_notifications", - "@user_instance", - "@user_token", - ]) - .then(([profilePair, notifPair, domainPair, tokenPair]) => { - profile = JSON.parse(profilePair[1]); - notifs = JSON.parse(notifPair[1]); - domain = domainPair[1]; - accessToken = JSON.parse(tokenPair[1]).access_token; + latestProfileString + ); + } - return Promise.all([ - requests.fetchProfile(domain, profile.id), - requests.fetchAccountStatuses(domain, profile.id, accessToken), - requests.fetchFollowers(domain, profile.id, accessToken), - ]); - }) - .then(([latestProfile, posts, followers]) => { - if(JSON.stringify(latestProfile) != JSON.stringify(profile)) { - profile = latestProfile - } - - setState({...state, - profile: profile, - notifs: notifs, - posts: posts, + setState({...state, + profile: latestProfile, + notifs: notifs, + posts: posts, listedUsers: followers, - loaded: true, - }); - }); - }, []); + loaded: true, + }); + }; + + useEffect(() => { init(); }, []); + return ( <> + { state.loaded - ? <> + ? - + : <> } diff --git a/src/components/pages/profile/settings.js b/src/components/pages/profile/settings.js index 23b2174..667f8a9 100644 --- a/src/components/pages/profile/settings.js +++ b/src/components/pages/profile/settings.js @@ -1,6 +1,7 @@ import React, { useState, useEffect } from "react"; import { + ScrollView, SafeAreaView, View, TextInput, @@ -134,7 +135,7 @@ const Settings = (props) => { return ( <> { state.loaded - ? <> + ? { - + : <> } diff --git a/src/components/posts/grid-view.js b/src/components/posts/grid-view.js index bf3a5a4..6e11229 100644 --- a/src/components/posts/grid-view.js +++ b/src/components/posts/grid-view.js @@ -40,7 +40,7 @@ const GridView = (props) => { && p.media_attachments.length > 0 ); - let rows = partition(props.posts, 3); + let rows = partition(postsWithMedia, 3); return ( { diff --git a/src/components/posts/post.js b/src/components/posts/post.js index b4cb6ac..6b89acd 100644 --- a/src/components/posts/post.js +++ b/src/components/posts/post.js @@ -80,6 +80,12 @@ export const RawPost = (props) => { }); }; + useEffect(() => { + if (props.onRendered != null) { + props.onRendered(); + } + }, []); + return ( @@ -349,6 +355,7 @@ export const PostByData = (props) => {