more frontend polishing changes

This commit is contained in:
Barunes Padhy 2024-04-29 09:14:17 +03:00
parent c7b202c90a
commit 6929af238e
15 changed files with 94 additions and 54 deletions

View File

@ -1,18 +0,0 @@
[
{
"id": "72e4d550-a19b-4b62-bf5a-13f98813d31a",
"name": "Blog 1",
"description": "A subtitle for Blog 1",
"coverImage": "blogs/72e4d550-a19b-4b62-bf5a-13f98813d31a/media/blog1.png",
"tagLine": "Read more",
"parentCategory": "520b7982-069e-4a48-9ef3-64507d86a579"
},
{
"id": "b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e",
"name": "Blog 2",
"description": "A subtitle for Blog 2",
"coverImage": "blogs/b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e/media/blog2.png",
"tagLine": "Read more",
"parentCategory": "520b7982-069e-4a48-9ef3-64507d86a579"
}
]

View File

@ -4,5 +4,21 @@
"coverImage": "category/520b7982-069e-4a48-9ef3-64507d86a579/media/technology.png", "coverImage": "category/520b7982-069e-4a48-9ef3-64507d86a579/media/technology.png",
"tagLine": "Read articles about tech", "tagLine": "Read articles about tech",
"description": "I have been working in tech for long, and here are my thoughts of random stuff", "description": "I have been working in tech for long, and here are my thoughts of random stuff",
"featuredBlog": "b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e" "featuredBlog": "b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e",
"blogMetadata": [{
"id": "72e4d550-a19b-4b62-bf5a-13f98813d31a",
"name": "Blog 1",
"description": "A subtitle for Blog 1",
"coverImage": "blogs/72e4d550-a19b-4b62-bf5a-13f98813d31a/media/blog1.png",
"tagLine": "Read more",
"parentCategory": "520b7982-069e-4a48-9ef3-64507d86a579"
},
{
"id": "b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e",
"name": "Blog 2",
"description": "A subtitle for Blog 2",
"coverImage": "blogs/b4d9e1a0-4a77-48eb-a04b-06ec23e2b73e/media/blog2.png",
"tagLine": "Read more",
"parentCategory": "520b7982-069e-4a48-9ef3-64507d86a579"
}]
} }

View File

@ -3,5 +3,7 @@
"name": "Gaming", "name": "Gaming",
"coverImage": "category/b9e0d686-351d-49af-8e3d-b62023f44dbe/media/game.png", "coverImage": "category/b9e0d686-351d-49af-8e3d-b62023f44dbe/media/game.png",
"tagLine": "Read articles about games", "tagLine": "Read articles about games",
"description": "I like to game, and here are my thoughts on games" "description": "I like to game, and here are my thoughts on games",
"blogMetadata": [{
}]
} }

View File

@ -0,0 +1,8 @@
a{
padding: 1em;
}
.blogContent{
margin-left:25% !important;
margin-right:25% !important;
}

View File

