npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

expo-swiftlist

v1.0.2

Published

SwiftList is a component that makes it possible to separate actions (Controller) from UI/UX (View) for large (section) lists with search, selections and actions

Downloads

5

Readme

See types for a detailed description of usage

SwiftList is a component that makes it possible to separate actions (Controller) from UI/UX (View) for large (section) lists with search, selections and actions

  • show any data list in any way, with or without sections
  • Selection (if activated)
  • Search
  • Render (list)-headers and -footers
  • Render given footer
  • pull to refresh
  • Either select, show actions, or do action, when clicking on item
  • Selection actions
  • Section actions

Usage

<SwiftList
  data={sectionArray}
  renderItem={({ item }) => <Text>{item.firstName}</Text>}
  getSearchableString={item => item.firstName + ` ` + item.lastName}
  itemActions={item => [
    {
      index: 0,
      onPress: () => console.log("item", item.firstName),
      title: ""
    }
  ]}
/>

API

Props

| Tools | | ---------- | | navigation | | dispatch |


type SectionActionsGetter = (
title: SectionTitle,
tools: Tools,
sectionData: Object[]
) => Action[];

| SectionTitle: field | type | description | | ------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------- | | field | string | on what field is this section based? | | value | string | number | boolean | What is the value of that field of this section? e.g. Amsterdam, 2, or true | | title | (value: string | number | boolean) => string | What is the title for this section? E.g. Amsterdam, Friends, or Inner Circle | | sectionActions | SectionActionsGetter | Which actions are possible on this section? callback | | returnIfEmpty | (state: State) => boolean | function that returns a boolean based on swiftlist state |

| Section | type | | ------- | ------------ | | title | SectionTitle | | data | Object[] |

| Action | type | | ------- | ---------- | | index | number | | onPress | () => void | | title | string |

export type Props = {
  /**
   * won't be rendered
   */
  children: React.ReactNode,

  /**
   * to know wheter or not to add marginTop
   */
  hasHeader: boolean,

  /**
   * provide tools to do sectionActions
   */
  tools: Tools,

  /**
   * extra style for the main view container
   */
  style: any,

  /**
   * you can give either sections or items. make sure every item has an `id` prop, or selection won't work
   */
  data?: Section[] | Object[],

  /**
   * when true, defaults to selectionview and can't stop this.
   */
  isEditing?: boolean,

  /**
   * use search? defaults to true
   */
  useSearch?: boolean,

  /**
   * pull to see header? defaults to false
   */
  pullHeader?: boolean,

  /**
   * defaults to 1
   */
  numColumns?: number,
  /**
   * maps an item to a string that can be searched from that item
   */
  getSearchableString: (item: Object) => string,

  /**
   * maps an item to a string for a title
   */
  getTitle: (item: Object) => string,

  /**
   * maps an item to a string for a subtitle
   */
  getSubtitle: (item: Object) => string,

  /**
   * render the item
   */
  renderItem: (props: any) => any,

  footer?: (state: State) => any,
  topHeader?: (state: State) => any,
  bottomHeader?: (state: State) => any,
  listFooter?: (state: State) => any,
  listHeader?: (state: State) => any,
  listEmpty?: (state: State) => any,
  listEmptySection?: (state: State, title: SectionTitle) => any,

  /**
   * if given, pull to refresh is enabled and will wait for onRefresh to promise. won't work together with pullHeader
   */
  onRefresh?: () => Promise<void>,

  /**
   * callback that retreives actions from parent based on item. This in turn renders ActionSheet or something else. If there's just one action, just fire that action without button
   */
  itemActions: (item: Object) => Action[],

  /**
   * do one thing based on item. can be used in combination with itemActions
   */
  itemOnPress: (item: Object) => void,

  /**
   * callback that retreives actions from parent based on selection. this in turn renders FAB or something else, depending on optional parameter or platform default
   */
  selectionActions: (selection: Object[]) => Action[],

  /**
   * callback when selection changes
   */
  onChange: (selection: Object[]) => void,

  /**
   * callback when isSearching changes
   */
  isSearching: (isSearching: boolean) => void,

  hideStatusBar: boolean,

  headerButtons: (HeaderIconButton.Props & {
    position: "top" | "bottom" | "left" | "right"
  })[]
};

export type State = {
  search: string,
  isSearching: boolean,
  isEditing: boolean,
  selected: Object[],
  isRefreshing: boolean
};