Bagaimana cara mengembangkan Aplikasi Media Sosial?

Membuat Sampul Aplikasi Media Sosial

Dalam artikel ini, kita akan membahas tentang jejaring sosial, jenis-jenis aplikasi media sosial, manfaatnya, dan fitur-fitur yang harus dimiliki.

Selain itu, kita akan melihat cara membuat jejaring sosial selangkah demi selangkah. Kita akan menggunakan Back4app di backend dan Next.js di frontend.

Apa yang dimaksud dengan jejaring sosial?

Jejaring sosial adalah aplikasi media sosial yang memungkinkan orang untuk terhubung dan berinteraksi satu sama lain.

Setelah dua pengguna terhubung, mereka dapat berbagi informasi pengguna mereka, bertukar pesan, gambar, berbagi postingan, dan banyak lagi.

Saat ini aplikasi media sosial sangat populer. Hampir semua orang mendaftar ke setidaknya satu aplikasi media sosial. Menurut penelitian Buffer, platform media sosial yang paling populer adalah:

  • Facebook (2,96 miliar MAU)
  • YouTube (2,2 miliar MAU)
  • Instagram (2 miliar MAU)
  • TikTok (1 miliar MAU)
  • Snapchat (500 juta MAU)

MAU adalah singkatan dari pengguna aktif bulanan. Ini adalah jumlah pengguna unik yang berinteraksi dengan platform media sosial Anda setiap bulannya.

Meskipun pasar aplikasi media sosial sangat besar, mengembangkan aplikasi media sosial adalah tugas yang menantang.

Ini adalah salah satu proyek TI paling kompleks yang bisa Anda lakukan. Banyak perusahaan meremehkan betapa sulitnya membangun aplikasi jejaring sosial, kemudian gagal total dengan kerugian besar.

Jenis-jenis aplikasi media sosial

Seperti yang telah disebutkan pada bagian sebelumnya, jejaring sosial hanyalah salah satu jenis aplikasi media sosial. Jenis aplikasi media sosial lainnya adalah:

  • Jaringan berbagi media (Instagram, TikTok, YouTube)
  • Jaringan berbagi konten (Pinterest, Tumblr, Flickr)
  • Jaringan ulasan konsumen (Trustpilot, Angi, Choice)
  • Jaringan blog dan penerbitan (Medium, Twitter)
  • Forum diskusi (Reddit, Quora, HackerNews)
  • Jaringan hubungan (Tinder, Bumble)

Manfaat mengembangkan aplikasi media sosial

Membangun aplikasi media sosial menawarkan beberapa manfaat. Manfaatnya meliputi pendapatan iklan, monetisasi, mengumpulkan informasi pengguna yang berharga, analitik tingkat lanjut, sponsor dengan perusahaan lain, dan banyak lagi.

Hal hebat lainnya tentang aplikasi media sosial adalah nilai jualnya yang luar biasa. Jika aplikasi Anda relatif sukses (artinya memiliki basis pengguna yang layak), Anda dapat dengan cepat menjualnya ke perusahaan lain. Sebagai contoh, Twitter dijual seharga $44 miliar, dan MySpace dijual seharga $87 juta.

Dari sudut pandang pengembang, membangun jejaring sosial sederhana memungkinkan Anda untuk mengenal alat yang Anda gunakan dan memberi Anda wawasan tentang betapa sulitnya membangun sesuatu seperti ini.

Fitur-fitur yang harus ada pada aplikasi media sosial

Aplikasi media sosial sangat bervariasi dalam hal fungsi. Namun demikian, ada beberapa fitur penting yang disertakan oleh setiap aplikasi media sosial yang sukses.

Akun Pengguna

Semua aplikasi media sosial memungkinkan pengguna untuk membuat akun. Setelah pengguna membuat akun, mereka dapat menambahkan informasi pribadi dan menyesuaikan aplikasi dengan kebutuhan mereka. Misalnya, mereka memilih fitur yang mereka sukai, menambahkan minat mereka, menyembunyikan konten tertentu, dll.

Keuntungan terbaik dari akun pengguna dari perspektif bisnis adalah Anda dapat membangun “profil pengguna”. Yang saya maksud dengan “profil pengguna” adalah Anda mengetahui apa yang disukai pengguna tertentu dan dengan siapa mereka berinteraksi, lalu menyesuaikan iklan yang sesuai.

Menghubungkan Pengguna

Aplikasi media sosial memungkinkan pengguna untuk terhubung, misalnya, menambahkan seseorang sebagai teman, mengikuti mereka, dan berlangganan. Setelah dua pengguna terhubung, feed mereka akan berubah.

Berbagi Konten

Inti dari setiap aplikasi media sosial adalah berbagi konten. Jika aplikasi Anda tidak memungkinkan pengguna berbagi konten dengan cepat, aplikasi Anda pasti tidak akan sukses.

