about summary refs log tree commit diff
path: root/src/view/screens/Search.tsx
blob: 3b1710a2e2eacd01824091d46856fe3ebc73c603 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import React, {useEffect, useState, useMemo} from 'react'
import {StyleSheet, Text, TextInput, TouchableOpacity, View} from 'react-native'
import {ViewHeader} from '../com/util/ViewHeader'
import {SuggestedFollows} from '../com/discover/SuggestedFollows'
import {UserAvatar} from '../com/util/UserAvatar'
import {ScreenParams} from '../routes'
import {useStores} from '../../state'
import {UserAutocompleteViewModel} from '../../state/models/user-autocomplete-view'
import {s, colors} from '../lib/styles'
import {MagnifyingGlassIcon} from '../lib/icons'

export const Search = ({navIdx, visible, params}: ScreenParams) => {
  const store = useStores()
  const [query, setQuery] = useState<string>('')
  const autocompleteView = useMemo<UserAutocompleteViewModel>(
    () => new UserAutocompleteViewModel(store),
    [],
  )
  const {name} = params

  useEffect(() => {
    if (visible) {
      autocompleteView.setup()
      store.nav.setTitle(navIdx, `Search`)
    }
  }, [store, visible, name])

  const onChangeQuery = (text: string) => {
    setQuery(text)
    if (text.length > 0) {
      autocompleteView.setActive(true)
      autocompleteView.setPrefix(text)
    } else {
      autocompleteView.setActive(false)
    }
  }
  const onSelect = (handle: string) => {
    store.nav.navigate(`/profile/${handle}`)
  }

  return (
    <View style={styles.container}>
      <ViewHeader title="Search" />
      <View style={styles.inputContainer}>
        <MagnifyingGlassIcon style={styles.inputIcon} />
        <TextInput
          placeholder="Type your query here..."
          style={styles.input}
          onChangeText={onChangeQuery}
        />
      </View>
      <View style={styles.outputContainer}>
        {query ? (
          <View>
            {autocompleteView.searchRes.map((item, i) => (
              <TouchableOpacity
                key={i}
                style={styles.searchResult}
                onPress={() => onSelect(item.handle)}>
                <UserAvatar
                  handle={item.handle}
                  displayName={item.displayName}
                  size={36}
                />
                <View style={[s.ml10]}>
                  <Text style={styles.searchResultDisplayName}>
                    {item.displayName || item.handle}
                  </Text>
                  <Text style={styles.searchResultHandle}>@{item.handle}</Text>
                </View>
              </TouchableOpacity>
            ))}
          </View>
        ) : (
          <SuggestedFollows asLinks />
        )}
      </View>
    </View>
  )
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: colors.white,
  },

  inputContainer: {
    flexDirection: 'row',
    paddingVertical: 16,
    paddingHorizontal: 16,
    borderBottomColor: colors.gray1,
    borderBottomWidth: 1,
  },
  inputIcon: {
    marginRight: 10,
    color: colors.gray3,
  },
  input: {
    fontSize: 16,
  },

  outputContainer: {
    flex: 1,
    backgroundColor: colors.gray1,
  },

  searchResult: {
    flexDirection: 'row',
    backgroundColor: colors.white,
    borderBottomWidth: 1,
    borderBottomColor: colors.gray1,
    paddingVertical: 16,
    paddingHorizontal: 16,
  },
  searchResultDisplayName: {
    fontSize: 16,
    fontWeight: 'bold',
  },
  searchResultHandle: {
    fontSize: 14,
    color: colors.gray5,
  },
})