packages/@fbcmobile-ui/Components/StatusPill.js (75 lines of code) (raw):

/** * Copyright (c) Facebook, Inc. and its affiliates. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. * * @flow strict-local * @format */ 'use strict'; import type {ViewStyleProp} from 'react-native/Libraries/StyleSheet/StyleSheet'; import * as React from 'react'; import Colors from '@fbcmobile/ui/Theme/Colors'; import fbt from 'fbt'; import {Fonts} from '@fbcmobile/ui/Theme'; import {StyleSheet, Text, View} from 'react-native'; export const Statuses = { PLANNED: 'PLANNED', IN_PROGRESS: 'IN_PROGRESS', SUBMITTED: 'SUBMITTED', CLOSED: 'CLOSED', BLOCKED: 'BLOCKED', /* Deprecated. Will be removed on 2020-11-01 */ PENDING: 'PENDING', /* Deprecated. Will be removed on 2020-11-01 */ DONE: 'DONE', }; export type Status = $Values<typeof Statuses>; type Props = { +style?: ViewStyleProp, +status: Status, }; const getStatusProps = ( status: Status, ): ?{| +label: React.Node, +style: ViewStyleProp, |} => { switch (status) { case Statuses.PLANNED: return { label: ( <fbt desc="Label indicating status of a work order">Planned</fbt> ), style: styles.plannedPill, }; case Statuses.IN_PROGRESS: return { label: <fbt desc="In Progress task">In Progress</fbt>, style: styles.inProgressPill, }; case Statuses.SUBMITTED: return { label: <fbt desc="Submitted task">Submitted</fbt>, style: styles.submittedPill, }; case Statuses.CLOSED: return { label: <fbt desc="Closed task">Closed</fbt>, style: styles.closedPill, }; case Statuses.BLOCKED: return { label: <fbt desc="BLOCKED task">Blocked</fbt>, style: styles.blockedPill, }; case Statuses.PENDING: return { label: <fbt desc="Pending task">Pending</fbt>, style: styles.pendingPill, }; case Statuses.DONE: return {label: <fbt desc="Done task">Done</fbt>, style: styles.donePill}; default: return null; } }; const StatusPill = ({status, style}: Props) => { const pillProps = getStatusProps(status); if (pillProps == null) { return null; } return ( <View style={[styles.root, pillProps.style, style]}> <Text style={styles.statusText}>{pillProps.label}</Text> </View> ); }; const styles = StyleSheet.create({ root: { paddingHorizontal: 5, paddingVertical: 3, borderRadius: 3, }, plannedPill: { backgroundColor: Colors.Gray55, }, inProgressPill: { backgroundColor: Colors.OrangeLight, }, submittedPill: { backgroundColor: Colors.Teal, }, blockedPill: { backgroundColor: Colors.OrangeRed, }, closedPill: { backgroundColor: Colors.Gray65, }, pendingPill: { backgroundColor: Colors.WarmYellow, }, donePill: { backgroundColor: Colors.GrassGreen, }, statusText: { ...Fonts.style.h9, fontWeight: '500', }, }); export default StatusPill;