aboutsummaryrefslogtreecommitdiff
path: root/src/components/profile/Cover.tsx
blob: 5d5b4234885b60615734f289e9c4843c20fd38cd (plain)
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
import React, {useState, useEffect} from 'react';
import {
  Image,
  StyleSheet,
  View,
  TouchableOpacity,
  Text,
  ImageBackground,
} from 'react-native';
import {COVER_HEIGHT, IMAGE_WIDTH} from '../../constants';
import {ScreenType} from '../../types';
import GreyPurplePlus from '../../assets/icons/grey-purple-plus.svg';
import {useDispatch, useSelector} from 'react-redux';
import {loadUserData, resetHeaderAndProfileImage} from '../../store/actions';
import {RootState} from '../../store/rootreducer';
import {normalize, patchProfile, validateImageLink} from '../../utils';

interface CoverProps {
  userXId: string | undefined;
  screenType: ScreenType;
}
const Cover: React.FC<CoverProps> = ({userXId, screenType}) => {
  const dispatch = useDispatch();
  const {cover, user} = useSelector((state: RootState) =>
    userXId ? state.userX[screenType][userXId] : state.user,
  );

  const [needsUpdate, setNeedsUpdate] = useState(false);
  const [loading, setLoading] = useState(false);
  const [validImage, setValidImage] = useState<boolean>(true);

  useEffect(() => {
    checkAvatar(cover);
  }, []);

  useEffect(() => {
    if (needsUpdate) {
      const userId = user.userId;
      const username = user.username;
      dispatch(resetHeaderAndProfileImage());
      dispatch(loadUserData({userId, username}));
    }
  }, [dispatch, needsUpdate]);

  const handleNewImage = async () => {
    setLoading(true);
    const result = await patchProfile('header', user.userId);
    setLoading(true);
    if (result) {
      setNeedsUpdate(true);
    } else {
      setLoading(false);
    }
  };

  const checkAvatar = async (url: string | undefined) => {
    const valid = await validateImageLink(url);
    if (valid !== validImage) {
      setValidImage(valid);
    }
  };

  if (!validImage && userXId === undefined && !loading) {
    return (
      <View style={[styles.container]}>
        <ImageBackground
          style={styles.image}
          defaultSource={require('../../assets/images/cover-placeholder.png')}
          source={{uri: cover, cache: 'reload'}}>
          <TouchableOpacity
            accessible={true}
            accessibilityLabel="ADD HEADER PICTURE"
            onPress={() => handleNewImage()}>
            <GreyPurplePlus style={styles.plus} />
            <Text style={styles.text}>Add Picture</Text>
          </TouchableOpacity>
        </ImageBackground>
      </View>
    );
  } else {
    return (
      <View style={styles.container}>
        <Image
          style={styles.image}
          defaultSource={require('../../assets/images/cover-placeholder.png')}
          source={{uri: cover, cache: 'reload'}}
        />
      </View>
    );
  }
};

const styles = StyleSheet.create({
  container: {
    ...StyleSheet.absoluteFillObject,
  },
  image: {
    width: IMAGE_WIDTH,
    height: COVER_HEIGHT,
  },
  plus: {
    position: 'absolute',
    top: 75,
    right: 125,
  },
  text: {
    color: 'white',
    position: 'absolute',
    fontSize: normalize(16),
    top: 80,
    right: 20,
  },
  touch: {
    flex: 1,
  },
});
export default Cover;