Skip to content

Commit

Permalink
Merge pull request #142 from kamranahmedse/develop
Browse files Browse the repository at this point in the history
Create a new pull request by comparing changes across two branches
  • Loading branch information
GulajavaMinistudio authored May 30, 2024
2 parents 9c668b9 + a14d8b5 commit 49ffb64
Show file tree
Hide file tree
Showing 198 changed files with 392 additions and 51 deletions.
Binary file added public/pdfs/roadmaps/ios.pdf
Binary file not shown.
Binary file added public/roadmaps/ios.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)

Expand Down
16 changes: 16 additions & 0 deletions src/components/EditorRoadmap/EditorRoadmapRenderer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -104,13 +106,23 @@ export function EditorRoadmapRenderer(props: RoadmapRendererProps) {

if (e.shiftKey) {
e.preventDefault();
if (!isLoggedIn()) {
showLoginPopup();
return;
}

updateTopicStatus(
nodeId,
isCurrentStatusLearning ? 'pending' : 'learning',
);
return;
} else if (e.altKey) {
e.preventDefault();
if (!isLoggedIn()) {
showLoginPopup();
return;
}

updateTopicStatus(nodeId, isCurrentStatusSkipped ? 'pending' : 'skipped');
return;
}
Expand Down Expand Up @@ -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');
}, []);
Expand Down
8 changes: 1 addition & 7 deletions src/components/GenerateRoadmap/GenerateRoadmap.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down
2 changes: 1 addition & 1 deletion src/components/GenerateRoadmap/RoadmapSearch.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<div className="flex flex-grow flex-col items-center px-4 py-6 sm:px-6 md:my-24 lg:my-32">
Expand Down
4 changes: 2 additions & 2 deletions src/components/Navigation/Navigation.astro
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ import { AccountDropdown } from './AccountDropdown';
</a>

<a
href='/ai'
href='/teams'
class='group inline sm:hidden relative !mr-2 text-blue-300 hover:text-white'
>
AI Roadmaps&nbsp;
Teams

<span class='absolute -right-[11px] top-0'>
<span class='relative flex h-2 w-2'>
Expand Down
2 changes: 1 addition & 1 deletion src/components/OnboardingNudge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export function OnboardingNudge(props: OnboardingNudgeProps) {
return (
<div
className={cn(
'fixed left-0 right-0 top-0 z-[91] flex w-full items-center justify-center bg-yellow-300 border-b border-b-yellow-500/30 py-1.5',
'fixed left-0 right-0 top-0 z-[91] flex w-full items-center justify-center bg-yellow-300 border-b border-b-yellow-500/30 pt-1.5 pb-2',
{
'striped-loader': isLoading,
},
Expand Down
5 changes: 5 additions & 0 deletions src/components/Roadmaps/RoadmapsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,11 @@ const groups: GroupType[] = [
link: '/android',
type: 'role',
},
{
title: 'iOS',
link: '/ios',
type: 'role',
},
{
title: 'React Native',
link: '/react-native',
Expand Down
74 changes: 55 additions & 19 deletions src/components/TopicDetail/TopicDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import type {
} from '../CustomRoadmap/CustomRoadmap';
import { markdownToHtml, sanitizeMarkdown } from '../../lib/markdown';
import { cn } from '../../lib/classname';
import { Ban, FileText, X } from 'lucide-react';
import { Ban, FileText, HeartHandshake, X } from 'lucide-react';
import { getUrlParams } from '../../lib/browser';
import { Spinner } from '../ReactIcons/Spinner';
import { GitHubIcon } from '../ReactIcons/GitHubIcon.tsx';
Expand Down Expand Up @@ -58,6 +58,7 @@ export function TopicDetail(props: TopicDetailProps) {
const [isContributing, setIsContributing] = useState(false);
const [error, setError] = useState('');
const [topicHtml, setTopicHtml] = useState('');
const [hasContent, setHasContent] = useState(false);
const [topicTitle, setTopicTitle] = useState('');
const [topicHtmlTitle, setTopicHtmlTitle] = useState('');
const [links, setLinks] = useState<RoadmapContentDocument['links']>([]);
Expand Down Expand Up @@ -177,6 +178,9 @@ export function TopicDetail(props: TopicDetailProps) {

const titleElem: HTMLElement = topicDom.querySelector('h1')!;

const otherElems = topicDom.querySelectorAll('body > *:not(h1, div)');

setHasContent(otherElems.length > 0);
setContributionUrl(contributionUrl);
setHasEnoughLinks(links.length >= 3);
setTopicHtmlTitle(titleElem?.textContent || '');
Expand All @@ -187,6 +191,8 @@ export function TopicDetail(props: TopicDetailProps) {
const sanitizedMarkdown = sanitizeMarkdown(
(response as RoadmapContentDocument).description || '',
);

setHasContent(sanitizedMarkdown?.length > 0);
topicHtml = markdownToHtml(sanitizedMarkdown, false);
}

Expand All @@ -207,7 +213,6 @@ export function TopicDetail(props: TopicDetailProps) {
return null;
}

const hasContent = topicHtml?.length > 0 || links?.length > 0 || topicTitle;
const resourceTitleForSearch = resourceTitle
?.toLowerCase()
?.replace(/\s+?roadmap/gi, '');
Expand All @@ -225,7 +230,7 @@ export function TopicDetail(props: TopicDetailProps) {
className="fixed right-0 top-0 z-40 flex h-screen w-full flex-col overflow-y-auto bg-white p-4 focus:outline-0 sm:max-w-[600px] sm:p-6"
>
{isLoading && (
<div className="flex w-full h-full items-center justify-center">
<div className="flex h-full w-full items-center justify-center">
<Spinner
outerFill="#d1d5db"
className="h-6 w-6 sm:h-8 sm:w-8"
Expand All @@ -242,7 +247,11 @@ export function TopicDetail(props: TopicDetailProps) {
<div className="mb-2">
{!isEmbed && (
<TopicProgressButton
topicId={topicId}
topicId={
topicId.indexOf('@') !== -1
? topicId.split('@')[1]
: topicId
}
resourceId={resourceId}
resourceType={resourceType}
onClose={() => {
Expand All @@ -265,20 +274,48 @@ export function TopicDetail(props: TopicDetailProps) {

{/* Topic Content */}
{hasContent ? (
<div className="prose prose-quoteless prose-h1:mb-2.5 prose-h1:mt-7 prose-h1:text-balance prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-li:m-0 prose-li:mb-0.5">
{topicTitle && <h1>{topicTitle}</h1>}
<div
id="topic-content"
dangerouslySetInnerHTML={{ __html: topicHtml }}
/>
</div>
<>
<div className="prose prose-quoteless prose-h1:mb-2.5 prose-h1:mt-7 prose-h1:text-balance prose-h2:mb-3 prose-h2:mt-0 prose-h3:mb-[5px] prose-h3:mt-[10px] prose-p:mb-2 prose-p:mt-0 prose-blockquote:font-normal prose-blockquote:not-italic prose-blockquote:text-gray-700 prose-li:m-0 prose-li:mb-0.5">
{topicTitle && <h1>{topicTitle}</h1>}
<div
id="topic-content"
dangerouslySetInnerHTML={{ __html: topicHtml }}
/>
</div>
</>
) : (
<div className="flex h-[calc(100%-38px)] flex-col items-center justify-center">
<FileText className="h-16 w-16 text-gray-300" />
<p className="mt-2 text-lg font-medium text-gray-500">
Empty Content
</p>
</div>
<>
{!canSubmitContribution && (
<div className="flex h-[calc(100%-38px)] flex-col items-center justify-center">
<FileText className="h-16 w-16 text-gray-300" />
<p className="mt-2 text-lg font-medium text-gray-500">
Empty Content
</p>
</div>
)}
{canSubmitContribution && (
<div className="mx-auto flex h-[calc(100%-38px)] max-w-[400px] flex-col items-center justify-center text-center">
<HeartHandshake className="mb-2 h-16 w-16 text-gray-300" />
<p className="text-lg font-semibold text-gray-900">
Help us write this content
</p>
<p className="mb-3 mt-2 text-sm text-gray-500">
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.
</p>
<a
href={contributionUrl}
target={'_blank'}
className="flex w-full items-center justify-center rounded-md bg-gray-800 p-2 text-sm text-white transition-colors hover:bg-black hover:text-white disabled:bg-green-200 disabled:text-black"
>
<GitHubIcon className="mr-2 inline-block h-4 w-4 text-white" />
Edit this Content
</a>
</div>
)}
</>
)}

{links.length > 0 && (
Expand Down Expand Up @@ -313,8 +350,7 @@ export function TopicDetail(props: TopicDetailProps) {
<div className="mb-12 mt-3 border-t text-sm text-gray-400">
<div className="mb-4 mt-3">
<p className="">
Can't find what you're looking for? Try these pre-filled
search queries:
Find more resources using these pre-filled search queries:
</p>
<div className="mt-3 flex gap-2 text-gray-700">
<a
Expand Down
5 changes: 3 additions & 2 deletions src/components/TopicDetail/TopicProgressButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ export function TopicProgressButton(props: TopicProgressButtonProps) {
'l',
() => {
if (progress === 'learning') {
onClose();
return;
}

Expand Down Expand Up @@ -138,7 +137,9 @@ export function TopicProgressButton(props: TopicProgressButtonProps) {
)
.then(() => {
setProgress(progress);
onClose();
if (progress !== 'learning') {
onClose();
}
renderTopicProgress(topicId, progress);
refreshProgressCounters();
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ Components are the main building block for Angular applications. Each component
Visit the following resources to learn more:

- [Angular Components Overview](https://angular.io/guide/component-overview)
- [Anatomy of a component](https://angular.dev/guide/components)
- [Composing with Components in Angular](https://angular.dev/essentials/components)
- [Standalone Components in Angular](https://www.youtube.com/watch?v=x5PZwb4XurU)
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ Template statements are methods or properties that you can use in your HTML to r
Visit the following resources to learn more:

- [Angular Official Website](https://angular.io/guide/template-statements)
- [Understanding Template Statements](https://angular.dev/guide/templates/template-statements#)
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# Go Pointers

Go pointers are a powerful feature that allows you to work with memory addresses directly. They are used to store the memory address of a variable. This can be useful when you need to pass a large amount of data to a function or when you need to modify the value of a variable inside a function.
Go pointers are a powerful feature that allows you to work with memory addresses directly. They are used to store the memory address of a variable. This can be useful when you need to pass a large amount of data to a function or when you need to modify the value of a variable inside a function.

Visit the following resources to learn more:

- [Pointers](https://go.dev/tour/moretypes/1)
- [Go by Example: Pointers](https://gobyexample.com/pointers)
- [YouTube: Pointers](https://www.youtube.com/watch?v=a4HcEsJ1hIE)
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Accessibility Inspector
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Accessibility
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Alamofire
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# App Store Distribution
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# App Store Optimization (ASO)
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Architectural Patterns
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# ARKit
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# async / await in Swift
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Async / Await
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Auto layout
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# AV Foundation
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Azure
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Basic Interfaces
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Basics / Creating Animations
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Benefits over Objective-C
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Breakpoints
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Building Interfaces
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Callback Hell
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Callbacks
1 change: 1 addition & 0 deletions ...ata/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Capturing Values & Memory Mgmt.
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Carthage
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# CI / CD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Circle CI
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Closures
7 changes: 7 additions & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Cocoa Touch

The Cocoa Touch layer in iOS provides the key frameworks needed to create apps for iOS devices. It offers extensive support for various user interface elements, gestures, animations, and event handling, making it central to developing interactive and visually appealing applications. Key components include UIKit for managing the graphical user interface, Foundation for essential data and network access, and Core Motion for handling device motion data. Additionally, frameworks like GameKit, MapKit, MessageUI, EventKit, and AVFoundation extend functionality for gaming, mapping, communication, event management, and multimedia.

Cocoa Touch is responsible for the seamless integration of user interfaces and multimedia, supporting touch-based input, complex animations, and gesture recognizers through UIKit. AVFoundation provides robust tools for handling audio and video, essential for media-rich applications. GameKit offers features for game development, while MapKit integrates mapping services. MessageUI enables in-app communication via email and messages, and EventKit manages calendar events and reminders. These frameworks collectively empower developers to create rich, interactive, and high-performing iOS applications.

You can learn more in depth information on the elements of the Cocoa Touch layer further down the roadmap in the UI Design & Framework sections.
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# CocoaPods
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Code Quality Tools
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Combine and MVVM
1 change: 1 addition & 0 deletions src/data/roadmaps/ios/content/[email protected]
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Combine
Loading

0 comments on commit 49ffb64

Please sign in to comment.