Commit b8816616 authored by dasunx's avatar dasunx

new user interfaces configured

parent 0a8c44ae
.vercel .vercel
node_modules node_modules
.next .next
\ No newline at end of file .vscode
\ No newline at end of file
...@@ -32,4 +32,12 @@ ...@@ -32,4 +32,12 @@
margin: 2rem 1rem 2rem 1rem; margin: 2rem 1rem 2rem 1rem;
padding: 1em 1em; padding: 1em 1em;
box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px; box-shadow: rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;
max-width: 90vw;
}
@media (max-width: 768px) {
.wrapper {
margin: 0 !important;
max-width: 97vw;
}
} }
...@@ -28,7 +28,6 @@ const AutomatedAnswerContainer = ({ question_id }) => { ...@@ -28,7 +28,6 @@ const AutomatedAnswerContainer = ({ question_id }) => {
try { try {
const response = await publicFetch.get(`automatedanswer/${question_id}`) const response = await publicFetch.get(`automatedanswer/${question_id}`)
if (response.status == 200) { if (response.status == 200) {
console.log('RESPONSE IS HERE AND IT IS')
const { isLoading, isComplete } = response.data.automatedanswer const { isLoading, isComplete } = response.data.automatedanswer
if (isLoading && !isComplete) { if (isLoading && !isComplete) {
setIsAnswertGenerating(true) setIsAnswertGenerating(true)
...@@ -47,8 +46,6 @@ const AutomatedAnswerContainer = ({ question_id }) => { ...@@ -47,8 +46,6 @@ const AutomatedAnswerContainer = ({ question_id }) => {
} }
useInterval(async () => { useInterval(async () => {
console.log('Checking')
await fetchAutomatedAnswer() await fetchAutomatedAnswer()
}, polled) }, polled)
......
import React from 'react' import React from 'react'
import BlogsWrapper from '../blogs-wrapper/BlogsWrapper' import BlogsWrapper from '../blogs-wrapper/BlogsWrapper'
import ExternalResourcesWrapper from '../external-resources/ExternalResourcesWrapper'
import StackOverflowAnswer from '../stof-answer' import StackOverflowAnswer from '../stof-answer'
import YoutubeVideoWrapper from '../youtube-videos/YoutubeVideoWrapper' import YoutubeVideoWrapper from '../youtube-videos/YoutubeVideoWrapper'
const AutomatedAnswer = ({ automatedAnswer }) => { const AutomatedAnswer = ({ automatedAnswer }) => {
console.log(automatedAnswer)
return ( return (
<> <>
{automatedAnswer.stackoverflow != null ? ( {automatedAnswer.stackoverflow != null ? (
...@@ -20,17 +20,19 @@ const AutomatedAnswer = ({ automatedAnswer }) => { ...@@ -20,17 +20,19 @@ const AutomatedAnswer = ({ automatedAnswer }) => {
<h1>No youtubes found for this question</h1> <h1>No youtubes found for this question</h1>
)} )}
<BlogsWrapper
source="Dev.to"
articles={automatedAnswer.dev_articles}
resources={automatedAnswer.dev_resources}
/>
<BlogsWrapper <BlogsWrapper
source="Medium" source="Medium"
articles={automatedAnswer.medium_articles} articles={automatedAnswer.medium_articles}
resources={automatedAnswer.medium_resources} resources={automatedAnswer.medium_resources}
/> />
<BlogsWrapper <ExternalResourcesWrapper automated_answer={automatedAnswer} />
source="Dev.to"
articles={automatedAnswer.dev_articles}
resources={automatedAnswer.dev_resources}
/>
</> </>
) )
} }
......
...@@ -18,7 +18,6 @@ const NoAutomatedAnswer = ({ ...@@ -18,7 +18,6 @@ const NoAutomatedAnswer = ({
const requestAutomatedAnswer = async () => { const requestAutomatedAnswer = async () => {
try { try {
const response = await authAxios.post('automatedanswer', req_body) const response = await authAxios.post('automatedanswer', req_body)
console.log(response)
if (response.status == 201) { if (response.status == 201) {
setIsAnswerGenerating(true) setIsAnswerGenerating(true)
bindIsGenerating(true) bindIsGenerating(true)
......
...@@ -5,7 +5,6 @@ import Prism from 'prismjs' ...@@ -5,7 +5,6 @@ import Prism from 'prismjs'
const BlogArticle = ({ article, source }) => { const BlogArticle = ({ article, source }) => {
useEffect(() => { useEffect(() => {
console.log(source)
if (source === 'Medium') { if (source === 'Medium') {
var childs = document.getElementById('description').children var childs = document.getElementById('description').children
var i = 0 var i = 0
......
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
pre { pre {
padding: 20px; padding: 20px;
background-color: var(black); background-color: var(black);
font-size: 16px;
font-family: 'Roboto Mono', monospace !important; font-family: 'Roboto Mono', monospace !important;
max-width: 780px; max-width: 780px;
} }
......
import React from 'react'
import styles from './ExternalResources.module.css'
const ExternalResources = ({ source, links }) => {
return (
<div className={styles.external_resources_container}>
<div className={styles.external_resources_header}>
<h3 className={styles.external_resource_header_title}>{source}</h3>
</div>
<ul className={styles.external_resources_links}>
{links.map((link, index) => {
return (
<li className={styles.external_resources_item} key={index}>
<a
href={link}
target="_blank"
rel="noopener noreferrer"
className={styles.external_resources_link}
>
{decodeURIComponent(link.slice(0, 100))}
</a>
</li>
)
})}
</ul>
</div>
)
}
export default ExternalResources
.external_resources_title {
font-size: 1.7em;
font-weight: bold;
margin-bottom: 10px;
}
.external_resources_wrapper {
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
margin: 3em 0;
}
/* set columns to one in mobile and tablet screens using media query */
@media (max-width: 768px) {
.external_resources_links {
columns: 1 !important;
-webkit-columns: 1 !important;
-moz-columns: 1 !important;
}
}
.external_resources_container {
max-width: 100%;
margin-bottom: 1em;
background: #2d2d2d;
border-radius: 10px;
padding: 10px 10px;
}
.external_resource_header_title {
font-size: 1.5em;
font-weight: bold;
margin-bottom: 10px;
text-transform: capitalize;
}
.external_resources_links {
columns: 2;
-webkit-columns: 2;
-moz-columns: 2;
}
.external_resources_item {
background: #0c0d0e;
color: white;
border-radius: 5px;
padding: 5px;
min-height: 4em;
margin-bottom: 5px;
overflow-wrap: break-word;
}
import React from 'react'
import ExternalResources from './ExternalResources'
import styles from './ExternalResources.module.css'
const ExternalResourcesWrapper = ({ automated_answer }) => {
const current_sources = ['medium', 'dev', 'github']
const getResourcesFromSource = (source) => {
switch (source) {
case 'medium':
return automated_answer.medium_resources || []
case 'dev':
return automated_answer.dev_resources || []
case 'github':
return automated_answer.github_links || []
default:
return []
}
}
return (
<div className={styles.external_resources_wrapper}>
<div className={styles.external_resources_title_container}>
<h3 className={styles.external_resources_title}>External Resources</h3>
</div>
{current_sources.map((source, index) => {
let links = getResourcesFromSource(source)
if (links.length > 0) {
return <ExternalResources key={index} source={source} links={links} />
}
})}
</div>
)
}
export default ExternalResourcesWrapper
...@@ -4,7 +4,11 @@ import ShowHide from '../show-hide/ShowHide' ...@@ -4,7 +4,11 @@ import ShowHide from '../show-hide/ShowHide'
const ResourcePreview = ({ articles, source, show, setShow }) => { const ResourcePreview = ({ articles, source, show, setShow }) => {
const [thumbnail, setThumbnail] = useState('') const [thumbnail, setThumbnail] = useState('')
const getThumbnail = () => { const getThumbnail = () => {
let thumbnails_list = [
'https://www.mtu.edu/cs/images/trees-dark-blue-icons-6x6-card1200.jpg'
]
articles.forEach((element) => { articles.forEach((element) => {
if ( if (
!( !(
...@@ -15,18 +19,41 @@ const ResourcePreview = ({ articles, source, show, setShow }) => { ...@@ -15,18 +19,41 @@ const ResourcePreview = ({ articles, source, show, setShow }) => {
!element.thumbnail !element.thumbnail
) )
) { ) {
setThumbnail(element.thumbnail) thumbnails_list.push(element.thumbnail)
return // setThumbnail(element.thumbnail)
// return
} else {
console.log('IM NULL')
console.log(element.thumbnail)
} }
}) })
if (thumbnails_list.length >= 2) {
thumbnails_list.shift()
}
return thumbnails_list
}
const setThumbnailFromList = (thumbnails) => {
setThumbnail(thumbnails[Math.floor(Math.random() * thumbnails.length)])
} }
useEffect(() => { useEffect(() => {
getThumbnail() let list = getThumbnail()
if (list.length > 1) {
let thumbnail_interval = setInterval(() => {
setThumbnailFromList(list)
}, 5000)
return () => {
clearInterval(thumbnail_interval)
}
} else {
setThumbnail(list[0])
}
}, []) }, [])
const onError = (e) => { const onError = (e) => {
console.log('ON ERROR') console.log('ON ERROR')
console.log(thumbnail)
e.target.src = e.target.src =
'https://www.mtu.edu/cs/images/trees-dark-blue-icons-6x6-card1200.jpg' 'https://www.mtu.edu/cs/images/trees-dark-blue-icons-6x6-card1200.jpg'
} }
......
import React from 'react' import React, { useContext, useState } from 'react'
import { AuthContext } from '../../store/auth'
import Button from '../button'
import { TelegramLogo, CopyIcon } from '../icons' import { TelegramLogo, CopyIcon } from '../icons'
import Styles from './TelegramBot.module.css' import Styles from './TelegramBot.module.css'
const TelegramBot = () => { const TelegramBot = () => {
const [isCopiedTag, setIsCopiedTag] = React.useState({ const [isCopiedTag, setIsCopiedTag] = useState({
isCopied: false, isCopied: false,
isError: false, isError: false,
message: '' message: ''
}) })
const { isAuthenticated, authState } = useContext(AuthContext)
const isAuth = isAuthenticated()
const { isCopied, isError, message } = isCopiedTag const { isCopied, isError, message } = isCopiedTag
const { isTelegramConnected } = isAuth ? authState.userInfo : ''
const onClick = () => { const onClick = () => {
navigator.clipboard.writeText('probexpertbot').then( navigator.clipboard.writeText('probexpertbot').then(
() => { () => {
...@@ -36,16 +40,31 @@ const TelegramBot = () => { ...@@ -36,16 +40,31 @@ const TelegramBot = () => {
<a href="https://t.me/probexpertbot" target="_blank"> <a href="https://t.me/probexpertbot" target="_blank">
<TelegramLogo className={Styles.telegram_bot_logo} /> <TelegramLogo className={Styles.telegram_bot_logo} />
</a> </a>
<div className={Styles.telegram_bot_tag}> {isAuth ? (
<span>@probexpertbot</span>{' '} !isTelegramConnected ? (
<CopyIcon className={Styles.telegram_bot_tag_icon} onClick={onClick} /> <Button href="/telegram/connect" primary full>
</div> Connect Telegram with ProbExpert
{isCopied ? ( </Button>
<div className={Styles.telegram_bot_tag_copied}>{message}</div> ) : (
) : ( <>
isError && ( <div className={Styles.telegram_bot_tag}>
<div className={Styles.telegram_bot_tag_error}>{message}</div> <span>@probexpertbot</span>{' '}
<CopyIcon
className={Styles.telegram_bot_tag_icon}
onClick={onClick}
/>
</div>
{isCopied ? (
<div className={Styles.telegram_bot_tag_copied}>{message}</div>
) : (
isError && (
<div className={Styles.telegram_bot_tag_error}>{message}</div>
)
)}
</>
) )
) : (
<div>Sign in to use the telegram bot</div>
)} )}
</div> </div>
) )
......
import React, { useEffect, useState } from 'react' import React, { useContext, useEffect, useState } from 'react'
import Link from 'next/link' import Link from 'next/link'
import formatDistanceToNowStrict from 'date-fns/formatDistanceToNowStrict' import formatDistanceToNowStrict from 'date-fns/formatDistanceToNowStrict'
import { AuthContext } from '../../../store/auth'
import { publicFetch } from '../../../util/fetcher' import { publicFetch } from '../../../util/fetcher'
import { Spinner } from '../../icons' import { Spinner } from '../../icons'
import styles from './avatar-card.module.css' import styles from './avatar-card.module.css'
import TelegramStatus from '../../telegram/telegram-status/TelegramStatus'
const UserAvatar = ({ username }) => { const UserAvatar = ({ username }) => {
const [userInfo, setUserInfo] = useState(null) const [userInfo, setUserInfo] = useState(null)
const { authState } = useContext(AuthContext)
const me = authState.userInfo?.username
const isTelegramConnected = authState.userInfo?.isTelegramConnected
useEffect(() => { useEffect(() => {
const fetchUser = async () => { const fetchUser = async () => {
...@@ -56,6 +60,9 @@ const UserAvatar = ({ username }) => { ...@@ -56,6 +60,9 @@ const UserAvatar = ({ username }) => {
</p> </p>
</div> </div>
)} )}
{me === username && (
<TelegramStatus isTelegramConnected={isTelegramConnected} />
)}
</div> </div>
</div> </div>
) )
......
...@@ -22,8 +22,16 @@ const QuestionDetail = ({ questionId, title }) => { ...@@ -22,8 +22,16 @@ const QuestionDetail = ({ questionId, title }) => {
useEffect(() => { useEffect(() => {
const fetchQuestion = async () => { const fetchQuestion = async () => {
const { data } = await publicFetch.get(`/question/${questionId}`) try {
setQuestion(data) const response = await publicFetch.get(`/question/${questionId}`)
console.log(response)
setQuestion(response.data)
} catch (error) {
console.log(error.response)
if (error.response.status === 404) {
window.location.href = '/'
}
}
} }
fetchQuestion() fetchQuestion()
......
import React from 'react' import React from 'react'
import Head from 'next/head' import Head from 'next/head'
import Layout from '../../components/layout' import Layout from '../../components/layout'
import DetailPageContainer from '../../components/detail-page-container'
import PageTitle from '../../components/page-title' import PageTitle from '../../components/page-title'
import TelegramWrapper from '../../components/telegram/telegram-wrapper/TelegramWrapper' import TelegramWrapper from '../../components/telegram/telegram-wrapper/TelegramWrapper'
......
...@@ -96,3 +96,7 @@ a { ...@@ -96,3 +96,7 @@ a {
margin-top: 10px; margin-top: 10px;
text-align: center; text-align: center;
} }
.css-1qhb1kr-TimelineContentDetailsWrapper{
overflow-y: hidden !important;
overflow-x: hidden !important;
}
\ No newline at end of file
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
} }
:root { :root {
--base: #090909; --base: #090909;
--base-inverted: #fff; --base-inverted: #2d2d2d;
--base-100: var(--base); --base-100: var(--base);
--base-90: #242424; --base-90: #242424;
--base-80: #3d3d3d; --base-80: #3d3d3d;
...@@ -107,10 +107,10 @@ ...@@ -107,10 +107,10 @@
--body-color: var(--base-100); --body-color: var(--base-100);
--body-color-inverted: var(--base-inverted); --body-color-inverted: var(--base-inverted);
--card-bg: var(--base-inverted); --card-bg: var(--base-inverted);
--card-color: var(--base-100); --card-color: var(--base-0);
--card-color-secondary: var(--base-70); --card-color-secondary: var(--base-0);
--card-color-tertiary: var(--base-60); --card-color-tertiary: var(--base-0);
--card-secondary-bg: var(--base-0); --card-secondary-bg: var(--base-80);
--card-secondary-color: var(--base-90); --card-secondary-color: var(--base-90);
--card-headline-color: var(--base-100); --card-headline-color: var(--base-100);
--card-border: var(--base-a10); --card-border: var(--base-a10);
......
...@@ -2,7 +2,7 @@ import axios from 'axios' ...@@ -2,7 +2,7 @@ import axios from 'axios'
const baseURL = const baseURL =
process.env.NODE_ENV === 'development' process.env.NODE_ENV === 'development'
? 'http://localhost:5000/api' ? 'http://localhost:8080/api'
: `https://${process.env.SITE_NAME}/api` : `https://${process.env.SITE_NAME}/api`
const publicFetch = axios.create({ const publicFetch = axios.create({
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment