How to fetch object data from Modal Input to Homepage with Array Function for making Contact List?

I am new in this field, want to learn coding in React native to develop Mobile App.

I want to develop one Contact List with React Native
In Home page I put one (+) button to toggle / opening of the Modal with Text Input boxes and one Submit button to close.
After putting my Text Input in the Input boxes( Name, Email and Phone), clicking the submit button the Modal is closing but the Text Input object data are not appearing in Home page.
I want to bring the Text Input object data to the Homepage with Array Function as total Contact List which object data I tried to pass through Modal Text Input.

The Modal is closing properly, but the Text Input object data are not being passed to the Home page where I intended to get.
I tried to paste my codes here but the system is not accepting giving error everytime.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>AddContactOne.js
import { Image, Modal, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
import React, { useState } from 'react'
import Input from '../../components/Input'
const AddContactOne = () => {
const [name, setName] = useState([]);
const [email, setEmail] = useState([]);
const [phone, setPhone] = useState([]);
const [modalVisible, setModalVisible] = useState(false);
const toggleModal = () => { setModalVisible(!modalVisible); };
return (
<View style={styles.container}>
<Text style={styles.txt1}>Contact List</Text>
<TouchableOpacity
onPress={(v) => toggleModal(v)}
style={{
height: 50,
width: 50,
backgroundColor: 'white',
position: 'absolute',
bottom: 30,
right: 30,
borderRadius: 30,
shadowColor: 'black',
elevation: 8,
alignItems: 'center',
justifyContent: 'center'
}}>
<Image
source={{
uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png',
}}
style={{
height: 30,
width: 30,
}}
/>
<Modal
animationType="slide"
transparent={true}
visible={modalVisible}
onRequestClose={toggleModal}>
<View
style={{
height: 320,
width: '85%',
borderRadius: 10,
alignSelf: 'center',
alignContent: 'center',
justifyContent: 'center',
marginTop: 150,
backgroundColor: "blue",
}}>
<Text style={styles.txt2}>Add Contact</Text>
<Input
value={name}
placeholder={'Enter Name'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={v => setName(v)}
/>
<Input
value={email}
placeholder={'Enter Email'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={v => setEmail(v)}
/>
<Input
value={phone}
placeholder={'Enter Phone Number'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={v => setPhone(v)}
/>
<TouchableOpacity
style={{
backgroundColor: 'white',
alignItems: 'center',
justifyContent: 'center',
height: 50,
margin: 20,
borderRadius: 10,
}}
// onPress= {() => {
// setModalVisible(false)
// props?.navigation?.navigate('AddContactOne', {
// name: name,
// email: email,
// phone: phone
// })}
// }
onPress={toggleModal}
name={(v) => setName(v)}
email={(v) => setEmail(v)}
phone={(v) => setPhone(v)}
>
<Text style={{
color: 'black',
fontSize: 20,
}}>Submit</Text>
</TouchableOpacity>
</View>
</Modal>
</TouchableOpacity>
</View>
)
}
export default AddContactOne
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
backgroundColor: 'white',
width: '100%',
alignContent: 'center',
alignItems: 'center',
marginTop: 20,
},
txt1: {
fontSize: 25,
fontWeight: '400'
},
txt2: {
fontSize: 20,
fontWeight: '350',
textAlign: 'center',
marginBottom: 6
}
})
App.js
import { SafeAreaView } from 'react-native'
import React from 'react'
import Task from './src/screens/main/Task';
import AddContact from './src/screens/main/AddContact';
import AddContactOne from './src/screens/main/AddContactOne';
import AddContactTwo from './src/screens/main/AddContactTwo';
const App = () => {
return (
// <Welcome />
// <SignUp/>
// <Task/>
// <AddContact/>
<AddContactOne/>
// <AddContactTwo/>
)
}
export default App</code>
<code>AddContactOne.js import { Image, Modal, StyleSheet, Text, TouchableOpacity, View } from 'react-native' import React, { useState } from 'react' import Input from '../../components/Input' const AddContactOne = () => { const [name, setName] = useState([]); const [email, setEmail] = useState([]); const [phone, setPhone] = useState([]); const [modalVisible, setModalVisible] = useState(false); const toggleModal = () => { setModalVisible(!modalVisible); }; return ( <View style={styles.container}> <Text style={styles.txt1}>Contact List</Text> <TouchableOpacity onPress={(v) => toggleModal(v)} style={{ height: 50, width: 50, backgroundColor: 'white', position: 'absolute', bottom: 30, right: 30, borderRadius: 30, shadowColor: 'black', elevation: 8, alignItems: 'center', justifyContent: 'center' }}> <Image source={{ uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png', }} style={{ height: 30, width: 30, }} /> <Modal animationType="slide" transparent={true} visible={modalVisible} onRequestClose={toggleModal}> <View style={{ height: 320, width: '85%', borderRadius: 10, alignSelf: 'center', alignContent: 'center', justifyContent: 'center', marginTop: 150, backgroundColor: "blue", }}> <Text style={styles.txt2}>Add Contact</Text> <Input value={name} placeholder={'Enter Name'} placeholderTextColor={'white'} marginTop={10} onChangeText={v => setName(v)} /> <Input value={email} placeholder={'Enter Email'} placeholderTextColor={'white'} marginTop={10} onChangeText={v => setEmail(v)} /> <Input value={phone} placeholder={'Enter Phone Number'} placeholderTextColor={'white'} marginTop={10} onChangeText={v => setPhone(v)} /> <TouchableOpacity style={{ backgroundColor: 'white', alignItems: 'center', justifyContent: 'center', height: 50, margin: 20, borderRadius: 10, }} // onPress= {() => { // setModalVisible(false) // props?.navigation?.navigate('AddContactOne', { // name: name, // email: email, // phone: phone // })} // } onPress={toggleModal} name={(v) => setName(v)} email={(v) => setEmail(v)} phone={(v) => setPhone(v)} > <Text style={{ color: 'black', fontSize: 20, }}>Submit</Text> </TouchableOpacity> </View> </Modal> </TouchableOpacity> </View> ) } export default AddContactOne const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'column', backgroundColor: 'white', width: '100%', alignContent: 'center', alignItems: 'center', marginTop: 20, }, txt1: { fontSize: 25, fontWeight: '400' }, txt2: { fontSize: 20, fontWeight: '350', textAlign: 'center', marginBottom: 6 } }) App.js import { SafeAreaView } from 'react-native' import React from 'react' import Task from './src/screens/main/Task'; import AddContact from './src/screens/main/AddContact'; import AddContactOne from './src/screens/main/AddContactOne'; import AddContactTwo from './src/screens/main/AddContactTwo'; const App = () => { return ( // <Welcome /> // <SignUp/> // <Task/> // <AddContact/> <AddContactOne/> // <AddContactTwo/> ) } export default App</code>
AddContactOne.js

import { Image, Modal, StyleSheet, Text, TouchableOpacity, View } from 'react-native'
import React, { useState } from 'react'
import Input from '../../components/Input'


const AddContactOne = () => {

  const [name, setName] = useState([]);
  const [email, setEmail] = useState([]);
  const [phone, setPhone] = useState([]);
  const [modalVisible, setModalVisible] = useState(false);
  const toggleModal = () => { setModalVisible(!modalVisible); };

  return (

    <View style={styles.container}>
      <Text style={styles.txt1}>Contact List</Text>
      <TouchableOpacity
        onPress={(v) => toggleModal(v)}
        style={{
          height: 50,
          width: 50,
          backgroundColor: 'white',
          position: 'absolute',
          bottom: 30,
          right: 30,
          borderRadius: 30,
          shadowColor: 'black',
          elevation: 8,
          alignItems: 'center',
          justifyContent: 'center'
        }}>
        <Image
          source={{
            uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png',
          }}
          style={{
            height: 30,
            width: 30,
          }}
        />
        <Modal
          animationType="slide"
          transparent={true}
          visible={modalVisible}
          onRequestClose={toggleModal}>
          <View
            style={{
              height: 320,
              width: '85%',
              borderRadius: 10,
              alignSelf: 'center',
              alignContent: 'center',
              justifyContent: 'center',
              marginTop: 150,
              backgroundColor: "blue",
            }}>
            <Text style={styles.txt2}>Add Contact</Text>
            <Input
              value={name}
              placeholder={'Enter Name'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={v => setName(v)}
            />
            <Input
              value={email}
              placeholder={'Enter Email'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={v => setEmail(v)}
            />
            <Input
              value={phone}
              placeholder={'Enter Phone Number'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={v => setPhone(v)}
            />
            <TouchableOpacity
              style={{
                backgroundColor: 'white',
                alignItems: 'center',
                justifyContent: 'center',
                height: 50,
                margin: 20,
                borderRadius: 10,
              }}

              // onPress= {() => {
              //   setModalVisible(false)
              //   props?.navigation?.navigate('AddContactOne', {
              //         name: name,
              //         email: email,
              //           phone: phone
              //       })} 
              //     }
              onPress={toggleModal}
              name={(v) => setName(v)}
              email={(v) => setEmail(v)}
              phone={(v) => setPhone(v)}
            >
              <Text style={{
                color: 'black',
                fontSize: 20,
              }}>Submit</Text>
            </TouchableOpacity>
          </View>
        </Modal>
      </TouchableOpacity>
    </View>
  )
}

export default AddContactOne

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    backgroundColor: 'white',
    width: '100%',
    alignContent: 'center',
    alignItems: 'center',
    marginTop: 20,
  },
  txt1: {
    fontSize: 25,
    fontWeight: '400'
  },
  txt2: {
    fontSize: 20,
    fontWeight: '350',
    textAlign: 'center',
    marginBottom: 6

  }

})




App.js


import { SafeAreaView } from 'react-native'
import React from 'react'
import Task from './src/screens/main/Task';
import AddContact from './src/screens/main/AddContact';
import AddContactOne from './src/screens/main/AddContactOne';
import AddContactTwo from './src/screens/main/AddContactTwo';


const App = () => {
  return (
    // <Welcome /> 
    // <SignUp/>
    // <Task/>
    // <AddContact/>
    <AddContactOne/>
    // <AddContactTwo/>
  )
}

export default App

New contributor

Prasenjit is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

I see you’re facing an issue.

From what I can tell, the problem seems to be that you’re not rendering the data stored in the state correctly. Additionally, I noticed that you’re using an array for name, email, and phone, but these should be individual states since they hold single values, not arrays.

You should create separate states for name, email, and phone (as strings), and another state to hold the entire contact list. I’ve also tried to solve your problem by making these changes and added some styling for better visibility.

Here’s an updated version of your code:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>import React, { useState } from 'react';
import {
Image,
Modal,
StyleSheet,
Text,
TextInput,
TouchableOpacity,
View,
} from 'react-native';
const AddContactOne = () => {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const [phone, setPhone] = useState('');
const [contacts, setContacts] = useState([]);
const [modalVisible, setModalVisible] = useState(false);
const toggleModal = () => {
setModalVisible(!modalVisible);
};
const addContact = () => {
const contact = {
name: name,
email: email,
phone: phone,
};
setContacts([...contacts, contact]);
setName('');
setEmail('');
setPhone('');
toggleModal();
};
return (
<View style={styles.container}>
<Text style={styles.txt1}>Contact List</Text>
{contacts.map((contact, index) => (
<View
key={index}
style={{
width: '100%',
marginTop: 10,
padding: 10,
borderWidth: 1,
}}>
<Text style={styles.txt}>{contact.name}</Text>
<Text style={styles.txt}>{contact.email}</Text>
<Text style={styles.txt}>{contact.phone}</Text>
</View>
))}
<TouchableOpacity
onPress={toggleModal}
style={{
height: 50,
width: 50,
backgroundColor: 'white',
position: 'absolute',
bottom: 30,
right: 30,
borderRadius: 30,
shadowColor: 'black',
elevation: 8,
alignItems: 'center',
justifyContent: 'center',
}}>
<Image
source={{
uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png',
}}
style={{
height: 30,
width: 30,
}}
/>
<Modal
animationType="slide"
transparent={true}
visible={modalVisible}
onRequestClose={toggleModal}>
<View
style={{
height: 320,
width: '85%',
borderRadius: 10,
alignSelf: 'center',
alignContent: 'center',
justifyContent: 'center',
marginTop: 150,
backgroundColor: 'blue',
}}>
<Text style={styles.txt2}>Add Contact</Text>
<TextInput
value={name}
placeholder={'Enter Name'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={setName}
/>
<TextInput
value={email}
placeholder={'Enter Email'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={setEmail}
/>
<TextInput
value={phone}
placeholder={'Enter Phone Number'}
placeholderTextColor={'white'}
marginTop={10}
onChangeText={setPhone}
/>
<TouchableOpacity
style={{
backgroundColor: 'white',
alignItems: 'center',
justifyContent: 'center',
height: 50,
margin: 20,
borderRadius: 10,
}}
onPress={addContact}>
<Text
style={{
color: 'black',
fontSize: 20,
}}>
Submit
</Text>
</TouchableOpacity>
</View>
</Modal>
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
backgroundColor: 'white',
alignContent: 'center',
alignItems: 'center',
marginTop: 20,
paddingHorizontal: 20,
},
txt1: {
fontSize: 25,
fontWeight: '400',
color: 'black',
},
txt2: {
fontSize: 20,
fontWeight: '350',
textAlign: 'center',
marginBottom: 6,
},
txt: {
fontSize: 20,
fontWeight: '400',
color: 'black',
},
});
const App = () => {
return <AddContactOne />;
};
export default App;
</code>
<code>import React, { useState } from 'react'; import { Image, Modal, StyleSheet, Text, TextInput, TouchableOpacity, View, } from 'react-native'; const AddContactOne = () => { const [name, setName] = useState(''); const [email, setEmail] = useState(''); const [phone, setPhone] = useState(''); const [contacts, setContacts] = useState([]); const [modalVisible, setModalVisible] = useState(false); const toggleModal = () => { setModalVisible(!modalVisible); }; const addContact = () => { const contact = { name: name, email: email, phone: phone, }; setContacts([...contacts, contact]); setName(''); setEmail(''); setPhone(''); toggleModal(); }; return ( <View style={styles.container}> <Text style={styles.txt1}>Contact List</Text> {contacts.map((contact, index) => ( <View key={index} style={{ width: '100%', marginTop: 10, padding: 10, borderWidth: 1, }}> <Text style={styles.txt}>{contact.name}</Text> <Text style={styles.txt}>{contact.email}</Text> <Text style={styles.txt}>{contact.phone}</Text> </View> ))} <TouchableOpacity onPress={toggleModal} style={{ height: 50, width: 50, backgroundColor: 'white', position: 'absolute', bottom: 30, right: 30, borderRadius: 30, shadowColor: 'black', elevation: 8, alignItems: 'center', justifyContent: 'center', }}> <Image source={{ uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png', }} style={{ height: 30, width: 30, }} /> <Modal animationType="slide" transparent={true} visible={modalVisible} onRequestClose={toggleModal}> <View style={{ height: 320, width: '85%', borderRadius: 10, alignSelf: 'center', alignContent: 'center', justifyContent: 'center', marginTop: 150, backgroundColor: 'blue', }}> <Text style={styles.txt2}>Add Contact</Text> <TextInput value={name} placeholder={'Enter Name'} placeholderTextColor={'white'} marginTop={10} onChangeText={setName} /> <TextInput value={email} placeholder={'Enter Email'} placeholderTextColor={'white'} marginTop={10} onChangeText={setEmail} /> <TextInput value={phone} placeholder={'Enter Phone Number'} placeholderTextColor={'white'} marginTop={10} onChangeText={setPhone} /> <TouchableOpacity style={{ backgroundColor: 'white', alignItems: 'center', justifyContent: 'center', height: 50, margin: 20, borderRadius: 10, }} onPress={addContact}> <Text style={{ color: 'black', fontSize: 20, }}> Submit </Text> </TouchableOpacity> </View> </Modal> </TouchableOpacity> </View> ); }; const styles = StyleSheet.create({ container: { flex: 1, flexDirection: 'column', backgroundColor: 'white', alignContent: 'center', alignItems: 'center', marginTop: 20, paddingHorizontal: 20, }, txt1: { fontSize: 25, fontWeight: '400', color: 'black', }, txt2: { fontSize: 20, fontWeight: '350', textAlign: 'center', marginBottom: 6, }, txt: { fontSize: 20, fontWeight: '400', color: 'black', }, }); const App = () => { return <AddContactOne />; }; export default App; </code>
import React, { useState } from 'react';
import {
  Image,
  Modal,
  StyleSheet,
  Text,
  TextInput,
  TouchableOpacity,
  View,
} from 'react-native';

const AddContactOne = () => {
  const [name, setName] = useState('');
  const [email, setEmail] = useState('');
  const [phone, setPhone] = useState('');
  const [contacts, setContacts] = useState([]);

  const [modalVisible, setModalVisible] = useState(false);
  const toggleModal = () => {
    setModalVisible(!modalVisible);
  };

  const addContact = () => {
    const contact = {
      name: name,
      email: email,
      phone: phone,
    };
    setContacts([...contacts, contact]);
    setName('');
    setEmail('');
    setPhone('');
    toggleModal();
  };

  return (
    <View style={styles.container}>
      <Text style={styles.txt1}>Contact List</Text>
      {contacts.map((contact, index) => (
        <View
          key={index}
          style={{
            width: '100%',
            marginTop: 10,
            padding: 10,
            borderWidth: 1,
          }}>
          <Text style={styles.txt}>{contact.name}</Text>
          <Text style={styles.txt}>{contact.email}</Text>
          <Text style={styles.txt}>{contact.phone}</Text>
        </View>
      ))}
      <TouchableOpacity
        onPress={toggleModal}
        style={{
          height: 50,
          width: 50,
          backgroundColor: 'white',
          position: 'absolute',
          bottom: 30,
          right: 30,
          borderRadius: 30,
          shadowColor: 'black',
          elevation: 8,
          alignItems: 'center',
          justifyContent: 'center',
        }}>
        <Image
          source={{
            uri: 'https://cdn-icons-png.flaticon.com/128/748/748113.png',
          }}
          style={{
            height: 30,
            width: 30,
          }}
        />
        <Modal
          animationType="slide"
          transparent={true}
          visible={modalVisible}
          onRequestClose={toggleModal}>
          <View
            style={{
              height: 320,
              width: '85%',
              borderRadius: 10,
              alignSelf: 'center',
              alignContent: 'center',
              justifyContent: 'center',
              marginTop: 150,
              backgroundColor: 'blue',
            }}>
            <Text style={styles.txt2}>Add Contact</Text>
            <TextInput
              value={name}
              placeholder={'Enter Name'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={setName}
            />
            <TextInput
              value={email}
              placeholder={'Enter Email'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={setEmail}
            />
            <TextInput
              value={phone}
              placeholder={'Enter Phone Number'}
              placeholderTextColor={'white'}
              marginTop={10}
              onChangeText={setPhone}
            />
            <TouchableOpacity
              style={{
                backgroundColor: 'white',
                alignItems: 'center',
                justifyContent: 'center',
                height: 50,
                margin: 20,
                borderRadius: 10,
              }}
              onPress={addContact}>
              <Text
                style={{
                  color: 'black',
                  fontSize: 20,
                }}>
                Submit
              </Text>
            </TouchableOpacity>
          </View>
        </Modal>
      </TouchableOpacity>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'column',
    backgroundColor: 'white',
    alignContent: 'center',
    alignItems: 'center',
    marginTop: 20,
    paddingHorizontal: 20,
  },
  txt1: {
    fontSize: 25,
    fontWeight: '400',
    color: 'black',
  },
  txt2: {
    fontSize: 20,
    fontWeight: '350',
    textAlign: 'center',
    marginBottom: 6,
  },
  txt: {
    fontSize: 20,
    fontWeight: '400',
    color: 'black',
  },
});

const App = () => {
  return <AddContactOne />;
};

export default App;

New contributor

Amine Takdenti is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

2

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật