Commit 504590b8 authored by Thor-Herman's avatar Thor-Herman
Browse files

Merge branch 'moviepage' into 'master'

Squashed commit of the following:

commit a5806510
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:43:27 2020 +0100

    Re-add SearchBar

commit 29c9e1fa
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:42:59 2020 +0100

    Style MoviePage #11 #5

commit 60e39e09
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:15:53 2020 +0100

    Add navigation to MoviePage on press #12 #11

commit d025594e
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:15:40 2020 +0100

    Refactor MoviePage for react-navigation #12 #11

commit 2bbaea73
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:15:17 2020 +0100

    Remove Link from Header #12

commit 203b5895
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:14:53 2020 +0100

    Setup Routing in App #12

commit bb1dd536
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 22:14:37 2020 +0100

    Add stack navigation #12

commit ea6f1d3e
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 21:30:19 2020 +0100

    Replace router with Navigation #12

commit 28b902e0
Author: Thor-Herman <44784559+Thor-Herman@users.noreply.github.com>
Date:   Thu Nov 12 11:23:06 2020 +0100

    Downgrade router version

    Caused a whole lot of bugs
parent da7491d9
import { Route, Switch } from 'react-router-native';
import BrowsePage from '../pages/BrowsePage';
import LandingPage from '../pages/LandingPage';
import MoviePage from '../pages/MoviePage';
......@@ -9,6 +8,15 @@ import { Ionicons } from '@expo/vector-icons';
import { Container, Footer, Icon, Input, Item, Left, Text } from 'native-base';
import SearchBar from './SearchBar';
import Header from './Header';
import { createStackNavigator } from '@react-navigation/stack';
import { NavigationContainer } from '@react-navigation/native';
export type StackParamList = {
Browse: undefined;
Movie: { id: number };
};
const Stack = createStackNavigator<StackParamList>();
const App = () => {
let [fontsLoaded] = useFonts({
......@@ -22,14 +30,14 @@ const App = () => {
}
return (
<Container>
<Header />
<Switch>
<Route exact path='/' component={BrowsePage} />
<Route path='/movie/:movieId' component={MoviePage} />
</Switch>
<Footer />
</Container>
<NavigationContainer>
<Container>
<Stack.Navigator initialRouteName='Browse'>
<Stack.Screen name='Browse' component={BrowsePage} />
<Stack.Screen name='Movie' component={MoviePage} />
</Stack.Navigator>
</Container>
</NavigationContainer>
);
};
......
......@@ -2,18 +2,11 @@ import { Header as NBHeader } from 'native-base';
import { Text, View } from 'react-native';
import React from 'react';
import SearchBar from './SearchBar';
import { Link } from 'react-router-native';
const Header = () => {
return (
<>
<NBHeader searchBar rounded>
<Link
to={'/'}
style={{ paddingRight: 5, flex: 1, justifyContent: 'center' }}
>
<Text>MovieDB</Text>
</Link>
<SearchBar />
</NBHeader>
</>
......
import { Body, Card, H2, CardItem, View } from 'native-base';
import { Body, Card, H2, CardItem, View, Text } from 'native-base';
import { Image, StyleSheet } from 'react-native';
import React from 'react';
import { Link } from 'react-router-native';
import { TouchableNativeFeedback } from 'react-native-gesture-handler';
type Props = {
id: number;
title: string;
image: string;
onPress: () => void;
};
// Small display for showing the movies on the browsepage
const MovieCard = (props: Props) => {
return (
<Link to={`/movie/${props.id}`}>
<TouchableNativeFeedback
onPress={props.onPress}
>
<CardItem bordered style={styles.cardItem}>
<View style={styles.imageView}>
<Image source={{ uri: props.image }} style={styles.image} />
......@@ -20,7 +25,7 @@ const MovieCard = (props: Props) => {
<H2>{props.title}</H2>
</Body>
</CardItem>
</Link>
</TouchableNativeFeedback>
);
};
......
......@@ -2,10 +2,7 @@ import { Container, Icon, Input, Item, View } from 'native-base';
import React, { Props, useEffect } from 'react';
import { NativeSyntheticEvent, TextInputChangeEventData, TextInputSubmitEditingEventData } from 'react-native';
import { useDispatch, useSelector } from 'react-redux';
import { Link } from 'react-router-native';
import { searchMovieTitles, searchMovies } from '../actions';
import { RootState } from '../reducers';
import history from '../history';
const SearchBar = () => {
......@@ -20,7 +17,6 @@ const SearchBar = () => {
const onSubmit = (e: NativeSyntheticEvent<TextInputSubmitEditingEventData>) => {
e.preventDefault();
dispatch(searchMovies(true)); // Perform search with current searchTerm
history.push('/');
}
return (
......
......@@ -3,17 +3,13 @@ import createStore from './store';
import App from './components/App';
import React from 'react';
import { Provider } from 'react-redux';
import history from './history';
import {Router} from 'react-router';
const store = createStore();
const ReduxApp = () => {
return (
<Provider store={store}>
<Router history={history}>
<App />
</Router>
</Provider>
);
};
......
......@@ -8,11 +8,13 @@
"test": "jest"
},
"dependencies": {
"@react-native-community/masked-view": "0.1.10",
"@react-navigation/native": "^5.8.9",
"@react-navigation/stack": "^5.12.6",
"@types/axios": "^0.14.0",
"@types/history": "^4.7.8",
"@types/react-redux": "^7.1.11",
"@types/react-router": "^5.1.8",
"@types/react-router-native": "^5.1.0",
"axios": "^0.21.0",
"expo": "~39.0.2",
"expo-font": "~8.3.0",
......@@ -27,12 +29,12 @@
"react-native": "^0.63.3",
"react-native-gesture-handler": "~1.7.0",
"react-native-reanimated": "~1.13.0",
"react-native-safe-area-context": "3.1.4",
"react-native-screens": "~2.10.1",
"react-native-unimodules": "~0.11.0",
"react-native-web": "~0.13.12",
"react-redux": "^7.2.2",
"react-router": "^5.2.0",
"react-router-native": "^5.2.0",
"redux": "^4.0.5",
"redux-devtools-extension": "^2.13.8",
"redux-thunk": "^2.3.0",
......
import { StackNavigationProp } from '@react-navigation/stack';
import { Button, Card, Content } from 'native-base';
import React, { useEffect, useState } from 'react';
import { View, Text } from 'react-native';
import { TouchableNativeFeedback } from 'react-native-gesture-handler';
import { useDispatch, useSelector } from 'react-redux';
import { searchMovies } from '../actions';
import { StackParamList } from '../components/App';
import MovieCard from '../components/MovieCard';
import PaginationButton from '../components/PaginationButton';
import SearchBar from '../components/SearchBar';
import { selectMoviesByAllIdsOrdering } from '../selectors/movieSelector';
const BrowsePage = () => {
type BrowseScreenNavigationProp = StackNavigationProp<StackParamList, 'Movie'>;
type Props = {
navigation: BrowseScreenNavigationProp;
};
const BrowsePage = ({navigation}: Props) => {
const dispatch = useDispatch();
const movies = useSelector(selectMoviesByAllIdsOrdering);
const movieElements = Object.values(movies).map((movie) => ( // List of all the movies that returned from the search
......@@ -16,6 +25,7 @@ const BrowsePage = () => {
image={movie.image}
title={movie.title}
key={movie.id}
onPress={() => navigation.navigate('Movie', {id: movie.id})}
/>
));
const determineRender = () => {
......@@ -34,6 +44,7 @@ const BrowsePage = () => {
return (
<Content>
<SearchBar />
{determineRender()}
<PaginationButton />
</Content>
......
import { RouteProp } from '@react-navigation/native';
import { StackNavigationProp } from '@react-navigation/stack';
import React from 'react';
import { View, Text } from 'react-native';
import { Image, View, Text, StyleSheet } from 'react-native';
import { useSelector } from 'react-redux';
import { StackParamList } from '../components/App';
import { RootState } from '../reducers';
import { Movie } from '../types/movies';
const MoviePage = () => {
type MovieScreenRouteProp = RouteProp<StackParamList, 'Movie'>;
type MovieScreenNavigationProp = StackNavigationProp<StackParamList, 'Movie'>;
type Props = {
navigation: MovieScreenNavigationProp;
route: MovieScreenRouteProp;
};
// Detailed page about a movie
const MoviePage = ({ route }: Props) => {
const movie: Movie = useSelector(
(state: RootState) => state.movies.byId[route.params.id] // Retrieves the current movie based on the navigation id
);
return (
<View>
<Text>MoviePage</Text>
<View style={styles.imageView}>
<Image source={{ uri: movie.image }} style={styles.image} />
</View>
<Text style={styles.title}>
{movie.title} ({movie.year})
</Text>
<Text>{movie.description}</Text>
<Text>Genres: {movie.genre}</Text>
</View>
);
};
const styles = StyleSheet.create({
title: {
fontSize: 20,
paddingTop: 5,
paddingBottom: 5,
},
imageView: {
paddingLeft: 0,
paddingRight: 10,
paddingTop: 10,
margin: 0,
},
image: {
height: 300,
resizeMode: 'contain',
padding: 0,
margin: 0,
},
});
export default MoviePage;
......@@ -1913,6 +1913,46 @@
sudo-prompt "^9.0.0"
wcwidth "^1.0.1"
"@react-native-community/masked-view@0.1.10":
version "0.1.10"
resolved "https://registry.yarnpkg.com/@react-native-community/masked-view/-/masked-view-0.1.10.tgz#5dda643e19e587793bc2034dd9bf7398ad43d401"
integrity sha512-rk4sWFsmtOw8oyx8SD3KSvawwaK7gRBSEIy2TAwURyGt+3TizssXP1r8nx3zY+R7v2vYYHXZ+k2/GULAT/bcaQ==
"@react-navigation/core@^5.14.3":
version "5.14.3"
resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.14.3.tgz#6bbbfe1fb90aa64068fdb69bbb6c55120b7b24f1"
integrity sha512-l4zCfIfPC4DYuDcluiisaWKg7GO5yAjBrIL0pzEw8bIBj+R6vnZnyG9AWgnwo5fl241DX+1sfgzGEUQgpIJNew==
dependencies:
"@react-navigation/routers" "^5.6.2"
escape-string-regexp "^4.0.0"
nanoid "^3.1.15"
query-string "^6.13.6"
react-is "^16.13.0"
"@react-navigation/native@^5.8.9":
version "5.8.9"
resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.8.9.tgz#67ee2afef6af6ef40c425e02264bd25d1530b361"
integrity sha512-d1oihLxp9UDVsZyvHNcwJfj+LKsEo0m8vEBBV6jhLJAXs1d2DEBzBXGeP907uG+877TK7luh2h79Or4w7/+p+g==
dependencies:
"@react-navigation/core" "^5.14.3"
escape-string-regexp "^4.0.0"
nanoid "^3.1.15"
"@react-navigation/routers@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.6.2.tgz#accc008c3b777f74d998e16cb2ea8e4c1fe8d9aa"
integrity sha512-XBcDKXS5s4MaHFufN44LtbXqFDH/nUHfHjbwG85fP3k772oRyPRgbnUb2mbw5MFGqORla9T7uymR6Gh6uwIwVw==
dependencies:
nanoid "^3.1.15"
"@react-navigation/stack@^5.12.6":
version "5.12.6"
resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.12.6.tgz#a6f2caf66da78ad2afa80f7a960c36db6b83bcff"
integrity sha512-pf9AigAIVtCQuCpZAZqBux4kNqQwj98ngvd6JEryFrqTQ1CYsUH6jfpQE7SKyHggVRFSQVMf24aCgwtRixBvjw==
dependencies:
color "^3.1.3"
react-native-iphone-x-helper "^1.3.0"
"@sinonjs/commons@^1.7.0":
version "1.8.1"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.1.tgz#e7df00f98a203324f6dc7cc606cad9d4a8ab2217"
......@@ -2054,16 +2094,7 @@
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-router-native@^5.1.0":
version "5.1.0"
resolved "https://registry.yarnpkg.com/@types/react-router-native/-/react-router-native-5.1.0.tgz#72eef279eb6fae34cded6fa1cc48a0b19e3e0fe0"
integrity sha512-Lk+aLihT6M3fPuvCQRv8n4G9ORQHuxEJYZe956p4yGmjX9Z2QEZeOWvsNcabljL42v4yOHCadWGZ05UFEodtMg==
dependencies:
"@types/history" "*"
"@types/react" "*"
"@types/react-router" "*"
"@types/react-router@*", "@types/react-router@^5.1.8":
"@types/react-router@^5.1.8":
version "5.1.8"
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa"
integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==
......@@ -2982,7 +3013,7 @@ color-support@^1.1.3:
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
color@~3.1.2:
color@^3.1.3, color@~3.1.2:
version "3.1.3"
resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
......@@ -3509,6 +3540,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
escodegen@^1.11.1:
version "1.14.3"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
......@@ -6213,6 +6249,11 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
nanoid@^3.1.15:
version "3.1.16"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64"
integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
......@@ -6880,7 +6921,7 @@ prompts@^2.0.1, prompts@^2.2.1:
kleur "^3.0.3"
sisteransi "^1.0.5"
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
......@@ -6922,6 +6963,15 @@ qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
query-string@^6.13.6:
version "6.13.7"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee"
integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
strict-uri-encode "^2.0.0"
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
......@@ -6962,7 +7012,7 @@ react-hook-form@^6.11.0:
resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-6.11.0.tgz#db041861414799e002ea482e54da6f9bc452f1b0"
integrity sha512-YoiNCKSfrLv0CCK9fiVorNt1YM5xOV4Fo+O3e3CphS6N4xrXah3rJo1YIA34qSbIJwXgcsS2WOIb2K/Wb6e56A==
react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
react-is@^16.12.0, react-is@^16.13.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
......@@ -6992,7 +7042,7 @@ react-native-gesture-handler@~1.7.0:
invariant "^2.2.4"
prop-types "^15.7.2"
react-native-iphone-x-helper@^1.0.3:
react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz#20c603e9a0e765fd6f97396638bdeb0e5a60b010"
integrity sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==
......@@ -7117,15 +7167,7 @@ react-refresh@^0.4.0:
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53"
integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==
react-router-native@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/react-router-native/-/react-router-native-5.2.0.tgz#40c40856a8d1e3b189c7ad5c1be9b1ead4dbacfd"
integrity sha512-4J9htwyEDpE8mmuZ3vlgsxUd79BU/R64PqMQoXbZU/QM7gaB1O3EEY9MRryidxDmSy+rrTvVe4PjAzGRV0bFFg==
dependencies:
prop-types "^15.6.1"
react-router "5.2.0"
react-router@5.2.0, react-router@^5.2.0:
react-router@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293"
integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==
......@@ -7830,6 +7872,11 @@ spdx-license-ids@^3.0.0:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz#c80757383c28abf7296744998cbc106ae8b854ce"
integrity sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==
split-on-first@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
......@@ -7892,6 +7939,11 @@ stream-buffers@~2.2.0:
resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4"
integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=
strict-uri-encode@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY=
string-length@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837"
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment