Skip to content

Commit

Permalink
[workbench] Add missing DrawerLayoutAndroid implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
alloy committed Nov 21, 2020
1 parent 99aab6f commit ad5c3af
Show file tree
Hide file tree
Showing 7 changed files with 308 additions and 6 deletions.
@@ -0,0 +1,146 @@
/**
* TODO: Figure out why these are not included in the Flow dump
*/

import * as React from "react"

import type { ColorValue, ViewStyleProp } from "../../StyleSheet/StyleSheet"
import type { DirectEventHandler } from "../../Types/CodegenTypes"

type DrawerStates = "Idle" | "Dragging" | "Settling"

type DrawerSlideEvent = $ReadOnly<{|
offset: number,
|}>

type Props = $ReadOnly<{|
/**
* Determines whether the keyboard gets dismissed in response to a drag.
* - 'none' (the default), drags do not dismiss the keyboard.
* - 'on-drag', the keyboard is dismissed when a drag begins.
*/
keyboardDismissMode?: ?("none" | "on-drag"),

/**
* Specifies the background color of the drawer. The default value is white.
* If you want to set the opacity of the drawer, use rgba. Example:
*
* ```
* return (
* <DrawerLayoutAndroid drawerBackgroundColor="rgba(0,0,0,0.5)">
* </DrawerLayoutAndroid>
* );
* ```
*/
drawerBackgroundColor: ColorValue,

/**
* Specifies the side of the screen from which the drawer will slide in.
*/
drawerPosition: ?("left" | "right"),

/**
* Specifies the width of the drawer, more precisely the width of the view that be pulled in
* from the edge of the window.
*/
drawerWidth?: ?number,

/**
* Specifies the lock mode of the drawer. The drawer can be locked in 3 states:
* - unlocked (default), meaning that the drawer will respond (open/close) to touch gestures.
* - locked-closed, meaning that the drawer will stay closed and not respond to gestures.
* - locked-open, meaning that the drawer will stay opened and not respond to gestures.
* The drawer may still be opened and closed programmatically (`openDrawer`/`closeDrawer`).
*/
drawerLockMode?: ?("unlocked" | "locked-closed" | "locked-open"),

/**
* Function called whenever there is an interaction with the navigation view.
*/
onDrawerSlide?: ?DirectEventHandler<DrawerSlideEvent>,

/**
* Function called when the drawer state has changed. The drawer can be in 3 states:
* - Idle, meaning there is no interaction with the navigation view happening at the time
* - Dragging, meaning there is currently an interaction with the navigation view
* - Settling, meaning that there was an interaction with the navigation view, and the
* navigation view is now finishing its closing or opening animation
*/
onDrawerStateChanged?: ?(state: DrawerStates) => mixed,

/**
* Function called whenever the navigation view has been opened.
*/
onDrawerOpen?: ?() => mixed,

/**
* Function called whenever the navigation view has been closed.
*/
onDrawerClose?: ?() => mixed,

/**
* The navigation view that will be rendered to the side of the screen and can be pulled in.
*/
renderNavigationView: () => React.Element<any>,

/**
* Make the drawer take the entire screen and draw the background of the
* status bar to allow it to open over the status bar. It will only have an
* effect on API 21+.
*/
statusBarBackgroundColor?: ?ColorValue,

children?: React.Node,
style?: ?ViewStyleProp,
|}>

/**
* React component that wraps the platform `DrawerLayout` (Android only). The
* Drawer (typically used for navigation) is rendered with `renderNavigationView`
* and direct children are the main view (where your content goes). The navigation
* view is initially not visible on the screen, but can be pulled in from the
* side of the window specified by the `drawerPosition` prop and its width can
* be set by the `drawerWidth` prop.
*
* Example:
*
* ```
* render: function() {
* var navigationView = (
* <View style={{flex: 1, backgroundColor: '#fff'}}>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'left'}}>I'm in the Drawer!</Text>
* </View>
* );
* return (
* <DrawerLayoutAndroid
* drawerWidth={300}
* drawerPosition="left"
* renderNavigationView={() => navigationView}>
* <View style={{flex: 1, alignItems: 'center'}}>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>Hello</Text>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>World!</Text>
* </View>
* </DrawerLayoutAndroid>
* );
* },
* ```
*/
declare class DrawerLayoutAndroid extends React.Component<Props> {
static positions: () => mixed;

static defaultProps: {|
drawerBackgroundColor: "white",
|};

/**
* Opens the drawer.
*/
openDrawer: () => void;

/**
* Closes the drawer.
*/
closeDrawer: () => void;
}

declare module.exports: typeof DrawerLayoutAndroid
@@ -0,0 +1,2 @@
import UnimplementedView from "../UnimplementedViews/UnimplementedView"
declare module.exports: typeof UnimplementedView
@@ -1,5 +1,7 @@
// @flow
// TODO: Move these Flow typings upstream
/**
* TODO: Move these Flow typings upstream
*/

type Size = {
width: ?number,
height: ?number,
Expand Down
@@ -0,0 +1,144 @@
/**
* TODO: Figure out why these are not included in the Flow dump
*/
import * as React from "react";
import { ColorValue, ViewStyleProp } from "../../StyleSheet/StyleSheet";
import { DirectEventHandler } from "../../Types/CodegenTypes";
declare type DrawerStates = "Idle" | "Dragging" | "Settling";
declare type DrawerSlideEvent = Readonly<
/*[FLOW2DTS - Warning] This type was an exact object type in the original Flow source.*/
{
offset: number;
}>;
declare type Props = Readonly<
/*[FLOW2DTS - Warning] This type was an exact object type in the original Flow source.*/
{
/**
* Determines whether the keyboard gets dismissed in response to a drag.
* - 'none' (the default), drags do not dismiss the keyboard.
* - 'on-drag', the keyboard is dismissed when a drag begins.
*/
keyboardDismissMode?: null | undefined | ("none" | "on-drag");

/**
* Specifies the background color of the drawer. The default value is white.
* If you want to set the opacity of the drawer, use rgba. Example:
*
* ```
* return (
* <DrawerLayoutAndroid drawerBackgroundColor="rgba(0,0,0,0.5)">
* </DrawerLayoutAndroid>
* );
* ```
*/
drawerBackgroundColor: ColorValue;

/**
* Specifies the side of the screen from which the drawer will slide in.
*/
drawerPosition: null | undefined | ("left" | "right");

/**
* Specifies the width of the drawer, more precisely the width of the view that be pulled in
* from the edge of the window.
*/
drawerWidth?: null | undefined | number;

/**
* Specifies the lock mode of the drawer. The drawer can be locked in 3 states:
* - unlocked (default), meaning that the drawer will respond (open/close) to touch gestures.
* - locked-closed, meaning that the drawer will stay closed and not respond to gestures.
* - locked-open, meaning that the drawer will stay opened and not respond to gestures.
* The drawer may still be opened and closed programmatically (`openDrawer`/`closeDrawer`).
*/
drawerLockMode?: null | undefined | ("unlocked" | "locked-closed" | "locked-open");

/**
* Function called whenever there is an interaction with the navigation view.
*/
onDrawerSlide?: null | undefined | DirectEventHandler<DrawerSlideEvent>;

/**
* Function called when the drawer state has changed. The drawer can be in 3 states:
* - Idle, meaning there is no interaction with the navigation view happening at the time
* - Dragging, meaning there is currently an interaction with the navigation view
* - Settling, meaning that there was an interaction with the navigation view, and the
* navigation view is now finishing its closing or opening animation
*/
onDrawerStateChanged?: null | undefined | ((state: DrawerStates) => unknown);

/**
* Function called whenever the navigation view has been opened.
*/
onDrawerOpen?: null | undefined | (() => unknown);

/**
* Function called whenever the navigation view has been closed.
*/
onDrawerClose?: null | undefined | (() => unknown);

/**
* The navigation view that will be rendered to the side of the screen and can be pulled in.
*/
renderNavigationView: () => React.Element<any>;

/**
* Make the drawer take the entire screen and draw the background of the
* status bar to allow it to open over the status bar. It will only have an
* effect on API 21+.
*/
statusBarBackgroundColor?: null | undefined | ColorValue;
children?: React.Node;
style?: null | undefined | ViewStyleProp;
}>;
/**
* React component that wraps the platform `DrawerLayout` (Android only). The
* Drawer (typically used for navigation) is rendered with `renderNavigationView`
* and direct children are the main view (where your content goes). The navigation
* view is initially not visible on the screen, but can be pulled in from the
* side of the window specified by the `drawerPosition` prop and its width can
* be set by the `drawerWidth` prop.
*
* Example:
*
* ```
* render: function() {
* var navigationView = (
* <View style={{flex: 1, backgroundColor: '#fff'}}>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'left'}}>I'm in the Drawer!</Text>
* </View>
* );
* return (
* <DrawerLayoutAndroid
* drawerWidth={300}
* drawerPosition="left"
* renderNavigationView={() => navigationView}>
* <View style={{flex: 1, alignItems: 'center'}}>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>Hello</Text>
* <Text style={{margin: 10, fontSize: 15, textAlign: 'right'}}>World!</Text>
* </View>
* </DrawerLayoutAndroid>
* );
* },
* ```
*/

declare class DrawerLayoutAndroid extends React.Component<Props> {
static positions(): unknown;
static defaultProps:
/*[FLOW2DTS - Warning] This type was an exact object type in the original Flow source.*/
{
drawerBackgroundColor: "white";
};

/**
* Opens the drawer.
*/
openDrawer(): void;

/**
* Closes the drawer.
*/
closeDrawer(): void;
}
export default DrawerLayoutAndroid;
@@ -1,6 +1,8 @@
import { $TypeOf } from "flow2dts-flow-types-polyfill";
// @flow
// TODO: Move these Flow typings upstream

/**
* TODO: Move these Flow typings upstream
*/
declare type Size = {
width: null | undefined | number;
height: null | undefined | number;
Expand Down
@@ -0,0 +1,4 @@
import { $TypeOf } from "flow2dts-flow-types-polyfill";
import UnimplementedView from "../UnimplementedViews/UnimplementedView";
declare const $f2tExportDefault: $TypeOf<typeof UnimplementedView>;
export default $f2tExportDefault;
@@ -1,6 +1,8 @@
import { $TypeOf } from "flow2dts-flow-types-polyfill";
// @flow
// TODO: Move these Flow typings upstream

/**
* TODO: Move these Flow typings upstream
*/
declare type Size = {
width: null | undefined | number;
height: null | undefined | number;
Expand Down

0 comments on commit ad5c3af

Please sign in to comment.