Skip to content

Commit cc55296

Browse files
authored
Merge pull request #105 from AOSSIE-Org/store-and-send_node
`store_and_send` Node: Embedding & Pinecone Storage + Frontend Sync
2 parents 8d48e5b + e595a45 commit cc55296

20 files changed

Lines changed: 1200 additions & 109 deletions

File tree

frontend/app/analyze/loading/page.tsx

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Card } from "@/components/ui/card"
66
import { Badge } from "@/components/ui/badge"
77
import { Globe, Brain, Shield, CheckCircle, Database, Sparkles, Zap } from "lucide-react"
88
import ThemeToggle from "@/components/theme-toggle"
9+
import axios from "axios"
910

1011
/**
1112
* Displays a multi-step animated loading and progress interface for the article analysis workflow.
@@ -54,47 +55,64 @@ export default function LoadingPage() {
5455
]
5556

5657
useEffect(() => {
57-
// Get the article URL from sessionStorage
58+
const runAnalysis = async () => {
5859
const storedUrl = sessionStorage.getItem("articleUrl")
5960
if (storedUrl) {
6061
setArticleUrl(storedUrl)
62+
63+
try {
64+
const res = await axios.post("https://Thunder1245-perspective1.hf.space/api/process", {
65+
url: storedUrl,
66+
})
67+
68+
// Save response to sessionStorage
69+
sessionStorage.setItem("analysisResult", JSON.stringify(res.data))
70+
71+
// optional logging
72+
console.log("Analysis result saved")
73+
console.log(res)
74+
} catch (err) {
75+
console.error("Failed to process article:", err)
76+
router.push("/analyze") // fallback in case of error
77+
return
78+
}
79+
80+
// Progress and step simulation
81+
const stepInterval = setInterval(() => {
82+
setCurrentStep((prev) => {
83+
if (prev < steps.length - 1) {
84+
return prev + 1
85+
} else {
86+
clearInterval(stepInterval)
87+
setTimeout(() => {
88+
router.push("/analyze/results")
89+
}, 2000)
90+
return prev
91+
}
92+
})
93+
}, 2000)
94+
95+
const progressInterval = setInterval(() => {
96+
setProgress((prev) => {
97+
if (prev < 100) {
98+
return prev + 1
99+
}
100+
return prev
101+
})
102+
}, 100)
103+
104+
return () => {
105+
clearInterval(stepInterval)
106+
clearInterval(progressInterval)
107+
}
61108
} else {
62-
// Redirect back if no URL found
63109
router.push("/analyze")
64-
return
65110
}
111+
}
112+
113+
runAnalysis()
114+
}, [router])
66115

67-
// Simulate processing steps
68-
const stepInterval = setInterval(() => {
69-
setCurrentStep((prev) => {
70-
if (prev < steps.length - 1) {
71-
return prev + 1
72-
} else {
73-
clearInterval(stepInterval)
74-
// After all steps complete, redirect to results
75-
setTimeout(() => {
76-
router.push("/analyze/results")
77-
}, 2000)
78-
return prev
79-
}
80-
})
81-
}, 2000)
82-
83-
// Progress animation
84-
const progressInterval = setInterval(() => {
85-
setProgress((prev) => {
86-
if (prev < 100) {
87-
return prev + 1
88-
}
89-
return prev
90-
})
91-
}, 100)
92-
93-
return () => {
94-
clearInterval(stepInterval)
95-
clearInterval(progressInterval)
96-
}
97-
}, [router])
98116

99117
return (
100118
<div className="min-h-screen bg-gradient-to-br from-slate-50 via-blue-50/30 to-indigo-100/50 dark:from-slate-900 dark:via-slate-900/80 dark:to-indigo-950/50 transition-colors duration-300 overflow-hidden">

frontend/app/analyze/results/page.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import BiasMeter from "@/components/bias-meter"
2020
* Provides an interactive interface for users to review an article's summary, explore alternative perspectives, verify factual claims, and engage in AI-assisted discussion. Includes responsive navigation, a bias visualization, and a curated list of references.
2121
*/
2222
export default function AnalyzePage() {
23+
const [analysisData, setAnalysisData] = useState(null)
2324
const [activeTab, setActiveTab] = useState("summary")
2425
const [message, setMessage] = useState("")
2526
const [isLoading, setIsLoading] = useState(true)
@@ -38,6 +39,14 @@ export default function AnalyzePage() {
3839
const timer = setTimeout(() => {
3940
setIsLoading(false)
4041
}, 1500)
42+
const storedData = sessionStorage.getItem("analysisResult")
43+
if (storedData) {
44+
setAnalysisData(JSON.parse(storedData))
45+
} else {
46+
// fallback if user visits results page directly
47+
// maybe redirect or show error
48+
console.warn("No analysis result found")
49+
}
4150

4251
return () => clearTimeout(timer)
4352
}, [])
@@ -66,6 +75,12 @@ export default function AnalyzePage() {
6675

6776
return (
6877
<div className="flex flex-col min-h-screen">
78+
<div className="p-4">
79+
<h1 className="text-2xl font-bold mb-4">Analysis Results</h1>
80+
<pre className="bg-black p-4 rounded text-sm overflow-x-auto whitespace-pre-wrap">
81+
{JSON.stringify(analysisData, null, 2)}
82+
</pre>
83+
</div>
6984
<header className="px-4 lg:px-6 h-14 md:h-16 flex items-center border-b backdrop-blur-sm bg-background/80 fixed w-full z-10">
7085
<Link className="flex items-center justify-center" href="/">
7186
<Globe className="h-5 w-5 md:h-6 md:w-6 mr-2 text-primary" />

frontend/components/bias-meter.tsx

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
"use client"
1+
"use client";
22

33
interface BiasMeterProps {
4-
score: number
4+
score: number;
55
}
66

77
/**
@@ -13,26 +13,28 @@ interface BiasMeterProps {
1313
*/
1414
export default function BiasMeter({ score }: BiasMeterProps) {
1515
const getScoreColor = (score: number) => {
16-
if (score <= 30) return "text-green-500"
17-
if (score <= 60) return "text-yellow-500"
18-
return "text-red-500"
19-
}
16+
if (score <= 30) return "text-green-500";
17+
if (score <= 60) return "text-yellow-500";
18+
return "text-red-500";
19+
};
2020

2121
const getScoreLabel = (score: number) => {
22-
if (score <= 30) return "Low Bias"
23-
if (score <= 60) return "Moderate Bias"
24-
return "High Bias"
25-
}
22+
if (score <= 30) return "Low Bias";
23+
if (score <= 60) return "Moderate Bias";
24+
return "High Bias";
25+
};
2626

27-
const circumference = 2 * Math.PI * 45
28-
const strokeDasharray = circumference
29-
const strokeDashoffset = circumference - (score / 100) * circumference
27+
const circumference = 2 * Math.PI * 45;
28+
const strokeDasharray = circumference;
29+
const strokeDashoffset = circumference - (score / 100) * circumference;
3030

3131
return (
3232
<div className="space-y-2">
3333
<div className="flex items-center justify-between">
3434
<h3 className="font-medium text-sm">Bias Score</h3>
35-
<span className={`text-sm font-semibold ${getScoreColor(score)}`}>{score}/100</span>
35+
<span className={`text-sm font-semibold ${getScoreColor(score)}`}>
36+
{score}/100
37+
</span>
3638
</div>
3739
<div className="flex items-center justify-center">
3840
<div className="relative w-24 h-24">
@@ -55,16 +57,22 @@ export default function BiasMeter({ score }: BiasMeterProps) {
5557
fill="transparent"
5658
strokeDasharray={strokeDasharray}
5759
strokeDashoffset={strokeDashoffset}
58-
className={`transition-all duration-1000 ease-out ${getScoreColor(score)}`}
60+
className={`transition-all duration-1000 ease-out ${getScoreColor(
61+
score
62+
)}`}
5963
strokeLinecap="round"
6064
/>
6165
</svg>
6266
<div className="absolute inset-0 flex items-center justify-center">
63-
<span className={`text-lg font-bold ${getScoreColor(score)}`}>{score}</span>
67+
<span className={`text-lg font-bold ${getScoreColor(score)}`}>
68+
{score}
69+
</span>
6470
</div>
6571
</div>
6672
</div>
67-
<p className="text-xs text-muted-foreground text-center">{getScoreLabel(score)}</p>
73+
<p className="text-xs text-muted-foreground text-center">
74+
{getScoreLabel(score)}
75+
</p>
6876
</div>
69-
)
77+
);
7078
}

0 commit comments

Comments
 (0)