diff --git a/public/pdfs/roadmaps/ios.pdf b/public/pdfs/roadmaps/ios.pdf new file mode 100644 index 000000000000..83fc5ec82009 Binary files /dev/null and b/public/pdfs/roadmaps/ios.pdf differ diff --git a/public/roadmaps/ios.png b/public/roadmaps/ios.png new file mode 100644 index 000000000000..9a68ace9f28e Binary files /dev/null and b/public/roadmaps/ios.png differ diff --git a/readme.md b/readme.md index 97167df9211a..17834d1bf200 100644 --- a/readme.md +++ b/readme.md @@ -59,6 +59,7 @@ Here is the list of available roadmaps with more being actively worked upon. - [Node.js Roadmap](https://roadmap.sh/nodejs) - [GraphQL Roadmap](https://roadmap.sh/graphql) - [Android Roadmap](https://roadmap.sh/android) +- [iOS Roadmap](https://roadmap.sh/ios) - [Flutter Roadmap](https://roadmap.sh/flutter) - [Go Roadmap](https://roadmap.sh/golang) - [Rust Roadmap](https://roadmap.sh/rust) @@ -91,6 +92,7 @@ There are also interactive best practices: - [JavaScript Questions](https://roadmap.sh/questions/javascript) - [Node.js Questions](https://roadmap.sh/questions/nodejs) - [React Questions](https://roadmap.sh/questions/react) +- [Backend Questions](https://roadmap.sh/questions/backend) ![](https://i.imgur.com/waxVImv.png) diff --git a/src/components/EditorRoadmap/EditorRoadmapRenderer.tsx b/src/components/EditorRoadmap/EditorRoadmapRenderer.tsx index b964b231909e..c2e83d64c413 100644 --- a/src/components/EditorRoadmap/EditorRoadmapRenderer.tsx +++ b/src/components/EditorRoadmap/EditorRoadmapRenderer.tsx @@ -12,6 +12,8 @@ import { useToast } from '../../hooks/use-toast'; import type { Edge, Node } from 'reactflow'; import { Renderer } from '../../../editor/renderer'; import { slugify } from '../../lib/slugger'; +import { isLoggedIn } from '../../lib/jwt'; +import { showLoginPopup } from '../../lib/popup'; export type RoadmapRendererProps = { resourceId: string; @@ -104,6 +106,11 @@ export function EditorRoadmapRenderer(props: RoadmapRendererProps) { if (e.shiftKey) { e.preventDefault(); + if (!isLoggedIn()) { + showLoginPopup(); + return; + } + updateTopicStatus( nodeId, isCurrentStatusLearning ? 'pending' : 'learning', @@ -111,6 +118,11 @@ export function EditorRoadmapRenderer(props: RoadmapRendererProps) { return; } else if (e.altKey) { e.preventDefault(); + if (!isLoggedIn()) { + showLoginPopup(); + return; + } + updateTopicStatus(nodeId, isCurrentStatusSkipped ? 'pending' : 'skipped'); return; } @@ -143,6 +155,10 @@ export function EditorRoadmapRenderer(props: RoadmapRendererProps) { return; } + if (!isLoggedIn()) { + showLoginPopup(); + return; + } const isCurrentStatusDone = targetGroup?.classList.contains('done'); updateTopicStatus(nodeId, isCurrentStatusDone ? 'pending' : 'done'); }, []); diff --git a/src/components/GenerateRoadmap/GenerateRoadmap.tsx b/src/components/GenerateRoadmap/GenerateRoadmap.tsx index 74e49a28797e..ccb2cf16f410 100644 --- a/src/components/GenerateRoadmap/GenerateRoadmap.tsx +++ b/src/components/GenerateRoadmap/GenerateRoadmap.tsx @@ -25,20 +25,14 @@ import { Ban, Cog, Download, PenSquare, Save, Wand } from 'lucide-react'; import { ShareRoadmapButton } from '../ShareRoadmapButton.tsx'; import { httpGet, httpPost } from '../../lib/http.ts'; import { pageProgressMessage } from '../../stores/page.ts'; -import { - deleteUrlParam, - getUrlParams, - setUrlParams, -} from '../../lib/browser.ts'; +import { deleteUrlParam, getUrlParams } from '../../lib/browser.ts'; import { downloadGeneratedRoadmapImage } from '../../helper/download-image.ts'; import { showLoginPopup } from '../../lib/popup.ts'; import { cn } from '../../lib/classname.ts'; import { RoadmapTopicDetail } from './RoadmapTopicDetail.tsx'; import { AIRoadmapAlert } from './AIRoadmapAlert.tsx'; -import { OpenAISettings } from './OpenAISettings.tsx'; import { IS_KEY_ONLY_ROADMAP_GENERATION } from '../../lib/ai.ts'; import { AITermSuggestionInput } from './AITermSuggestionInput.tsx'; -import { useParams } from '../../hooks/use-params.ts'; import { IncreaseRoadmapLimit } from './IncreaseRoadmapLimit.tsx'; import { AuthenticationForm } from '../AuthenticationFlow/AuthenticationForm.tsx'; diff --git a/src/components/GenerateRoadmap/RoadmapSearch.tsx b/src/components/GenerateRoadmap/RoadmapSearch.tsx index 5043b7d4d733..e34dd45eb985 100644 --- a/src/components/GenerateRoadmap/RoadmapSearch.tsx +++ b/src/components/GenerateRoadmap/RoadmapSearch.tsx @@ -42,7 +42,7 @@ export function RoadmapSearch(props: RoadmapSearchProps) { setIsAuthenticatedUser(isLoggedIn()); }, []); - const randomTerms = ['OAuth', 'APIs', 'UX Design', 'gRPC']; + const randomTerms = ['OAuth', 'UI / UX', 'SRE', 'DevRel']; return (
- Empty Content -
-+ Empty Content +
++ Help us write this content +
++ Write a brief introduction to this topic and submit a + link to a good article, podcast, video, or any other + self-vetted resource that helped you understand this + topic better. +
+ +