Code Monkey home page Code Monkey logo

react-native-masonry-list's Introduction

react-native-masonry-list

Pinterest like listview made in React Native. It just behaves like the FlatList so it is easy to use.

Npm Version Downloads CI codecov code style: prettier LICENSE PRs Welcome supports iOS supports Android supports web runs with expo

Notice

If you want react-native-reanimated version, you may checkout reanimated-masonry-list. This repo is created with issue #14.

Installation

yarn add @react-native-seoul/masonry-list
import MasonryList from '@react-native-seoul/masonry-list';

Preview

2-columns 3-columns 4-columns

You can use as many columns as you want. It is flexible!

YouTube

See how to use it

Blog

How it is made

Description

Current MasonryList extends ScrollView and can pass down its props. Indeed, this looks similar to FlatList to provide good developer experience. Look how this is used and compare to the FlatList.

The FlatList won't offer you to draw MansonryList because when you provide numColumns bigger than 1, the native view will switch to FlatList to GridView which will render its children with identical height only.

Our MasonryList view component is able to render all child views with all different sizes.

Props

innerRef?: MutableRefObject<ScrollView | undefined>;
loading?: boolean;
refreshing?: RefreshControlProps['refreshing'];
onRefresh?: RefreshControlProps['onRefresh'];
onEndReached?: () => void;
onEndReachedThreshold?: number;
style?: StyleProp<ScrollViewProps>;
data: T[];
renderItem: ({item: T, i: number}) => ReactElement;
LoadingView?: React.ComponentType<any> | React.ReactElement | null;
ListHeaderComponent?: React.ComponentType<any> | React.ReactElement | null;
ListEmptyComponent?: React.ComponentType<any> | React.ReactElement | null;
ListFooterComponent?: React.ComponentType<any> | React.ReactElement | null;
numColumns?: number;
keyExtractor?: ((item: T | any, index: number) => string) | undefined;

innerRef - Expose ScrollView instance with ref, example usage: ref.current.scrollTo.

loading - Currently in loading status.

refreshing - Currently in refreshing status.

onRefresh - Callback when refresh has been triggered.

onEndReached - Callback when end is reached just like the onEndReached in FlatList

style - Style props for ScrollView which is the container view.

data - The array of the data for the view to render in renderItem

renderItem - Render custom view with the data passed down.

LoadingView - Custom loading view when the view is in loading status.

ListHeaderComponent - Header component

ListFooterComponent - Footer component

ListEmptyComponent - Component to render when the data is empty.

numColumns - Number of columns you want to render. Default to 2.

Usage

<MasonryList
  data={filteredItems}
  keyExtractor={(item): string => item.id}
  numColumns={2}
  showsVerticalScrollIndicator={false}
  renderItem={({item}) => <CardItem />}
  refreshing={isLoadingNext}
  onRefresh={() => refetch({first: ITEM_CNT})}
  onEndReachedThreshold={0.1}
  onEndReached={() => loadNext(ITEM_CNT)}
/>

Run Example

  1. Clone the repository.

    git clone https://github.com/hyochan/react-native-masonry-list.git
    
  2. Navigate to example project

    cd RNMasonryExample
    
  3. Install packages and run it as you do in react-native project.

LICENSE

FOSSA Status

react-native-masonry-list's People

Contributors

ahmethalac avatar conradmaker avatar hanpanpan200 avatar hyochan avatar lucianomlima avatar nathansbird avatar samzmann avatar vadko avatar vin-xi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

react-native-masonry-list's Issues

Add progressViewOffset prop

Is your feature request related to a problem? Please describe.
Hi devs, we use this library in our project and we want to pass the prop progressViewOffset to the mansory list component but you dont declare it in the props and as you know that prop allow us to move the progress indicator from the scrollview.

Describe the solution you'd like
Just add the prop progressViewOffset

