chore: fixed PWA support and added december changelog

This commit is contained in:
zaidmukaddam 2024-12-27 14:38:52 +05:30
parent 4c15e52b5f
commit 38eff29165
4 changed files with 135 additions and 58 deletions

BIN
app/apple-icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
app/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -2,11 +2,18 @@
"name": "MiniPerplx - AI-powered Search Engine", "name": "MiniPerplx - AI-powered Search Engine",
"short_name": "MiniPerplx", "short_name": "MiniPerplx",
"description": "A minimalistic AI-powered search engine that helps you find information on the internet using advanced AI models like GPT-4, Claude, and Grok", "description": "A minimalistic AI-powered search engine that helps you find information on the internet using advanced AI models like GPT-4, Claude, and Grok",
"start_url": "/", "start_url": "/search",
"display": "standalone", "display": "standalone",
"background_color": "#ffffff", "background_color": "#ffffff",
"theme_color": "#000000", "theme_color": "#000000",
"categories": ["search", "ai", "productivity"], "categories": ["search", "ai", "productivity"],
"icons" : [
{
"src": "/favicon.ico",
"sizes": "any",
"type": "image/x-icon"
}
],
"screenshots": [ "screenshots": [
{ {
"src": "/app/opengraph-image.png", "src": "/app/opengraph-image.png",

View File

@ -128,6 +128,7 @@ import { FlightTracker } from '@/components/flight-tracker';
import { InstallPrompt } from '@/components/InstallPrompt'; import { InstallPrompt } from '@/components/InstallPrompt';
import { atomDark } from 'react-syntax-highlighter/dist/cjs/styles/prism'; import { atomDark } from 'react-syntax-highlighter/dist/cjs/styles/prism';
import { vs } from 'react-syntax-highlighter/dist/cjs/styles/prism'; import { vs } from 'react-syntax-highlighter/dist/cjs/styles/prism';
import { useMediaQuery } from '@/hooks/use-media-query';
export const maxDuration = 60; export const maxDuration = 60;
@ -742,40 +743,62 @@ const HomeContent = () => {
const changelogs: Changelog[] = [ const changelogs: Changelog[] = [
{ {
id: "1", id: "1",
title: "New Updates!", title: "December Updates",
images: [ images: [
"https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-new-claude-models.png", "https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-search-groups.png",
"https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-nearby-search-maps-demo.png", "https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-grok2.png",
"https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-multi-search-demo.png" "https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-track-flights.png",
"https://metwm7frkvew6tn1.public.blob.vercel-storage.com/mplx-changelogs/mplx-reterive-back.png",
], ],
content: content:`
`## **Nearby Map Search Beta** ## **Search Groups**
The new Nearby Map Search tool is now available in beta! You can use it to find nearby places, restaurants, attractions, and more. Give it a try and let us know what you think! You can now switch between different search groups like Default, Youtube, X.com, Academic, and more to get results from different sources.
## **Multi Search is here by default** ## **Added Grok 2.0 Vision model**
The AI powered Multiple Query Search tool is now available by default. The LLM model will now automatically suggest multiple queries based on your input and run the searches in parallel. xAI's Grok 2.0 Vision model is now available on the platform.
## **Claude 3.5 Sonnet(New) and 3.5 Haiku are here!** ## **Default Search Engine**
The new Anthropic models: Claude 3.5 Sonnet and 3.5 Haiku models are now available on the platform. You can now set MiniPerplx as the default search engine for the platform. Follow the instructions in the [Readme](https://github.com/zaidmukaddam/miniperplx/blob/main/README.md) to set it as default.
## **Track Flights**
You can now track flights in real-time with the new Flight Tracker tool.
## **PWA support**
The platform now supports Progressive Web App(PWA) features. You can now install the platform as an app on your device.
## **Reterive tool is back!**
You can now use the Retrieve tool to get information from the a specific URL.
## **Trending Queries**
You can now view the trending queries on the platform.
` `
} }
]; ];
const ChangeLogs: React.FC<{ open: boolean; setOpen: (open: boolean) => void }> = ({ open, setOpen }) => {
return ( const ChangeLogs = ({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) => {
<Dialog open={open} onOpenChange={setOpen}> const isMobile = useMediaQuery("(max-width: 768px)");
<DialogContent className="no-scrollbar max-h-[80vh] overflow-y-auto rounded-xl border-none p-0 gap-0 font-sans bg-white dark:bg-neutral-900 z-[1000]">
const ChangelogContent = () => (
<>
{/* Fixed Header */}
<div className="w-full py-3 flex justify-center items-center border-b border-neutral-200 dark:border-neutral-700"> <div className="w-full py-3 flex justify-center items-center border-b border-neutral-200 dark:border-neutral-700">
<h2 className="text-lg font-bold flex items-center gap-2 text-neutral-800 dark:text-neutral-100"> <h2 className="text-lg font-bold flex items-center gap-2 text-neutral-800 dark:text-neutral-100">
<Flame size={20} /> What&apos;s new <Flame size={20} /> What&apos;s new
</h2> </h2>
</div> </div>
<div className="divide-y divide-neutral-200 dark:divide-neutral-700"> <div className="divide-y divide-neutral-200 dark:divide-neutral-700">
{changelogs.map((changelog) => ( {changelogs.map((changelog) => (
<div key={changelog.id}> <div key={changelog.id}>
{/* Carousel */}
<Carousel <Carousel
opts={{ opts={{
align: "start", align: "start",
@ -803,31 +826,78 @@ The new Anthropic models: Claude 3.5 Sonnet and 3.5 Haiku models are now availab
))} ))}
</CarouselContent> </CarouselContent>
</Carousel> </Carousel>
{/* Content Section */}
<div className="flex flex-col gap-2 px-4 py-2"> <div className="flex flex-col gap-2 px-4 py-2">
<h3 className="text-2xl font-medium font-serif text-neutral-800 dark:text-neutral-100">{changelog.title}</h3> <h3 className="text-2xl font-bold text-left text-neutral-800 dark:text-neutral-100">
{changelog.title}
</h3>
<div className="overflow-y-auto max-h-[50vh]">
<ReactMarkdown <ReactMarkdown
components={{ components={{
h2: ({ node, className, ...props }) => ( h2: ({ node, className, ...props }) => (
<h2 {...props} className={cn("my-2 text-lg font-medium text-neutral-800 dark:text-neutral-100", className)} /> <h2
{...props}
className={cn(
"my-2 text-lg font-medium text-neutral-800 dark:text-neutral-100",
className
)}
/>
), ),
p: ({ node, className, ...props }) => ( p: ({ node, className, ...props }) => (
<p {...props} className={cn("mb-3 text-neutral-700 dark:text-neutral-300 leading-relaxed", className)} /> <p
{...props}
className={cn(
"mb-3 text-neutral-700 dark:text-neutral-300 leading-relaxed",
className
)}
/>
),
a: ({ node, className, ...props }) => (
<a
{...props}
className={cn(
"hover:text-blue-500 underline",
className
)}
/>
), ),
}} }}
className="text-sm" className="text-sm text-left pr-2"
> >
{changelog.content} {changelog.content}
</ReactMarkdown> </ReactMarkdown>
</div> </div>
</div> </div>
</div>
))} ))}
</div> </div>
</>
);
if (isMobile) {
return (
<Drawer open={open} onOpenChange={setOpen}>
<DrawerContent className="max-h-[100vh] z-[81] font-sans text-left">
<DrawerHeader className="p-0">
<ChangelogContent />
</DrawerHeader>
</DrawerContent>
</Drawer>
);
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogContent className="max-h-[90vh] overflow-scroll rounded-xl border-none p-0 gap-0 font-sans bg-white dark:bg-neutral-900 z-[1000]">
<ChangelogContent />
</DialogContent> </DialogContent>
</Dialog> </Dialog>
); );
}; };
const TranslationTool: React.FC<{ toolInvocation: ToolInvocation; result: any }> = ({ toolInvocation, result }) => { const TranslationTool: React.FC<{ toolInvocation: ToolInvocation; result: any }> = ({ toolInvocation, result }) => {
const [isPlaying, setIsPlaying] = useState(false); const [isPlaying, setIsPlaying] = useState(false);
const [audioUrl, setAudioUrl] = useState<string | null>(null); const [audioUrl, setAudioUrl] = useState<string | null>(null);