Saat menerapkan aplikasi media sosial, ikuti praktik UI/UX terbaik. Memposting sesuatu harus semudah menekan satu atau dua tombol.

Pencarian dan Penemuan

Algoritme pencarian dan penemuan yang hebat adalah bagian integral dari setiap aplikasi sosial yang sukses.

Aplikasi media sosial Anda harus memungkinkan pengguna untuk menemukan konten yang mereka minati dengan mudah. Selain itu, aplikasi Anda harus menawarkan feed yang dipersonalisasi dan fungsionalitas pencarian lanjutan.

Pemberitahuan

Anda perlu mempertimbangkan untuk menerapkan pemberitahuan push untuk mendorong keterlibatan dan meningkatkan penggunaan aplikasi.

Notifikasi push adalah saluran komunikasi yang ampuh yang memungkinkan Anda memberi tahu pengguna ketika sesuatu terjadi, misalnya, teman mereka memposting, ada acara, mereka tidak menggunakan aplikasi dalam beberapa waktu, dan sebagainya.

Untuk mempelajari lebih lanjut tentang pemberitahuan push dan cara mengintegrasikannya ke dalam proyek Anda, baca Apa itu Pemberitahuan Push?

Bagaimana cara membuat aplikasi media sosial?

Di bagian tutorial ini, kita akan melihat bagaimana cara membuat aplikasi media sosial selangkah demi selangkah. Kita akan menggunakan Back4app sebagai backend dan React dengan framework Next.js di frontend.

Prasyarat

Berikut ini adalah tech stack yang akan kami gunakan untuk proyek ini:

Apa itu Back4app?

Back4app adalah backend kode rendah yang hebat untuk membangun aplikasi web dan seluler modern dengan cepat. Muncul dengan sejumlah fitur, termasuk database real-time, manajemen pengguna, fungsi Cloud Code, notifikasi push, integrasi sosial, API, SDK, dan banyak lagi!

Dengan menggunakan Back4app, Anda dapat mengalihdayakan sebagian besar pekerjaan backend dan fokus pada logika bisnis inti dan frontend.

Anda juga tidak perlu khawatir tentang infrastruktur yang mendasari atau penskalaan aplikasi. Back4app akan menangani semua itu. Ini adalah pilihan yang bagus untuk mempercepat pengembangan aplikasi media sosial.

Back4app menawarkan tingkat gratis yang sangat bagus untuk pengujian dan pembuatan prototipe. Seiring dengan meningkatnya skala aplikasi Anda, Anda nantinya dapat meningkatkan ke tingkat premium dengan harga yang dapat diprediksi.

Mengapa menggunakan Back4app untuk membangun jaringan sosial?

Pengenalan Proyek

Pada artikel ini, kita akan membangun sebuah jejaring sosial sederhana. Jejaring sosial yang diimplementasikan akan memungkinkan pengguna untuk membuat akun, mengautentikasi diri mereka sendiri, membuat profil, dan membuat postingan.

Di backend kita akan menggunakan Back4app, dan di frontend kita akan menggunakan React dengan framework Next.js untuk membuat aplikasi media sosial

Pertama-tama kita akan membuat aplikasi Back4app, mengatur model database, dan kemudian beralih ke frontend.

Di bagian depan, kita harus menginstal Parse SDK, mengatur autentikasi, dan bekerja pada tampilan tertentu, misalnya login, pendaftaran, profil.

Produk akhir akan terlihat seperti ini:

Jejaring Sosial Back4app

Buat Aplikasi

Langkah selanjutnya mengharuskan Anda memiliki akun Back4app. Jika Anda belum memilikinya, silakan buat akun secara gratis.

Saat Anda masuk ke akun Back4app Anda, Anda akan disajikan dengan daftar aplikasi Anda. Klik “Buat aplikasi baru” untuk memulai proses pembuatan aplikasi.

Back4app Bangun Aplikasi Baru

Back4app memungkinkan Anda untuk membuat dua jenis aplikasi:

  1. Backend sebagai Layanan (BaaS)
  2. Kontainer sebagai Layanan (CaaS)

BaaS adalah solusi backend bertenaga Parse yang lengkap, sementara CaaS digunakan untuk menerapkan aplikasi dalam kontainer melalui Docker.

Karena kita sedang membangun jejaring sosial, kita akan menggunakan opsi “Backend sebagai Layanan”.

Back4app Membangun BaaS

Selanjutnya, berikan nama deskriptif pada aplikasi Anda, pilih “NoSQL” sebagai basis data, dan klik “Buat”.

Back4app akan membutuhkan waktu sekitar 2 menit untuk mempersiapkan semua yang diperlukan untuk aplikasi Anda. Setelah selesai, Anda akan diarahkan ke tampilan basis data aplikasi Anda.

Tampilan Basis Data Back4app

Kelas Basis Data

Selanjutnya, mari kita siapkan basis data untuk mengembangkan aplikasi media sosial.

Seperti yang mungkin telah Anda ketahui, dua kelas sudah ada di dalam database. Yang pertama disebut Pengguna dan yang kedua Peran. Secara default, semua kelas Back4app dilengkapi dengan bidang-bidang berikut:

+-----------+-------------------------------------------------------------------------+
| Name      | Explanation                                                             |
+-----------+-------------------------------------------------------------------------+
| objectId  | Object's unique identifier                                              |
+-----------+-------------------------------------------------------------------------+
| updatedAt | Date time of the object's last update.                                  |
+-----------+-------------------------------------------------------------------------+
| createdAt | Date time of object's creation.                                         |
+-----------+-------------------------------------------------------------------------+
| ACLs      | Allow you to control the access to the object (eg. read, update).       |
+-----------+-------------------------------------------------------------------------+

Mari kita sedikit memodifikasi kelas User kita dengan menambahkan bidang deskripsi dan avatarUrl. Pengguna nantinya dapat mengedit kedua bidang ini dalam pengaturan mereka.

Klik tombol “+ Kolom” di bagian kanan atas layar dan tambahkan dua bidang berikut:

+-----------+-------------+--------------------+----------+
| Data type | Name        | Default value      | Required |
+-----------+-------------+--------------------+----------+
| String    | description | Another cool user! | yes      |
+-----------+-------------+--------------------+----------+
| String    | avatarUrl   | <some_image_url>   | yes      |
+-----------+-------------+--------------------+----------+

Pastikan untuk mengganti dengan url gambar yang sebenarnya, diakhiri dengan .png, .jpg, atau .jpeg. Jika Anda tidak punya ide, Anda bisa menggunakan yang ini.

Kolom Tambah Basis Data Back4app

Selanjutnya, mari kita buat kelas bernama Post. Setiap postingan akan memiliki penulis dan beberapa konten teks.

Gunakan tombol “Buat kelas” di kiri atas layar untuk memulai proses pembuatan kelas. Sebut saja Post, jadikan “Dilindungi”, dan klik “Buat kelas & tambahkan kolom”.

Kemudian tambahkan dua kolom berikut ke dalamnya:

+-----------------+---------+---------------+----------+
| Data type       | Name    | Default value | Required |
+-----------------+---------+---------------+----------+
| Pointer -> User | author  | <leave blank> | yes      |
+-----------------+---------+---------------+----------+
| String          | content | <leave blank> | yes      |
+-----------------+---------+---------------+----------+
Kelas Pembuatan Basis Data Back4app

Keamanan Basis Data Back4app

Mengenai keamanan database Back4app, ada dua cara yang dapat kita gunakan untuk melindungi kelas & objek. Kita dapat memilih dari yang berikut ini:

  1. Izin Tingkat Kelas (CLP)
  2. Tingkat Kontrol Akses (ACL)

CLP berfokus pada pendefinisian pembatasan akses di tingkat kelas, yang memungkinkan kontrol yang sangat halus atas akses dan modifikasi data. Sebaliknya, ACL memberikan atau membatasi akses ke objek tertentu dan didasarkan pada peran atau izin yang ditentukan pengguna.

Untuk mempelajari lebih lanjut tentang keamanan Parse, lihat artikel Keamanan Server Parse.

Kita ingin agar hanya pengguna yang terotentikasi yang dapat membuat postingan, dan hanya penulis postingan yang dapat memperbarui dan menghapusnya. Untuk mencapai hal itu, kita akan menyiapkan Post CLP.

Pilih kelas Post di bilah sisi, lalu gunakan tiga titik di kanan atas layar dan “Keamanan > Izin Tingkat Kelas”. Tetapkan CLP seperti itu:

Back4app Post CLPs

Bagus, itu dia. Backend kita sekarang sudah selesai. Itu tidak terlalu sulit.

Kode Frontend

Di bagian artikel ini, kita akan bekerja pada bagian frontend jejaring sosial kita.

Proyek Init

Mulailah dengan menggunakan alat bantu create-next-app untuk melakukan bootstrap pada proyek Next.js yang baru:

$ npx create-next-app@latest back4app-social-network

√ Would you like to use TypeScript? ... No
√ Would you like to use ESLint? ... Yes
√ Would you like to use Tailwind CSS? ... No
√ Would you like to use `src/` directory? ... No
√ Would you like to use App Router? (recommended) ... No
√ Would you like to customize the default import alias? ... No

Created a new Next.js app in ~\back4app-social-network.

Alat ini akan menanyakan sejumlah pertanyaan kepada Anda. Saya sarankan Anda hanya mengaktifkan ESLint, karena kita tidak akan menggunakan fitur-fitur lain yang ditawarkan, dan fitur-fitur tersebut akan membuat proyek Anda lebih kompleks.

Proyek default Next.js dilengkapi dengan beberapa file dan direktori yang “tidak berguna”. Untuk mengurangi ukuran proyek, silakan hapus file-file berikut ini:

  • halaman/folderapi
  • folder gaya
  • public/next.svg
  • public/vercel.svg

Selain itu, jangan lupa untuk menghapus impor globals.css dari pages/_app.js:

// pages/_app.js

import "@/styles/globals.css";  // remove this line

Kemudian ganti konten pages/index.js dengan yang berikut ini:

// pages/index.js

export default function Home() {
  return (
    <>
      <p>Hello world!</p>
    </>
  );
}

Mulai server pengembangan Berikutnya:

$ next dev

Terakhir, buka peramban web Anda dan buka http://localhost:3000. Jika semuanya berjalan dengan baik, aplikasi Anda akan terkompilasi, dan Anda akan melihat pesan “Hello world!”.

Pengaturan ChakraUI

Untuk mempercepat proses pembuatan UI, kita akan menggunakan ChakraUI. ChakraUI adalah library React yang luar biasa dengan komponen prebuilt, sistem bergaya, hook khusus, dan banyak lagi.

Silakan instal melalui NPM:

$ npm i @chakra-ui/react @chakra-ui/next-js @emotion/react @emotion/styled framer-motion

Selanjutnya, bungkus Komponen Anda dengan ChakraProvider seperti ini:

// pages/_app.js

import {ChakraProvider} from "@chakra-ui/react";

function MyApp({Component, pageProps}) {
  return (
    <ChakraProvider>
      <Component {...pageProps} />
    </ChakraProvider>
  );
}

export default MyApp;

Jangan lupa untuk mengimpornya di bagian atas file:

import {ChakraProvider} from "@chakra-ui/react";

Agar Chakra dapat bekerja dengan benar, kita harus menyertakan skrip mode warna. Skrip ini memastikan sinkronisasi penyimpanan lokal bekerja dengan benar dan menghilangkan “warna berkedip”.

Modifikasi halaman/_document.js Anda seperti ini:

// pages/_document.js

import { Html, Head, Main, NextScript } from "next/document";
import {ColorModeScript, extendTheme} from "@chakra-ui/react";

export const theme = extendTheme();