I write this like an issue because i tried to fork and add the prop myself but when add the fork to the package.json of my project it throws me an error, so i hope you read this and consider this. Thank you.

RemoveClippedSubviews support

It seems as if RemoveClippedSubviews is not supported as a prop to MasonryList, it seems to be permanently set to True.

This is extremely annoying in certain scenarios, particularly for when a list is rendered off-screen, then moved on-screen, because it will be invisible until the user touches the screen where the invisible list is. This makes it essentially unworkable when doing animations that require things to start off-screen and move on-screen.

Support for this would be greatly appreciated!

[Feature] Option to remove load spinner from momentum scroll

Is your feature request related to a problem? Please describe.

I am using your masonry list for a gif search component (thanks btw, saved me lots of time ๐Ÿ’› ) and when pulling down at the top of the scrollable list, i do not want to refresh the results but i cannot figure out how to stop the built in loading spinner from appearing.

Describe the solution you'd like

A way to remove / customise the default loading spinner.

Describe alternatives you've considered

I tried to pass loading={false} and refreshing={false} and a custom LoadingView component but it made no difference. Is there a way to achieve this that I am missing?

Additional context

I am referring to the black spinner that appears here between the search box and the results when I pull down:

CleanShot.2022-09-28.at.18.36.00.mp4

Remove expo from peer dependencies

Describe the bug
It seems to this library works well with plain react-native project not expo only.

Could we remove expo peer dependency in package.json?

To Reproduce

  1. Use this package in plain react native project.
  2. Install package

Warning

warning " > @react-native-seoul/[email protected]" has unmet peer dependency "expo@*".

Additional Context
It seems to #60 also handle this topic.

how we can handle performance in case of large datasets ?? i mean virtualization

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

MasonryList Component typing improvements.

Hi! ๐Ÿ‘‹

Firstly, thanks for your work on this project! ๐Ÿ™‚

Here is the diff that avoid typing's warnings on props data and renderItem:

diff --git a/node_modules/@react-native-seoul/masonry-list/lib/index.d.ts b/node_modules/@react-native-seoul/masonry-list/lib/index.d.ts
index dc67ceb..980b1c6 100644
--- a/node_modules/@react-native-seoul/masonry-list/lib/index.d.ts
+++ b/node_modules/@react-native-seoul/masonry-list/lib/index.d.ts
@@ -1,5 +1,5 @@
 import type { Omit, RefreshControlProps, ScrollViewProps, StyleProp, ViewStyle } from 'react-native';
