Skip to content

Commit 2023cbd

Browse files
committedJul 9, 2024
added Api components at frontend side
1 parent a1ad8ab commit 2023cbd

File tree

7 files changed

+127
-13
lines changed

7 files changed

+127
-13
lines changed
 

‎frontend/package-lock.json

+29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎frontend/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"@testing-library/jest-dom": "^5.17.0",
1010
"@testing-library/react": "^13.4.0",
1111
"@testing-library/user-event": "^13.5.0",
12+
"axios": "^1.7.2",
1213
"file-saver": "^2.0.5",
1314
"react": "^18.3.1",
1415
"react-dom": "^18.3.1",

‎frontend/src/api/index.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import axios from "axios";
2+
3+
const API = axios.create({
4+
baseURL: "http://localhost:8080/api/v1",
5+
})
6+
7+
export const GetPosts = async () => await API.get("/post/");
8+
export const CreatePost = async () => await API.post("/post/", data);
9+
export const GenerateImage = async () => await API.post("/generateImage/", data);

‎frontend/src/components/GenerateImageForm.js

+28-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import styled from "styled-components";
22
import Button from "./Button";
33
import TextInput from "./TextInput";
44
import { AutoAwesome, CreateRounded } from "@mui/icons-material";
5+
import { GenerateImage } from "../api";
6+
import { useState } from "react";
7+
import { createPost } from "../../../server/controllers/Posts.controller";
8+
import {useNavigate} from 'react-router-dom';
9+
510

611
const Form = styled.div`
712
flex: 1;
@@ -50,11 +55,31 @@ function GenerateImageForm({
5055
setCreatePostLoading,
5156
}) {
5257

53-
const generateImageFun = () => {
58+
const navigate = useNavigate();
59+
const [error, setError] = useState("");
60+
61+
const generateImageFun = async () => {
5462
setGenerateImageLoading(true);
63+
await GenerateImage({prompt: post.prompt})
64+
.then((res) => {
65+
setPost({...post, photo:`data:image/jpeg;base64,${res?.data?.photo}`})
66+
setGenerateImageLoading(false)
67+
}).catch((error)=> {
68+
setError(error?.response?.data?.message);
69+
console.log(error);
70+
})
5571
}
56-
const createPostFun = () => {
72+
const createPostFun = async () => {
5773
setCreatePostLoading(true);
74+
await createPost(post)
75+
.then((res) => {
76+
setPost({...post, photo:`data:image/jpeg;base64,${res?.data?.photo}`})
77+
setCreatePostLoading(false);
78+
}).catch((error)=> {
79+
setError(error?.response?.data?.message);
80+
setCreatePostLoading(false);
81+
navigate("/")
82+
})
5883
}
5984

6085
return (
@@ -82,6 +107,7 @@ function GenerateImageForm({
82107
value={post.prompt}
83108
handelChange={(e) => setPost({...post, prompt:e.target.value})}
84109
></TextInput>
110+
{error && <div style={{color:"red"}}>{error}</div>}
85111
** You can post the AI Generated Image to the Community **
86112
</Body>
87113
<Action>

‎frontend/src/components/ImageCard.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ function ImageCard({item}) {
7979
justifyContent:"space-between",
8080
}}>
8181
<Author>
82-
<Avatar sx={{width:"32px", height:"32px"}}>{item?.author[0]}</Avatar>
82+
<Avatar sx={{width:"32px", height:"32px"}}>{item?.name[0]}</Avatar>
8383
{item?.author}
8484
</Author>
8585
<DownloadRounded onClick={()=>saveAs(item?.photo,"download.jpg")} ></DownloadRounded>

‎frontend/src/components/SearchBar.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ align-items:center;
1717
`;
1818

1919

20-
function SearchBar() {
20+
function SearchBar({search, setSearch}) {
2121
return (
2222
<SearchBarContainer>
2323
<SearchOutlined></SearchOutlined>
@@ -28,7 +28,11 @@ function SearchBar() {
2828
color:'inherit',
2929
background:"transparent",
3030
fontSize:"16px",
31-
}} />
31+
}}
32+
value={search}
33+
onChange={(e) => setSearch(e.target.value)}
34+
/>
35+
3236
</SearchBarContainer>
3337
)
3438
}

‎frontend/src/pages/Home.js

+53-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import React from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import styled from 'styled-components';
33
import ImageCard from '../components/ImageCard';
44
import SearchBar from '../components/SearchBar';
5+
import { CircularProgress } from '@mui/material';
6+
import { GetPosts } from '../api';
57

68
const Container = styled.div`
79
height:100%;
@@ -68,6 +70,49 @@ gap:20px;
6870

6971
function Home() {
7072

73+
const [posts, setPosts] = useState([]);
74+
const [loading, setLoading] = useState(false);
75+
const [error, setError] = useState("");
76+
const [search, setSearch] = useState("");
77+
const [filteredPosts, setFilteredPosts] = useState([]);
78+
79+
80+
const getPosts = async () => {
81+
setLoading(true);
82+
await GetPosts()
83+
.then((res) => {
84+
setLoading(false);
85+
setPosts(res?.data?.data);
86+
setFilteredPosts(res?.data?.data)
87+
})
88+
.catch((error) => {
89+
setError(error?.response?.data?.message);
90+
setLoading(false);
91+
92+
})
93+
}
94+
95+
useEffect(() => {
96+
getPosts();
97+
},[])
98+
99+
useEffect(() => {
100+
if(!search){
101+
setFilteredPosts(posts);
102+
}
103+
104+
const SearchFilteredPosts = posts.filter((post) => {
105+
const promptMatch = post?.prompt?.toLowerCase().includes(search.toString().toLowerCase());
106+
const authorMatch = post?.name?.toLowerCase().includes(search.toString().toLowerCase());
107+
108+
return promptMatch || authorMatch;
109+
});
110+
111+
if(search){
112+
setFilteredPosts(SearchFilteredPosts);
113+
}
114+
}, [posts, search])
115+
71116
const item = {
72117
photo: "https://images.pexels.com/photos/26409497/pexels-photo-26409497/free-photo-of-a-small-white-house-sits-in-the-middle-of-a-field.jpeg?auto=compress&cs=tinysrgb&w=400&lazy=load",
73118
author: "Sanjay Rai",
@@ -81,14 +126,14 @@ function Home() {
81126
<Headline>Explore posts in the Community!
82127
<Span> » Generated with AI « </Span>
83128
</Headline>
84-
<SearchBar></SearchBar>
129+
<SearchBar search={search} setSearch={setSearch}></SearchBar>
85130
<Wrapper>
86-
<CardWrapper>
87-
<ImageCard item={item}></ImageCard>
88-
<ImageCard></ImageCard>
89-
<ImageCard></ImageCard>
90-
<ImageCard></ImageCard>
91-
</CardWrapper>
131+
{error && <div style = {{color : "red"}}>{error}</div>}
132+
{loading ? (<CircularProgress></CircularProgress>) : (
133+
<CardWrapper>
134+
{filteredPosts.length === 0 ? <> No Posts Found </> : <>{filteredPosts.slice().reverse().map((item, index) => <ImageCard key = {index} item = {item}></ImageCard>)}</>}
135+
</CardWrapper>
136+
)}
92137
</Wrapper>
93138
</Container>
94139
)

0 commit comments

Comments
 (0)
Please sign in to comment.