@ -4,15 +4,16 @@ import {useEffect, useState} from 'react';
import 'bootstrap/dist/css/bootstrap.min.css'; import 'bootstrap/dist/css/bootstrap.min.css';
//Import Views //Import Views
import Home from './components/views/home'; import Home from './components/home';
import CategoryList from './components/views/category-list'; import CategoryList from './components/category-list';
import BlogList from './components/views/blog-list'; import BlogList from './components/blog-list';
import Blog from './components/views/blog'; import Blog from './components/blog';
//Import Shared Views //Import Shared Views
import Header from './components/views/shared/navbar'; import Header from './components/shared/navbar';
import Footer from './components/views/shared/footer'; import Footer from './components/shared/footer';
import Notification from './components/shared/notification';
//Import Services //Import Services
import DataService from './services/data-service' import DataService from './services/data-service'
@ -21,6 +22,16 @@ function App() {
const [userData, setUserData] = useState(null); const [userData, setUserData] = useState(null);
const [themeConfig, setThemeConfig] = useState(null); const [themeConfig, setThemeConfig] = useState(null);
const [globalTheme, setGlobalTheme] = useState("lightTheme"); const [globalTheme, setGlobalTheme] = useState("lightTheme");
const [isOpen, setIsOpen] = useState(false);
const [notificationMessage, setNotificationMessage] = useState("")
const notificationToggler = (message) => {
setIsOpen(true)
setNotificationMessage(message)
setTimeout(() => {
setIsOpen(false)
}, 3500)
}
useEffect(() => { useEffect(() => {
DataService.getData('shared/user-data').then( response => DataService.getData('shared/user-data').then( response =>
@ -39,11 +50,12 @@ function App() {
<div> <div>
<Router> <Router>
<Header ThemeSwitcher={themeSwitcher} GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} /> <Header ThemeSwitcher={themeSwitcher} GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} />
<Notification isOpen={isOpen} notificationMessage={notificationMessage} />
<Routes> <Routes>
<Route path="/" element={<Home GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} />} /> <Route path="/" element={<Home GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} />} />
<Route path="/categories" element={<CategoryList GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} /> <Route path="/categories" element={<CategoryList notificationToggler={notificationToggler} GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} />
<Route path="/categories/:categoryID" element={<BlogList GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} /> <Route path="/categories/:categoryID" element={<BlogList notificationToggler={notificationToggler} GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} />
<Route path="/blog/:blogID" element={<Blog GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} /> <Route path="/blog/:blogID" element={<Blog notificationToggler={notificationToggler} GlobalTheme={globalTheme} ThemeConfig={themeConfig} />} />
</Routes> </Routes>
<Footer ThemeSwitcher={themeSwitcher} GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} /> <Footer ThemeSwitcher={themeSwitcher} GlobalTheme={globalTheme} ThemeConfig={themeConfig} UserData={userData} />
</Router> </Router>

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import DataService from '../../services/data-service'; import DataService from '../services/data-service';
import MediaService from '../../services/media-service'; import MediaService from '../services/media-service';
import CardListViewer from './shared/card-list-viewer'; import CardListViewer from './shared/card-list-viewer';
import CategoryBar from './shared/category-bar'; import CategoryBar from './shared/category-bar';
import { import {
@ -25,16 +25,11 @@ function BlogList(props) {
const GlobalTheme = props.GlobalTheme; const GlobalTheme = props.GlobalTheme;
const ThemeConfig = props.ThemeConfig; const ThemeConfig = props.ThemeConfig;
const [blogMetadata, setBlogMetadata] = useState('loading');
const [categoryData, setCategoryData] = useState('loading'); const [categoryData, setCategoryData] = useState('loading');
const [featuredBlogData, setFeaturedBlogData] = useState('loading'); const [featuredBlogData, setFeaturedBlogData] = useState('loading');
const [currentPage, setCurrentPage] = useState('loading'); const [currentPage, setCurrentPage] = useState('loading');
useEffect(() => { useEffect(() => {
DataService.getData(`category/${categoryID}/blog-metadata`).then(response =>{
setBlogMetadata(response.data)
}
);
DataService.getData(`category/${categoryID}/category-data`).then(response =>{ DataService.getData(`category/${categoryID}/category-data`).then(response =>{
setCategoryData(response.data); setCategoryData(response.data);
if (response.data.featuredBlog){ if (response.data.featuredBlog){
@ -80,11 +75,11 @@ function BlogList(props) {
/> />
} }
{ {
blogMetadata === 'loading' ? <Spinner /> : categoryData === 'loading' ? <Spinner /> :
blogMetadata.map((item, index) => ( categoryData.blogMetadata.map((item, index) => (
<CardListViewer <CardListViewer
key={item.id} key={item.id}
totalItems={blogMetadata.length} totalItems={categoryData.blogMetadata.length}
cardType={"smallCard"} cardType={"smallCard"}
resourceType={"blog"} resourceType={"blog"}
textColor={ThemeConfig[GlobalTheme].textColor} textColor={ThemeConfig[GlobalTheme].textColor}

View File

@ -1,6 +1,6 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import DataService from '../../services/data-service'; import DataService from '../services/data-service';
import MediaService from '../../services/media-service' import MediaService from '../services/media-service'
import CategoryBar from './shared/category-bar'; import CategoryBar from './shared/category-bar';
import { import {
Container,Row, Col,Spinner, UncontrolledCollapse, Button, ButtonGroup, Card, CardBody Container,Row, Col,Spinner, UncontrolledCollapse, Button, ButtonGroup, Card, CardBody
@ -35,7 +35,7 @@ function Blog(props) {
/> />
</Col> </Col>
</Row> </Row>
<Row className="mr-2 ml-2 mb-2 mt-1"> <Row className="mr-2 ml-2 mb-2 mt-1 blogContent">
<Col> <Col>
<h1 className={`${ThemeConfig[GlobalTheme].textColor}`}>{blogData.name}</h1> <h1 className={`${ThemeConfig[GlobalTheme].textColor}`}>{blogData.name}</h1>
<h4 className={`${ThemeConfig[GlobalTheme].textColor}`}>{blogData.description}</h4> <h4 className={`${ThemeConfig[GlobalTheme].textColor}`}>{blogData.description}</h4>
@ -55,6 +55,16 @@ function Blog(props) {
<ButtonGroup <ButtonGroup
className="my-2" className="my-2"
> >
<Button outline>
<Link to="#" onClick={(e) => {
e.preventDefault();
navigator.clipboard.writeText(window.location.href)
props.notificationToggler("Link copied")
return false;
}}>
Copy Link
</Link>
</Button>
<Button outline> <Button outline>
<Link to="#" onClick={(e) => { <Link to="#" onClick={(e) => {
e.preventDefault(); e.preventDefault();
@ -96,7 +106,7 @@ function Blog(props) {
</Col> </Col>
</Row> </Row>
<Row className="mr-5 ml-5 mt-1"> <Row className="mr-5 ml-5 mt-1 blogContent">
<Col> <Col>
<p style={{marginLeft: '50px', marginRight: '50px'}} className={`${ThemeConfig[GlobalTheme].textColor}`}> <p style={{marginLeft: '50px', marginRight: '50px'}} className={`${ThemeConfig[GlobalTheme].textColor}`}>
{blogData.contentBody} {blogData.contentBody}

View File

@ -1,7 +1,7 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
//import services //import services
import DataService from '../../services/data-service'; import DataService from '../services/data-service';
//import views //import views
import CardListViewer from './shared/card-list-viewer'; import CardListViewer from './shared/card-list-viewer';

View File

@ -1,5 +1,5 @@
import { Container, Spinner } from 'reactstrap'; import { Container, Spinner } from 'reactstrap';
import MediaService from '../../services/media-service' import MediaService from '../services/media-service'
function HomePage(props) { function HomePage(props) {
const UserData = props.UserData ? props.UserData : <Spinner> Loading... </Spinner> const UserData = props.UserData ? props.UserData : <Spinner> Loading... </Spinner>

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import MediaService from '../../../services/media-service' import MediaService from '../../services/media-service'
import { import {
Spinner, Spinner,
Card, Card,

View File

@ -1,5 +1,5 @@
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import DataService from '../../../services/data-service'; import DataService from '../../services/data-service';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { Container, Row, Col, Button, Spinner, ListGroup, ListGroupItem, ButtonGroup } from 'reactstrap'; import { Container, Row, Col, Button, Spinner, ListGroup, ListGroupItem, ButtonGroup } from 'reactstrap';

View File

@ -13,7 +13,7 @@ import {
Button, ButtonGroup, Label, Input Button, ButtonGroup, Label, Input
} from 'reactstrap'; } from 'reactstrap';
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import MediaService from '../../../services/media-service' import MediaService from '../../services/media-service'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faSun, faMoon, faPen } from '@fortawesome/free-solid-svg-icons'; import { faSun, faMoon, faPen } from '@fortawesome/free-solid-svg-icons';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';

View File

@ -0,0 +1,18 @@
import React, { useState } from 'react';
import { Collapse, Button, CardBody, Card, Alert } from 'reactstrap';
function Notification(props) {
return (
<React.StrictMode>
<Collapse isOpen={props.isOpen} {...props}>
<Card>
<CardBody>
<Alert>{props.notificationMessage}</Alert>
</CardBody>
</Card>
</Collapse>
</React.StrictMode>
);
}
export default Notification;