-import { ScrollView } from 'react-native';
+import { ListRenderItem, ScrollView } from "react-native";
 import type { MutableRefObject, ReactElement } from 'react';
 import React from 'react';
 interface Props<T> extends Omit<ScrollViewProps, 'refreshControl'> {
@@ -11,11 +11,8 @@ interface Props<T> extends Omit<ScrollViewProps, 'refreshControl'> {
     onEndReached?: () => void;
     onEndReachedThreshold?: number;
     style?: StyleProp<ViewStyle>;
-    data: T[];
-    renderItem: ({ item, i }: {
-        item: T;
-        i: number;
-    }) => ReactElement;
+    data: ReadonlyArray<T>;
+    renderItem: ListRenderItem<ItemT> | null | undefined;
     LoadingView?: React.ComponentType<any> | React.ReactElement | null;
     ListHeaderComponent?: React.ReactNode | null;
     ListEmptyComponent?: React.ComponentType<any> | React.ReactElement | null;

Ability to use onScroll with the List

I need to use onScoll to control my header, it's available to the native FlatList but it's not here. Can you fix this, please? thanks.

ps I get this error:

onScroll: (event: any) => void; }' is not assignable to type 'IntrinsicAttributes & Props<unknown>'.
  Property 'onScroll' does not exist on type 'IntrinsicAttributes & Props<unknown>'.

No output on Expo managed project, yet perfect output on the web.

I am trying to make a very basic masonry list, but unable to generate any output. But when I run the expo project on my laptop browser, I m able to see the output. Please check the screenshots. I guess I am missing some dependency or something.

Code:

import MasonryList from "@react-native-seoul/masonry-list";
...
      <Text>-Start-</Text>
      <MasonryList
        data={["dummy1", "dummy2", "dummy3", "dummy4"]}
        renderItem={() => <Text>hi</Text>}
      />
      <Text>-End-</Text>
...

Screenshots

on Web (laptop, via expo)

Screenshot 2023-06-10 at 3 30 32 AM



on Android ( Expo Go )

Screenshot 2023-06-10 at 3 30 32 AM



  • OS: MacOS
  • Browser: Brave
  • Device: Android
  • Version: 12

version
"@react-native-seoul/masonry-list": "^1.4.2"



ListHeaderComponent doesnt show

Is it only me or the ListHeaderComponent is not supported ? I could post my code but I dont think its necessary, if I replace <MasonryList .../> with <FlatList ... /> the component called in ListHeaderComponent is showing but nothing show with <MasonryList .../> and I dont get any error, its just not here.

Thank you

Typescript Error: Module '"react-native"' has no exported member 'Omit'

After updating to react-native 71.8 i am getting this bug
in @react-native-seoul/masonry-list/lib/index.d.ts
in line ->
import type { Omit, RefreshControlProps, ScrollViewProps, StyleProp, ViewStyle } from 'react-native';

There is no "Omit" in react-native, if i remove the Omit import, dependent issues disappear, too

Thanks for your time

onEndReached doesn't trigger onEndReachedThreshold's exact scroll position.

Describe the bug
Hi,
I want to make infinite scroll with onEndReachedThreshold and onEndReached.
But when I use onEndReachedThreshold and onEndReached, it triggers onEndReachedThreshold's inaccurate scroll position.
I add my code and video here.

  return (
    <SafeAreaView style={styles.container}>
      <MasonryList
        keyExtractor={(item, index): string => `${item.id}${index}`}
        numColumns={2}
        data={imageList}
        renderItem={({item}) => (
          <ImageItem item={item} onPressBookmarkBtn={onPressBookmarkBtn} />
        )}
        onEndReachedThreshold={0}
        onEndReached={() => console.log('onEndReached !')}
        onMomentumScrollBegin={() => setIsLoading(true)}
      />
    </SafeAreaView>
  );

Screenshots
https://user-images.githubusercontent.com/71131248/179920395-b28b3aa2-7b6c-4b78-abbe-ab8aeb69a892.mp4

Desktop (please complete the following information):

  • OS: Mac OS Big Sir
  • Browser: Chrome
  • Version: 91

Smartphone (please complete the following information):

  • Device: iphone 13
  • OS: IOS 15.5

z Index Bug

I'm encountering an issue with a library I'm using to display posts in two columns. While the buttons display perfectly on the right side, above the posts , there's a problem on the left side where some buttons appear misaligned, positioned below the right side.

saa

onEndReached firing multiple times

Describe the bug
onEndReached method gets fired multiple times when scrolling to the end of scroll view when trying to fetch next set of data for pagination.

Code:

 return (
    <View style={styles.container}>
      <MasonryList
        contentContainerStyle={styles.bListContainer}
        data={feedActivites}
        keyExtractor={(item) => item.id}
        numColumns={2}
        showsVerticalScrollIndicator={false}
        renderItem={({ item }) => <ActivityCard key={item.id} activity={item} />}
        refreshing={feedFetching}
        onRefresh={() => getInitialFeedActivites()}
        onEndReached={() => {
            console.log('onEndReached Fired!');
            // getNextActivites();
        }}
        onEndReachedThreshold={0.1}
      />
    </View>
  );
}

To Reproduce
Steps to reproduce the behavior:

  1. Add data to data array
  2. add onEndReached Method
  3. Scroll down to end of List
  4. onEndReached Method gets called in rapid succession multiple times

Expected behavior
Should only fire one time when reaching end of list

Screenshots
If applicable, add screenshots to help explain your problem.

Screen Shot 2021-07-11 at 12 14 27 PM

Desktop (please complete the following information):

  • OS: Mac OS Big Sir
  • Browser: Chrome
  • Version: 91

Smartphone (please complete the following information):

  • Device: iPhone 12
  • OS: iOS 14.5

Additional context
Add any other context about the problem here.

Add support for Reanimated

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.
I would like to use this with reanimated 2 library, but how?
Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
I don't know if onScroll can be both used the way you used and the way reanimated 2 scroll handler uses it, would you mind telling us if it is possible?
Additional context
Add any other context or screenshots about the feature request here.
https://docs.swmansion.com/react-native-reanimated/docs/api/useAnimatedScrollHandler/

No Output Rendering in Expo

Describe the bug
I am trying to render a basic MasonryList. But not able to generate any output. However it works with vanilla FlatList.

To Reproduce
Here is the code:

import { StyleSheet, View, FlatList } from "react-native";
import React from "react";
import { SafeAreaView } from "react-native-safe-area-context";
import MasonryList from "@react-native-seoul/masonry-list";
import DashboardCard from "@/components/DashboardCard";
import { widgets } from "@/constants/widgets";

const Dashboard = () => {
  return (
    <SafeAreaView className="flex">
      {/* <FlatList
        data={widgets}
        keyExtractor={(item) => item.id}
        renderItem={(item) => <DashboardCard />}
      /> */}
      <MasonryList
        data={widgets}
        keyExtractor={(item) => item.id}
        numColumns={2}
        showsVerticalScrollIndicator={false}
        renderItem={({ item }) => <DashboardCard />}
        onEndReachedThreshold={0.1}
      />
    </SafeAreaView>
  );
};

export default Dashboard;

Smartphone:

  • Device: Android
  • Version [13]

package version
@react-native-seoul/masonry-list": "^1.4.2

Recommendation

For those new to the field, I highly recommend checking out the MasonryFlashList by Shopify. This library offers a more efficient alternative to using ScrollView, which, while a quick solution, lacks performance. Although I haven't personally used MasonryFlashList, my experiences with Shopify's flashlist have been positive. I hope this suggestion proves helpful to you!

Add keyboardShouldPersistTaps="handled"

Is your feature request related to a problem? Please describe.
Without this, Android will require two taps if the MasonryList contains Pressables.

Describe the solution you'd like
Self-explanatory.

Describe alternatives you've considered
Self-explanatory.

Additional context
facebook/react-native#4087

Can't install using yarn because of dooboolab-welcome

yarn install v1.22.17
info No lockfile found.
[1/4] Resolving packages...
error Couldn't find package "dooboolab-welcome" on the "npm" registry.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

npm install is fine

Feature Request: Press Tab Bar Icon to Automatically Scroll to Top of Masonry List

Current problem

I often find myself at the bottom of a long masonry list while using the @react-native-seoul/masonry-list library. Currently, there is no quick way to navigate back to the top of the list without manually scrolling upwards. This can be quite frustrating for users who want to quickly navigate back to the top for any reason.

Solution

I would like to see a "Scroll to Top" feature implemented. Specifically, when a user is at the bottom of a scrollable masonry list and taps on the tab bar icon, the view should automatically scroll back to the top. This will make navigation much smoother and user-friendly.

Considered alternatives

  1. Implementing a dedicated "Scroll to Top" button: This could work but might clutter the UI.
  2. Using gesture-based navigation: Though intuitive, this might interfere with other gestures or functionalities.

Additional context

This feature is common in many apps and significantly improves user experience. It would be a valuable addition to the @react-native-seoul/masonry-list library.

onScroll with AnimatedEvent

Is your feature request related to a problem? Please describe.
from this issue we know that you already update onScroll props.
but i have a question:

  1. how to use it, because i dont find it in the docs
  2. for using onScroll animation i have to use ref props. this library not support ref props
  3. i use AnimatedEvent in onScroll props so we have this error
_onScroll is not a function. (In '_onScroll(e)', '_onScroll' is an instance of AnimatedEvent)

Describe the solution you'd like

  1. please add React.forwardRef() so we can using ref props
  2. maybe you should use AnimatedEvent.ScrollView

Inside the example code <CardItem /> should includes key props

Unlike the Flatlist component will automatically apply key prop from KeyExtractor, if just passing will show missing key warning.

Suggest to revise the Usage part as follow:
renderItem={({item, i}) => <CardItem key={'card'+i} />}

P.S. Thanks for the package!

customize the inner padding between columns

Is your feature request related to a problem? Please describe.
cannot adjust the inner padding between columns, looks like it is fixed for now? Now I have to add padding to each rendered item to add this inner padding between columns, it is very inconvenient to layout

Describe the solution you'd like
add a prop to pass in customize value as the inner padding between columns

Additional context
Screen Shot 2022-05-02 at 1 01 34 PM

Refresh Indicator Fails to Offset with `progressViewOffset` in `RefreshControl`

Describe the bug

The progressViewOffset property for the RefreshControl component is not functioning as expected. When setting an offset value, the refresh indicator does not move from its default position at the top of the view.

Reproduce

Steps to reproduce the behavior:

  1. Go to a page with a scroll view that uses RefreshControl.
  2. Set the progressViewOffset property to a numeric value, for example, 50.
  3. Perform a pull-to-refresh action on the scroll view.
  4. Observe that the refresh indicator remains at its default position and does not move down by 50 units as expected.
<RefreshControl progressViewOffset={50} />

Expected behavior

The refresh indicator should move 50 units down from its default position, aligning itself according to the progressViewOffset value set.

Smartphone:

  • Device: [iPhone 14, pro Max]
  • OS: [iOS 17.0]

Additional context

This issue limits the ability to create a polished and well-aligned user interface, especially when using custom headers or UI elements that need to align with the refresh indicator.

Inclusion of `expo` as a peer dependency is causing warnings

Describe the bug
"expo" is listed as a dependency in the core project but only used in the Example project. Is there a reason for this? It is causing warnings to be thrown in non-expo projects due to a missing peer dependency. Maybe it needs to move to devDependencies?

To Reproduce
In a non-expo project, add "@react-native-seoul/masonry-list": "1.4.2", to package.json and run yarn install, see warning:

YN0002: โ”‚ @test/mobile@workspace:packages/mobile doesn't provide expo (pb91be), requested by @react-native-seoul/masonry-list

Expected behavior
No warnings should print to console unless expo is being used in the core project itself. Maybe we need

Screenshots
N/A

Desktop (please complete the following information):

N/A

Smartphone (please complete the following information):

N/A

Additional context
using Yarn 3 and it shows warnings to help manage peer deps

onEndReached call multiple times

Describe the bug
A clear and concise description of what the bug is.

To Reproduce
Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. See error

Expected behavior
A clear and concise description of what you expected to happen.

Screenshots
If applicable, add screenshots to help explain your problem.

Desktop (please complete the following information):

  • OS: [e.g. iOS]
  • Browser [e.g. chrome, safari]
  • Version [e.g. 22]

Smartphone (please complete the following information):

  • Device: [e.g. iPhone6]
  • OS: [e.g. iOS8.1]
  • Browser [e.g. stock browser, safari]
  • Version [e.g. 22]

Additional context
Add any other context about the problem here.

TypeScript: Type 'unknown' is not assignable to type 'IntrinsicAttributes'

Describe the bug
When using the MasonryList component in a TypaScript project, the renderItem prop param item is not being typed as the elements given to the data prop array, but it is type 'unknown' so when rendering the item, ts raises this problem.