export default function Document() {
  return (
    <Html lang="en">
      <Head />
      <body>
        <ColorModeScript initialColorMode={theme}/>
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}

Itu saja untuk pengaturan awal Chakra.

Ikon React

Untuk membuat aplikasi kita menjadi lebih menarik, kita akan menginstal react-icons. React icons adalah sebuah library yang memungkinkan Anda dengan cepat menyertakan ikon-ikon populer ke dalam proyek Anda. React-icons dilengkapi dengan ikon Ant, Bootstrap, Heroicons, Font Awesome, dan masih banyak lagi.

Instal dengan menjalankannya:

$ npm install react-icons --save

Kemudian, Anda bisa mengimpor ikon apa pun dan menggunakannya seperti itu:

import {FaMusic} from "react-icons/fa";

return (
    <FaMusic/>
);

Untuk daftar ikon, lihat dokumen resmi mereka.

Tata Letak & Komponen

Sebagian besar jejaring sosial memiliki tata letak standar. Semua halaman memiliki header yang sama di bagian atas dan footer di bagian bawah. Mari kita terapkan tata letak kita.

Mulailah dengan membuat folder bernama komponen di root proyek. Kemudian buat file-file ini di dalamnya:

components/
├── header.js
├── footer.js
└── layout.js

Selanjutnya, isi file header.js dengan yang berikut ini:

// components/header.js

import NextLink from "next/link";
import {Box, Container, Divider, Heading, HStack, Link} from "@chakra-ui/react";

export default function Header() {
  return (
    <Box py={4}>
      <Container 
        maxW="container.lg" 
        display="flex" 
        alignItems="center" 
        justifyContent="space-between"
      >
        <Heading as="h1" size="md">
          <Link as={NextLink} href="/">
            back4app-social-network
          </Link>
        </Heading>
        <HStack spacing="1em">
          <Heading size="sm">
            <Link as={NextLink} href="/login">
              Log in
            </Link>
          </Heading>
          <Heading size="sm">
            <Link as={NextLink} href="/signup">
              Sign up
            </Link>
          </Heading>
        </HStack>
      </Container>
      <Divider my={4}/>
    </Box>
  );
}

Kemudian lakukan hal yang sama untuk file footer.js:

// components/footer.js

import NextLink from "next/link";
import {Box, Container, Divider, Heading,
  HStack, Link, Tag, Text, VStack} from "@chakra-ui/react";
import {FaGithub} from "react-icons/fa";

export default function Footer() {
  return (
    <Box py={4}>
      <Divider my={4}/>
      <Container
        maxW="container.lg"
        display="flex"
        justifyContent="space-between"
        alignItems="center"
      >
        <VStack alignItems="left">
          <Heading size="sm">
            A simple social network powered by Back4app.
          </Heading>
          <Link
            as={NextLink}
            href="https://blog.back4app.com/how-to-develop-a-social-media-app/"
          >
            Click here to learn how to build it!
          </Link>
        </VStack>
        <Link href="https://github.com/duplxey/back4app-social-network">
          <Tag background="black" color="white" py={2}>
            <HStack>
              <FaGithub size="1.5em"/>
              <Text>View on GitHub</Text>
            </HStack>
          </Tag>
        </Link>
      </Container>
    </Box>
  );
}

Tidak banyak yang bisa kami jelaskan di sini. Kami menggunakan komponen bawaan Chakra untuk membentuk header dan footer yang bagus. Karena kami menggunakan Next.js, kami menggabungkan Tautan Chakra dengan Tautan Next.

Terakhir, gunakan komponen header dan footer yang baru dibuat untuk membentuk tata letak:

// components/layout.js

import {Container} from "@chakra-ui/react";
import Header from "@/components/header";
import Footer from "@/components/footer";

export default function Layout({children}) {
  return (
    <>
      <Header/>
      <Container maxW="container.lg">
        {children}
      </Container>
      <Footer/>
    </>
  );
}

Kemudian terapkan Tata Letak ke index.js:

// pages/index.js

import Layout from "@/components/layout";

export default function Home() {
  return (
    <Layout>
      <p>Hello world!</p>
    </Layout>
  );
}

Tunggu hingga server pengembangan Berikutnya mengkompilasi ulang kode Anda, lalu kunjungi http://localhost:3000. Jika semuanya berjalan dengan baik, Anda akan melihat bahwa tata letak baru telah diterapkan.

Jejaring Sosial Back4app Halo Dunia

Pengaturan Parse.js

Mulailah dengan menginstal Parse melalui NPM:

$ npm install parse

Selanjutnya, tambahkan konfigurasi berikut ini di bawah impor _app.js:

// pages/_app.js

// ...

import Parse from "parse/dist/parse";

const PARSE_APPLICATION_ID = process.env.NEXT_PUBLIC_PARSE_APPLICATION_ID;
const PARSE_JAVASCRIPT_KEY = process.env.NEXT_PUBLIC_PARSE_JAVASCRIPT_KEY;
Parse.initialize(PARSE_APPLICATION_ID, PARSE_JAVASCRIPT_KEY);
Parse.serverURL = "https://parseapi.back4app.com/";

// ...

Alih-alih mengkodekan kredensial secara manual, kami menggunakan variabel lingkungan. Dengan Next.js, Anda tidak perlu mengonfigurasi apa pun untuk mengaktifkan variabel lingkungan. Variabel-variabel ini secara otomatis dimuat dari berkas .env.local.

Buat file .env.local di root proyek dengan konten berikut:

NEXT_PUBLIC_PARSE_APPLICATION_ID=<parse_app_id>
NEXT_PUBLIC_PARSE_JAVASCRIPT_KEY=<parse_javascript_key>

Pastikan untuk mengganti dan dengan ID dan kunci Anda yang sebenarnya. Untuk mendapatkan kredensial Anda, buka aplikasi Back4app Anda dan pilih “Pengaturan Aplikasi > Keamanan & Kunci” di bilah samping.

Konteks

Alih-alih melewatkan instance Parse melalui beberapa lapisan hirarki komponen, kita akan menggunakan konteks React. Konteks React memungkinkan Anda untuk “memindahkan” data dari satu komponen ke komponen lainnya tanpa melewatkan data tersebut melalui props.

Pertama, buat folder baru bernama context dengan file parseContext.js di dalamnya:

// context/parseContext.js

import {createContext} from "react";

const ParseContext = createContext();

export default ParseContext;

Kemudian bungkus komponen Anda dengan ParseContext.Provider dan berikan instance Parse padanya:

// pages/_app.js

// ...

function MyApp({Component, pageProps}) {
  return (
    <ChakraProvider>
      <ParseContext.Provider value={Parse}>
        <Component {...pageProps} />
      </ParseContext.Provider>
    </ChakraProvider>
  );
}

export default MyApp;

Sekali lagi, jangan lupa tentang impor ParseContext:

import ParseContext from "@/context/parseContext";

Sekarang kita dapat memperoleh instance Parse melalui hook useContext() di dalam view kita. Mari kita uji koneksi Parse di index.js.

Ganti konten pages/index.js dengan yang berikut ini:

// pages/index.js

import {useContext} from "react";
import ParseContext from "@/context/parseContext";
import {Button} from "@chakra-ui/react";
import Layout from "@/components/layout";

export default function Home() {

  const parse = useContext(ParseContext);

  async function testConnection() {
    try {
      await new parse.Query("TestClass").first();
      console.log("Connection successful");
    } catch (error) {
      console.error("Connection failed: " + error);
    }
  }

  return (
    <Layout>
      <p>Hello world!</p>
      <Button onClick={() => testConnection()}>Parse.js test</Button>
    </Layout>
  );
}

Tunggu hingga server pengembangan Berikutnya melakukan kompilasi ulang dan kunjungi http://localhost:3000. Kemudian buka konsol dan klik tombol “Parse.js test”. Anda akan mendapatkan pesan “Koneksi berhasil” jika semuanya berjalan dengan baik.

Otentikasi

Seperti yang disebutkan di bagian “Apa itu Back4app?”, Back4app memiliki sistem otentikasi bawaan. Menyiapkan autentikasi pengguna semudah memanggil beberapa metode. Bahkan penyimpanan sesi secara otomatis ditangani untuk Anda melalui Parse SDK.

Mari kita kerjakan formulir autentikasi pengguna.

Mulailah dengan membuat halaman baru bernama signup.js dan letakkan kode berikut di dalamnya:

// pages/signup.js

import NextLink from "next/link";
import {useState} from "react";
import {Button, Card, CardBody, CardFooter, CardHeader, FormControl, 
    FormLabel, Heading, HStack, Input, Link, Text, VStack,
} from "@chakra-ui/react";
import {FaUserPlus} from "react-icons/fa";
import Layout from "@/components/layout";

export default function SignUp() {

  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const onSubmit = async (event) => {
    // implement logic
  };

  return (
    <Layout>
      <Card>
        <CardHeader>
          <HStack>
            <FaUserPlus/>
            <Heading as="h2" size="md"> Sign up</Heading>
          </HStack>
        </CardHeader>
        <CardBody py={0}>
          <VStack spacing="1em" alignItems="left">
            <FormControl>
              <FormLabel>Username</FormLabel>
              <Input
                placeholder="Username"
                value={username}
                onChange={(e) => setUsername(e.target.value)}
              />
            </FormControl>
            <FormControl>
              <FormLabel>Password</FormLabel>
              <Input
                type="password"
                placeholder="Password"
                value={password}
                onChange={(e) => setPassword(e.target.value)}
              />
            </FormControl>
          </VStack>
        </CardBody>
        <CardFooter 
            w="full" 
            display="flex" 
            alignItems="center" 
            justifyContent="space-between"
        >
          <Text>
            Already have an account?{" "}
            <Link as={NextLink} href="/login">
              Log in
            </Link>
          </Text>
          <Button colorScheme="teal" onClick={onSubmit}>Sign up</Button>
        </CardFooter>
      </Card>
    </Layout>
  );
}

Kode ini membuat halaman baru di /signup dan merender formulir pendaftaran. Untuk membuat akun, pengguna harus memasukkan nama pengguna dan kata sandi.

Kemudian modifikasi pages/signup.js untuk menyertakan logika:

// pages/signup.js

// ...

import {useRouter} from "next/router";
import {useContext, useEffect} from "react";
import ParseContext from "@/context/parseContext";

export default function SignUp() {

  const router = useRouter();
  const parse = useContext(ParseContext);

  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  // redirect the user if already logged in
  useEffect(() => {
    (async () => {
      if (parse.User.current() !== null) {
        await router.push("/");
      }
    })();
  }, [router, parse.User]);

  const onSubmit = async (event) => {
    event.preventDefault();

    if (!username || !password) {
      console.error("Please fill out all the fields.");
      return;
    }

    try {
      await parse.User.signUp(username, password).then(() => {
        router.push("/");
        console.log("Successfully signed up.");
      });
    } catch (error) {
      console.error(error.message);
    }
  };

  return (
    // ...
  );
}
  1. Jika pengguna sudah masuk, mereka sekarang akan dialihkan ke / melalui hook useRouter() milik Next.
  2. Kami memodifikasi onSubmit() untuk memanggil User.signUp(), membuat sesi pengguna dan menyimpan cookie di peramban pengguna.

Lakukan hal yang sama untuk berkas pages/login.js. Ambil kode sumber dari repositori GitHub.

Bagus, sistem autentikasi sekarang kurang lebih sudah selesai. Hal terakhir yang akan kita lakukan adalah sedikit memodifikasi header.js untuk menampilkan pengguna yang sudah login atau tautan login/pendaftaran jika tidak terautentikasi.

Modifikasi komponen/header.js seperti ini:

// components/header.js

import NextLink from "next/link";
import {Avatar, Box, Container, Divider, Heading, HStack, Link} from "@chakra-ui/react";
import {useContext, useEffect, useState} from "react";
import ParseContext from "@/context/parseContext";

export default function Header() {

  const parse = useContext(ParseContext);
  const [user, setUser] = useState(null);

  useEffect(() => {
    setUser(parse.User.current());
  }, [parse.User]);

  return (
    <Box py={4}>
      <Container 
        maxW="container.lg" 
        display="flex" 
        alignItems="center" 
        justifyContent="space-between"
      >
        <Heading as="h1" size="md">
          <Link as={NextLink} href="/">
            back4app-social-network
          </Link>
        </Heading>
        {user != null ? (
          <HStack>
            <Avatar 
              size="sm" 
              name={user.attributes.username} 
              src={user.attributes.avatarUrl}
            />
            <Heading size="sm">
              <Link as={NextLink} href="/settings">
                {user.attributes.username}
              </Link>
            </Heading>
          </HStack>
        ) : (
          <HStack spacing="1em">
            <Heading size="sm">
              <Link as={NextLink} href="/login">
                Log in
              </Link>
            </Heading>
            <Heading size="sm">
              <Link as={NextLink} href="/signup">
                Sign up
              </Link>
            </Heading>
          </HStack>
        )}
      </Container>
      <Divider my={4}/>
    </Box>
  );
}

Tunggu sampai server pengembangan Berikutnya mengkompilasi ulang dan menguji sistem autentikasi. Coba buat akun dan periksa apakah tajuk berubah.

Kami belum memiliki fungsionalitas logout, jadi Anda harus menghapus cookie secara manual jika ingin keluar.

Header Dinamis Jaringan Sosial Back4app

Setelah Anda membuat pengguna, Anda dapat menavigasi ke tampilan basis data Back4app Anda dan memeriksa baris kelas Pengguna. Anda akan melihat bahwa pengguna baru telah ditambahkan.

Pengguna Baru Basis Data Back4app

Pengaturan Pengguna

Mari kita buat bidang deskripsi dan avatarUrl yang telah kita tambahkan ke kelas User dapat diedit.

Buat file baru bernama settings.js di direktori halaman:

// pages/settings.js

import React, {useContext, useEffect, useState} from "react";
import {useRouter} from "next/router";
import {Button, Card, CardBody, CardFooter, CardHeader, FormControl, FormLabel,
  Heading, HStack, Input, VStack} from "@chakra-ui/react";
import {FaCog} from "react-icons/fa";
import ParseContext from "@/context/parseContext";
import Layout from "@/components/layout";

export default function Settings() {

  const router = useRouter();
  const parse = useContext(ParseContext);

  const [description, setDescription] = useState("");
  const [avatarUrl, setAvatarUrl] = useState("");

  useEffect(() => {
    (async () => {
      const user = parse.User.current();

      // redirect the user if not logged in
      if (user === null) {
        await router.push("/");
        return;
      }

      // load data from the database
      setDescription(await user.get("description"));
      setAvatarUrl(await user.get("avatarUrl"));
    })();
  }, [router, parse.User]);

  const onSave = async () => {
    const user = parse.User.current();
    user.set("description", description);
    user.set("avatarUrl", avatarUrl);
    await user.save();

    console.log("Successfully saved settings.");
  };

  const onLogout = async () => {
    await parse.User.logOut();
    await router.push("/");

    console.log("Successfully logged out.");
  };

  return (
    <Layout>
      <Card>
        <CardHeader>
          <HStack>
            <FaCog/>
            <Heading as="h2" size="md"> Settings</Heading>
          </HStack>
        </CardHeader>
        <CardBody py={0}>
          <VStack spacing="1em">
            <FormControl>
              <FormLabel>Description</FormLabel>
              <Input
                placeholder="Description"
                value={description}
                onChange={e => setDescription(e.target.value)}
              />
            </FormControl>
            <FormControl>
              <FormLabel>Avatar URL</FormLabel>
              <Input
                placeholder="Avatar URL"
                value={avatarUrl}
                onChange={e => setAvatarUrl(e.target.value)}
              />
            </FormControl>
          </VStack>
        </CardBody>
        <CardFooter display="flex" justifyContent="right">
          <HStack>
            <Button colorScheme="red" onClick={onLogout}>Log out</Button>
            <Button colorScheme="teal" onClick={onSave}>Save</Button>
          </HStack>
        </CardFooter>
      </Card>
    </Layout>
  );
}
  1. Kami menggunakan hook useEffect() milik React untuk mengarahkan pengguna jika mereka tidak terautentikasi. Selain itu, hook tersebut mengambil deskripsi pengguna dan avatarUrl.
  2. Kami mengimplementasikan metode onSave(), yang memperbarui informasi pengguna dengan data status.
  3. Kami mengimplementasikan metode onLogout() yang memanggil logOut() Parse. LogOut() Parse akan menghapus sesi dari basis data dan menghapus cookie dari peramban pengguna.

Posting

Hal terakhir yang harus kita lakukan sebelum jejaring sosial sederhana kita selesai adalah mengimplementasikan postingan. Kita sudah membuat kelas database. Sekarang yang harus kita lakukan adalah membuat formulir untuk membuatnya dan mengambilnya dari database.

Pertama, tambahkan komponen baru bernama post.js:

// components/post.js

import {Avatar, Box, Card, CardBody, CardHeader, Heading, HStack, Text} from "@chakra-ui/react";

export default function Post(props) {
  return (
    <Card mt={2}>
      <CardHeader pb={0}>
        <HStack spacing="1em">
          <Avatar name={props.author.username} src={props.author.avatarUrl}/>
          <Box>
            <Heading size="sm">{props.author.username}</Heading>
            <Text>{props.author.description}</Text>
          </Box>
        </HStack>
      </CardHeader>
      <CardBody>
        <Text>{props.content}</Text>
      </CardBody>
    </Card>
  );
}

Kemudian modifikasi index.js Anda seperti ini:

// pages/index.js

import {useContext, useEffect, useState} from "react";
import {Alert, AlertIcon, Button, Card, CardBody, CardFooter,
  CardHeader, Heading, HStack, Textarea} from "@chakra-ui/react";
import {FaPlus} from "react-icons/fa";
import ParseContext from "@/context/parseContext";
import Layout from "@/components/layout";
import Post from "@/components/post";

export default function Home() {

  const parse = useContext(ParseContext);

  const [user, setUser] = useState(null);
  const [postContent, setPostContent] = useState("");
  const [posts, setPosts] = useState([]);

  const onCreatePost = async () => {
      // implement logic
  };

  return (
    <Layout>
      {user ? (
        <Card mb={2}>
          <CardHeader>
            <HStack>
              <FaPlus/>
              <Heading as="h2" size="md"> Create post</Heading>
            </HStack>
          </CardHeader>
          <CardBody py={0}>
            <Textarea
              placeholder="What's on your mind?"
              value={postContent}
              onChange={(event) => setPostContent(event.target.value)}
            />
          </CardBody>
          <CardFooter display="flex" justifyContent="right">
            <Button colorScheme="teal" onClick={onCreatePost}>Post</Button>
          </CardFooter>
        </Card>
      ) : (
        <Alert status="warning" mb={2}>
          <AlertIcon/>
          You need to log in to create posts.
        </Alert>
      )}
      {posts.map(post => (
        <Post
          key={post.id}
          content={post.attributes.content}
          author={{...post.attributes.author.attributes}}
        />
      ))}
    </Layout>
  );
}

Kemudian implementasikan onCreatePost() seperti ini:

const onCreatePost = async () => {
  if (!user == null) return;

  const post = new parse.Object("Post");
  post.set("content", postContent);
  post.set("author", user);
  await post.save();

  setPostContent("");
  setPosts([post, ...posts]);
};

Terakhir, tambahkan hook useEffect() untuk mengambil postingan:

useEffect(() => {
  setUser(parse.User.current());

  (async () => {
    const posts = await new parse.Query("Post")
      .include("author").descending("createdAt").find();
    setPosts(posts);
  })();
}, []);

Untuk mempelajari lebih lanjut tentang Parse Objek dan Query, lihat dokumentasi resmi Parse.

Mulai server pengembangan Berikutnya sekali lagi:

$ next start

Buat beberapa contoh postingan dan refresh halaman. Jika semuanya berjalan dengan baik, postingan akan disimpan ke database dan diambil ketika Anda mengunjungi halaman tersebut.

Posting Basis Data Back4app

Kesimpulan

Pada artikel ini, kami telah berhasil membuat aplikasi media sosial sederhana. Aplikasi ini memungkinkan pengguna untuk mendaftar, mengautentikasi diri mereka sendiri, mengedit profil mereka, dan membuat postingan.

Sekarang, Anda seharusnya sudah memiliki pemahaman yang cukup baik tentang cara kerja Back4app dan bagaimana mulai membangun jaringan sosial Anda.

Proyek yang telah kita bangun dalam artikel ini dapat menjadi fondasi yang kuat untuk pengembangan lebih lanjut. Uji pengetahuan Anda dengan mengimplementasikan fitur-fitur baru, misalnya fungsionalitas suka/tidak suka, fungsionalitas berbagi, dan komentar.

Kode sumber tersedia di repositori GitHub back4app-social-network.

Langkah-langkah ke depan

  1. Ikuti artikel ini untuk menggunakan frontend Next.js Anda ke Back4app Containers.
  2. Lihatlah Cloud Code Functions untuk menambahkan fungsi lanjutan ke backend Anda.
  3. Terapkan verifikasi email pengguna saat mendaftar untuk memerangi bot.

Leave a reply

Your email address will not be published.