1+ /**
2+ * Copyright (c) Microsoft Corporation. All rights reserved.
3+ * Licensed under the MIT License.
4+ */
5+
6+ import React , { useState } from "react" ;
7+ import TestPages , { ITestPage } from './TestPages'
8+ import { TouchableOpacity , Text , View , TextInput , FlatList , Button , StyleSheet } from 'react-native'
9+ import { SEARCH_BUTTON , HOME_BUTTON } from './Consts'
10+
11+
12+ interface TestPageListProps {
13+ onNavigateTo : ( pageTestId : string ) => void ,
14+ testPages : ITestPage [ ]
15+ }
16+
17+ function TestPageList ( props : TestPageListProps ) {
18+ const [ filter , setFilter ] = useState ( "" ) ;
19+
20+ const _renderItem = ( { item } : { item : ITestPage } ) => (
21+ < TouchableOpacity onPress = { ( ) => { props . onNavigateTo ( item . testId ) } } testID = { item . testId } >
22+ < View >
23+ < Text > { item . description } </ Text >
24+ </ View >
25+ </ TouchableOpacity >
26+ ) ;
27+
28+ const data = props . testPages . filter ( ( item : ITestPage ) => ! filter || ( item . testId && item . testId . includes ( filter ) ) || ( item . description && item . description . includes ( filter ) ) )
29+
30+ return (
31+ < View >
32+ < TextInput placeholder = 'Search test page' onChangeText = { ( text ) => setFilter ( text ) } value = { filter } testID = { SEARCH_BUTTON } />
33+ < FlatList < ITestPage > data = { data } renderItem = { _renderItem } keyExtractor = { ( item ) => item . testId } />
34+ </ View > )
35+ }
36+
37+ interface TestPageDetailProps {
38+ testPage : ITestPage
39+ }
40+
41+ function TestPageDetail ( props : TestPageDetailProps ) {
42+ return < props . testPage . content />
43+ }
44+
45+ interface HeaderProps {
46+ onNavigateTo : ( pageTestId : string ) => void ,
47+ description : string
48+ }
49+
50+ function Header ( props : HeaderProps ) {
51+ return (
52+ < View style = { styles . headerContainer } >
53+ < View style = { styles . header } >
54+ < View style = { styles . headerCenter } >
55+ < Text style = { styles . title } > { props . description } </ Text >
56+ </ View >
57+ < Button title = 'Home' onPress = { ( ) => { props . onNavigateTo ( '' ) } } testID = { HOME_BUTTON } />
58+ </ View >
59+ </ View > ) ;
60+ }
61+
62+ const styles = StyleSheet . create ( {
63+ headerContainer : {
64+ borderBottomWidth : StyleSheet . hairlineWidth ,
65+ borderBottomColor : '#96969A' ,
66+ } ,
67+ header : {
68+ height : 40 ,
69+ flexDirection : 'row'
70+ } ,
71+ headerLeft : { } ,
72+ headerCenter : {
73+ flex : 1 ,
74+ position : 'absolute' ,
75+ top : 7 ,
76+ left : 0 ,
77+ right : 0
78+ } ,
79+ title : {
80+ fontSize : 19 ,
81+ fontWeight : '600' ,
82+ textAlign : 'center'
83+ } ,
84+ testPageContainer : {
85+ flex : 1
86+ }
87+ } ) ;
88+
89+
90+ export default function TestApp ( ) {
91+ const [ toPageTestId , setToPageTestId ] = useState ( "" ) ;
92+
93+ const _onNavigateTo = ( pageTestId : string ) => { setToPageTestId ( pageTestId ) } ;
94+
95+ if ( toPageTestId . length > 0 ) {
96+ const page = TestPages . filter ( testPage => testPage . testId === toPageTestId ) [ 0 ] ;
97+ return (
98+ < View style = { styles . testPageContainer } >
99+ < Header onNavigateTo = { ( ) => { _onNavigateTo ( '' ) } } description = { page . description } />
100+ < TestPageDetail testPage = { page } />
101+ </ View > )
102+ } else {
103+ return (
104+ < View style = { styles . testPageContainer } >
105+ < Header onNavigateTo = { ( ) => { } } description = 'Home' />
106+ < TestPageList testPages = { TestPages } onNavigateTo = { ( testPageId ) => { _onNavigateTo ( testPageId ) } } />
107+ </ View > )
108+ }
109+ }
0 commit comments