If I use FlatList or ScrollView instead, I don't get this warning.

To Reproduce
Steps to reproduce the behavior:

  1. Create TypeScript project.
  2. Define this constants:
interface PostPreviewProps {
  id: string;
  imgUrl: string;
}

const posts: PostPreviewProps[] = [
  {
    id: '1',
    imgUrl: 'https://img.freepik.com/free-photo/delicious-donuts_144627-6267.jpg?t=st=1708687137~exp=1708690737~hmac=f9cf5f46c098a440e9581533fe07c587d300dfc22b44d0cc7cdb1b6810503314&w=1480',
  },
  {
    id: '2',
    imgUrl: 'https://img.freepik.com/free-photo/vertical-shot-fox-walking-rocks-forest_181624-31966.jpg?t=st=1708686685~exp=1708690285~hmac=b7d67c6f8bf2576069aaa00308da904b12ae956275498340427b94165f880a60&w=996',
  },
];
  1. Define the following component to render the item:
function PostPreview(props: PostPreviewProps): JSX.Element {
  return (
    <View>
      <Image
        source={{ uri: props.imgUrl }}
      />
    </View>
  );
}
  1. Render the following:
<MasonryList
  data={posts}
  renderItem={({ item }) => (
    <PostPreview {...item} />
  )}
/>
  1. See ts problem

Expected behavior
The item param from the renderItem callback should have type PostPreviewProps, since the data value (posts) is an array of such item type. Both FlatList and ScrollView do this automatically, but this MasonryList component says item is type unknown, which causes the ts problem reported when passed item as props to the PostPreview component.

Screenshots
Captura de pantalla 2024-04-03 a las 16 03 52
Captura de pantalla 2024-04-03 a las 16 08 09

MasonryExample could not load all images after providing more than 130 images.

I intended to use the MasonryList for infinite scroll, so memory usage is very important to my use case. In order to verify if the MasonryList can support infinite images, I tried to load 200+ images with the MasonryExample, however, the app failed to load images after around 130 images. I am wondering if MasonryList can support infinite items as native RecyclerView or TableView?

Here is the screenshot:
https://photos.app.goo.gl/s9DTL4MciU1Q27vA8

  • Device: Samsung S20 Ultra
  • OS: Android 12

Wondering how to dynamic define the height of the item? The screenshot looks fancy, is there code share?

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc. Object {

Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

Describe the solution you'd like
A clear and concise description of what you want to happen.

Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.

Additional context
Add any other context or screenshots about the feature request here.

Cannot Disable Pull To Refresh

I have TouchableOpacity as the parent of item that render on renderItem. And when i do longpress and swipe to down it is doing Pull To Refresh. Is there any proper way to disable Pull To Refresh?

The docs said this package extended ScrollView props, but when i set bounces to false it's still able to Pull To Refresh.

componentDidUpdate didn't triggered in child component (renderItem component)

In my app the cards shows some informations. When the card is clicked, the information data should change as what parent component give to the child. In the child I use componentDidUpdate to achieve that (it works using FlatList), but it doesn't work using this. How can I use componentDidUpdate with this library? Thank you.

Multiple columns for a single item

I'm trying to implement a variation of a masonry list and I haven't been able to achieve it. Is it possible to render an item spanning horizontally to two columns or is there a constraint that items should only have a single column of width? (i.e. If i have 4 columns, maybe i would like an item to span 2 of those 4 columns.)

onEndReached not getting called

when there is not enough content to cover the whole screen then onEndReached is not getting fired unlike flatlist where onEndReached gets called if content is not covering whole screen. onEndReached gets fired only after user scrolls. i tried passing onEndReachedThreshold also.

To Reproduce
keep content small that does not cover whole screen on first page of pagination

Expected behavior
onEndReached should get fired even if content is not covering whole screen

Smartphone (please complete the following information):
both android and iOS

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.