├── .gitignore
├── LH-Academy.png
├── Przemocny.png
├── README.md
├── Zbiór React
├── ComplexLogic
│ ├── AuthTokenReactRouter.md
│ ├── ContextAsRedux.md
│ └── hocProtectedView.md
├── Components
│ ├── InfiniteHumanList.md
│ ├── Modal.md
│ ├── SearchWithDropdown.md
│ └── search.png
└── SimpleLogic
│ ├── CompountSideBar.md
│ ├── TableWithPagination.md
│ └── useGeo.md
├── Zbiór backend
└── express_or_next
│ ├── bearerMiddleware.md
│ └── googleSheetIntegration.md
├── Zbiór frontend
├── html_and_css
│ ├── ChatUI.jpg
│ ├── ChatUI.md
│ ├── clockwisePresentation.md
│ └── starWarsIntro.md
├── html_and_js
│ ├── ScrollingList.md
│ ├── data.js
│ ├── searchDeep.md
│ └── typingEffect.md
└── html_css_and_js
│ ├── DatePicker.md
│ ├── FlipCard.md
│ ├── SmartLogo.md
│ ├── date-picker-ui-element.gif
│ ├── flipCardGrid.gif
│ └── task.gif
├── Zbiór fullstack
├── chatwidget.md
└── googleFormsLike.md
├── Zbiór fundamentals
├── js_functional
│ ├── arrayMethods.md
│ ├── includes.md
│ ├── recursivePromise.md
│ └── regExpSearch.md
└── js_oop
│ ├── MouseRecorder.md
│ ├── envDetector.md
│ ├── promiseMethods.md
│ └── resizeObserver.md
├── jsgladiator.png
├── pitagoras.jpg
└── tests
├── lodash.md
└── request.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Microbundle cache
57 | .rpt2_cache/
58 | .rts2_cache_cjs/
59 | .rts2_cache_es/
60 | .rts2_cache_umd/
61 |
62 | # Optional REPL history
63 | .node_repl_history
64 |
65 | # Output of 'npm pack'
66 | *.tgz
67 |
68 | # Yarn Integrity file
69 | .yarn-integrity
70 |
71 | # dotenv environment variables file
72 | .env
73 | .env.test
74 |
75 | # parcel-bundler cache (https://parceljs.org/)
76 | .cache
77 |
78 | # Next.js build output
79 | .next
80 |
81 | # Nuxt.js build / generate output
82 | .nuxt
83 | dist
84 |
85 | # Gatsby files
86 | .cache/
87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js
88 | # https://nextjs.org/blog/next-9-1#public-directory-support
89 | # public
90 |
91 | # vuepress build output
92 | .vuepress/dist
93 |
94 | # Serverless directories
95 | .serverless/
96 |
97 | # FuseBox cache
98 | .fusebox/
99 |
100 | # DynamoDB Local files
101 | .dynamodb/
102 |
103 | # TernJS port file
104 | .tern-port
105 |
106 | /TODO
--------------------------------------------------------------------------------
/LH-Academy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Przemocny/zbior-zadan-html-css-js-react/cc6652b761b73d71a23eb0dfdea28bed2c1f9dc9/LH-Academy.png
--------------------------------------------------------------------------------
/Przemocny.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Przemocny/zbior-zadan-html-css-js-react/cc6652b761b73d71a23eb0dfdea28bed2c1f9dc9/Przemocny.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Intro do zbiorów
2 |
3 |
4 | ## Jest to próbka zadań ze zbiorów zadań z serii "Gladiator Javascriptu"
5 |
6 | Każdy zbiór, zawiera w sobie jedno lub dwa zadania próbne, które prezentują styl zadań w zbiorach. Jest to tylko demonstracja, więc w zbiorze który przeglądasz znajdziesz jedynie przedsmak wyzwań jakie stawiają przed programistą moje zbiory.
7 |
8 | ### Wersja demonstracyjna zbiorów zadań z serii "Gladiator Javascriptu"
9 |
10 | Pełna wersja zbioru, zawiera aż 118 zadań, podzielonych na specjalizacje i stopień zaawansowania.
11 |
12 | #### Starałem się wszystkie zadania opisać w sposób łatwo zrozumiały, ale jeśli czegoś nie rozumiesz - napisz wiadomość na fanpage, a postaram się wyjaśnić
13 | Ale to, że coś nie jest zrozumiałe dla Ciebie, nie zawsze oznacza, że to jest źle napisane. Czasem to Ty czegoś nie wiesz i powinieneś się douczyć
14 |
15 | # Powodzenia :)
16 |
17 | Przemocny
18 |
19 | Jeśli po skończeniu zadać, będziesz chciał dowiedzieć się jak Ci poszło i umówić się na omówienie z mentorem - napisz wiadomość na fanpage
20 | ##### stronka Gladiatorów: https://gladiators-of-javascript.com/
21 | ##### stronka Akademii: https://academy.localhost-group.com/
22 | ##### fb: https://www.facebook.com/localhost40310
23 | ##### email: contact@localhost-group.com
24 |
25 |
130 |
--------------------------------------------------------------------------------
/Zbiór React/ComplexLogic/AuthTokenReactRouter.md:
--------------------------------------------------------------------------------
1 |
AuthTokenReactRouter
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - JavaScript, React
8 |
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - JavaScript, React, ReactRouter
13 |
14 | ## Cele główne
15 | * [ ] Stwórz logikę React Router, która:
16 | - posiada 3 routy: `/`, `/login`, `/secure-link`
17 | - jeśli w GET lub podczas routingu w urlu jest przekazywane query `?token=f3823903b2dd6e35243b1bbe5a14f651`, to użytkownik może wejść na wszystkie routy,
18 | - jeśli w GET lub podczas routingu w urlu jest przekazywane query `?token=1c9de95d445fd0824b3bcf1def5f7bfb`, lub nie ma argumentów to użytkownik zostaje przekierowany na /login
19 |
20 | ## Cele dodatkowe
21 | * [ ] Brak
22 |
23 | ## Przydatne linki
24 | - ReactRouter doku - https://reactrouter.com/
25 |
26 | ## Początek kodu
27 |
28 | ```javascript
29 | // tokeny do autoryzacji
30 | const goodBearerToken = "f3823903b2dd6e35243b1bbe5a14f651"
31 | const badBearerToken = "1c9de95d445fd0824b3bcf1def5f7bfb"
32 | ```
33 |
34 |
--------------------------------------------------------------------------------
/Zbiór React/ComplexLogic/ContextAsRedux.md:
--------------------------------------------------------------------------------
1 | Context As Redux
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 | - Znajomośc JavaScript
7 | - Znajomość React
8 | - Znajomośc react hooks
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - JS
13 | - React
14 |
15 | ## Cele główne
16 |
17 | * [ ] Logika Reduxa w React składa się z 5 prostych elementów:
18 | - struktury danych - tzn store/state - komórka pamięci z aktualnym stanem wszystkich danych
19 | - reducera, który agreguje akcje i zmienia wg nich aktualny stan store
20 | - akcji z dodatkowymi danymi wykonywanych na reducerze do modyfikacji store
21 | - Providera - który określa zakres działania Reduxa
22 | - HOCa connect - High Order Component, który tworzy Consumera stanu z danego komponentu
23 |
24 | * [ ] Twoim zadaniem jest za pomocą:
25 | - React ContextApi
26 | - useContext hook
27 | - useReducer hook
28 | - oraz odrobiny znajomości JS
29 |
30 | * [ ] Oraz na podstawie poniższego kodu, odtworzyć Reduxa w React ContextApi
31 |
32 | ## Kawałek kodu dla lepszego początku!
33 |
34 | ```javascript
35 | const initialState = {
36 | text:'treść'
37 | }
38 |
39 | const ctx = React.createContext({
40 | state: initialState,
41 | actions:{
42 | changeText:(state, action)=>{}
43 | }
44 | })
45 |
46 | const actions = {
47 | changeText:(state, action)=>{
48 | // return ...
49 | }
50 | }
51 |
52 | function reducer(state=initialState, action){
53 | // zwykły reducer
54 | // return ...
55 | }
56 |
57 | const Provider = ({children, onLoad, onChange}) => {
58 | // tutaj łączymy context i actions i wrzucamy je do providera
59 | // prop onLoad powinien wywołać się na wczytaniu komponentu
60 | // prop onChange powinien wywołać się na zmianie stanu
61 | // return ...
62 | }
63 |
64 | const useContextState = ({stateNames=['text']})=>{
65 | // jeśli stateNames jest pusty to zwraca cały state
66 | // jeśli stateNames nie jest pusty to zwraca podane w arrayu klucze i wartości w formie nowego obiektu
67 | // return ...
68 | }
69 |
70 | const useContextActions = ({actions=["changeText"]})=>{
71 | // jeśli actions jest pusty to zwraca wszystkie akcje
72 | // jeśli actions nie jest pusty to zwraca akcje wskazane po nazwie w arryu actions
73 | // return ...
74 | }
75 |
76 | const useContextActionsAndStore = ({actions=["changeText"], stateNames=['text']})=>{
77 | // suma logiki powyżej
78 | // return ...
79 | }
80 | ```
81 |
--------------------------------------------------------------------------------
/Zbiór React/ComplexLogic/hocProtectedView.md:
--------------------------------------------------------------------------------
1 | Hoc Protected View
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - JavaScript, React,
8 | - Redux, useReducer - opcjonalnie
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - JavaScript, React,
13 |
14 | ## Cele główne
15 | * [ ] Twoim zadaniem jest stworzyć `userCtx` który w store przechowuje key `auth` domyślnie ustawiony na `false`
16 | * [ ] Następnie, stwórz HOCa który zależnie od tego czy w store pojawi się `user.auth` = `true` zwraca null, jeśli false
17 | to zwraca komponent przekierowujący na komponent logowania
18 | ## Cele dodatkowe
19 | * [ ] Brak
20 |
21 | ## Przydatne linki
22 | - context - https://pl.reactjs.org/docs/context.html
23 |
24 | ## Początek kodu
25 | ```javascript
26 | // kontektst
27 | const userCtx = React.createContext({auth:false})
28 |
29 | //HOC
30 | const Protected = (Component)=>{
31 | // return null
32 | }
33 | // - jeśli w kontekście auth jest false, Protected wyświetla komunikat "Musisz pierwsze się zalogować"
34 | // - jeśli w kontekście auth jest true to Protected wyświetla komponent
35 | ```
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/Zbiór React/Components/InfiniteHumanList.md:
--------------------------------------------------------------------------------
1 | Infinite Human List
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - React, JavaScript
8 |
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - React, JavaScript
13 |
14 | ## Cele główne
15 | * [ ] Twoim pierwszym zadaniem jest stworzyć na potrzeby zadania zbiory (tablice) losowych imion, nazwisk, wieków, i płci - około 15 dla każdego zbioru, z wyjątkiem płci. Zbiory te posłużą jako dane do generowania w dalszej częsci zadania.
16 |
17 | * [ ] Na podstawie przygotowanych zbiorów, stwórz funkcję `generatePerson`, która generuje człowieka jako obiekt o losowych parametrach. Jedna osoba to:
18 | - imię, nazwisko, wiek, płeć (losowe)
19 | - twarz, która będzie losowo wygenerowana przez AI - sprawdź: https://www.thispersondoesnotexist.com
20 |
21 | * [ ] Stwórz listę 100 losowych osób
22 | * [ ] Stwórz komponent `SinglePerson`, który prezentuje wszystkie informacje o człowieku
23 | * [ ] Stwórz komponent `MoreAndMorePeople`, który zaprezentuje pierwsze 10 osób, oraz:
24 | - po doscrollowaniu do końca listy, załaduje kolejne 10 osób do już prezentowanych
25 | - jeśli pierwsza 100 osób z domyślnej listy którą stworzyłeś i przekazałeś w propsach się skończy, lista ma wygenerować kolejne 10 osób i je wyświetlić
26 |
27 | ## Cele dodatkowe
28 |
29 | * [ ] Dodać stylowanie wg. metodologi BEM, w celu lepszego użytkowania.
30 |
31 | ## Kawałek kodu dla lepszego początku!
32 |
33 | ```javascript
34 | const generatePerson = () => {}
35 | // stwórz funkcję generuje człowieka (jako obiekt) o losowych parametrach
36 |
37 | const people = [] // stwórz listę 100 ludzi
38 |
39 | // stwórz komponent, który prezentuje wszystkie informacje o człowieku
40 | const SinglePerson = (props)=>{
41 | return null
42 | }
43 |
44 | // stwórz listę, która zaprezentuje pierwszych 10 ludzi
45 | const MoreAndMorePeople = ({
46 | items
47 | }) => {
48 | // po doscrolowaniu do końca listy, lista ma załadować
49 | // kolejną dziesiątkę ludzi do pokazywanych
50 | // jeśli pierwszych 100 ludzi (podstawowa wartość propa 'items') się skończy
51 | // lista ma wygenerować świeżych 10 ludzi i ich pokazać
52 | return null
53 | }
54 | ```
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Zbiór React/Components/Modal.md:
--------------------------------------------------------------------------------
1 | Modal
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - React, JavaScript
8 |
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - React, JavaScript
13 |
14 | ## Cele główne
15 | * [ ] Twoim zadaniem jest stworzyć komponent klasowy `Modal`, który:
16 | - zawiera podkomponenty ``, ``, ``
17 | - możesz wykorzystać do tego ContextApi, ale nie musisz
18 |
19 | * [ ] `Modal` ma mieć:
20 | - metodę `toggle()`, która włącza lub wyłącza modal,
21 | - prop `isOpen`, który jest `true/false` zależnie od tego czy modal jest włączony/wyłączony,
22 | - szare, półprzeźroczyste tło o kolorze `rgba(0,0,0,0.5)`, w które jeśli kliknie użytkownik to modal się wyłączy
23 |
24 | * [ ] `Modal.Header` ma mieć:
25 | - nieklikalne białe tło,
26 | - prop `title`, który renderuke się po lewej stronie,
27 | - ma zawierać po prawej stronie, przycisk do zamykania modalu metodą `toggle()`
28 |
29 | * [ ] `Modal.Content` ma mieć:
30 | - nieklikalne białe tło,
31 | - prop `children`, który jest renderowany wewnątrz tego białego tła,
32 |
33 | * [ ] `Modal.Footer` ma mieć:
34 | - nieklikalne białe tło,
35 | - prop `callToActionLabel`
36 | - dwa przyciski po prawej stronie, z ktorego jeden to `cancel` a drugi to `{callToActionLabel}`
37 | - oba przyciski mają zamykać modal,
38 | - podczas kliknięcia w przycisk z tekstem callToActionLabel, dodatkowo ma wyskakiwać alert z tekstem "OK"
39 |
40 | * [ ] Przykładowe wywołanie:
41 | ```javascript
42 | return (
43 |
44 |
45 |
46 | to powinno tak działać
47 |
48 |
49 |
50 | )
51 | ```
52 |
53 | * [ ] Przetestuj:
54 | - metodę togglę dostępną z każdego komponentu, który może z niej skorzystać
55 | - że wyrenderuje się jako null poza kontekstem
56 | - że będzie mieć przycisk oraz element h3
57 | - że będzie mieć 2 przyciski i oba będą zamykać modal
58 |
59 | ## Przydatne linki
60 | - podkomponenty - https://blog.bitsrc.io/understanding-compound-components-in-react-23c4b84535b5
61 |
62 |
63 |
64 |
--------------------------------------------------------------------------------
/Zbiór React/Components/SearchWithDropdown.md:
--------------------------------------------------------------------------------
1 | Przykładowe zadanie ze zbiorow Gladiatorów Javascriptu. Kup nasze zbiory już dziś!
2 | https://gladiators-of-javascript.com/#gladiators
3 |
4 | Search With Dropdown
5 |
6 |
7 |
8 | ## Wymagana wiedza
9 |
10 | - React, HTML, CSS, JavaScript
11 |
12 |
13 | ## Technologie potrzebne do zadania
14 |
15 | - React, HTML, CSS, JavaScript
16 |
17 | ## Cele główne
18 | * [ ] Twoim zadaniem jest odtworzyć komponent wyszukiwania ze zdjęcia poniżej
19 | * [ ] Zasady działania komponentu:
20 | - komponent `SearchWithDropdown` ma posiadać input na wyszukiwaną frazę. Po wpisaniu frazy `word` pojawia się lista `DropdownList` która renderuje pojedyńcze zgodności z wyszukiwaną frazą jako komponenty `DropdownItem`
21 | - Jeżeli długość podanej frazy jest krótsza, lub równa 3 znaki komponent `DropdownList` nie jest wyświetlany - fraza musi być większa lub równa niż 4 znaki.
22 | - Komponent `DropdownList` zwraca "trafienia" w kolejności alfabetycznej, z wizualnym podkreśleniem wyszukiwanego słowa
23 | - Wyszukiwanie ma nie być case sensitive, fraza `word` zostanie wyszukana również jako `Word`.
24 | * [ ] Postaraj się odwzorować wygląd komponentu.
25 | * [ ] Jako pozycje do wyszukiwania użyj danych `searchData` .
26 |
27 | ## Kawałek kodu dla lepszego początku!
28 |
29 | ```javascript
30 | const searchData = [
31 | {
32 | name:"Fixed TOC - table of contents for WordPress plugin",
33 | regularPrice: 20,
34 | salePrice: 3.99
35 | },
36 | {
37 | name:"Jobify - The Most Popular WordpPress Job Board Theme".
38 | regularPrice: 59,
39 | salePrice: 3.99
40 | },
41 | {
42 | name:"Lorem ipsum".
43 | regularPrice: 99,
44 | salePrice: 21,
45 | }
46 | ]
47 |
48 | const DropdownItem = ()=>{}
49 | const DropdownList = ()=>{}
50 | const SearchWithDropdown = ()=>{}
51 | ```
52 |
53 | 
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/Zbiór React/Components/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Przemocny/zbior-zadan-html-css-js-react/cc6652b761b73d71a23eb0dfdea28bed2c1f9dc9/Zbiór React/Components/search.png
--------------------------------------------------------------------------------
/Zbiór React/SimpleLogic/CompountSideBar.md:
--------------------------------------------------------------------------------
1 | Tap Bar
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - JavaScript, HTML, React
8 |
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - JavaScript, HTML, React
13 |
14 | ## Cele główne
15 | * [ ] Korzystając z `React.Context` stwórz grupę koponentów typu compound. Możesz korzystać z hooka `useContext` ale nie musisz
16 | * [ ] Stwórz komponent `Toggler` który jest przyciskiem. Kliknięcie w ten przycisk powoduje pokazanie/schowanie sidebara.
17 | * [ ] Stwórz komponent `Sidebar` który:
18 | - zawiera jakieś menu,
19 | - ma pozycję fixed z lewej strony ekranu,
20 | - ma animację wejścia na ekran i wyjścia poza ekran,
21 | - zajmuje 100% wysokości ekranu i 50% szerokości ekranu
22 |
23 | ## Zadania dodatkowe
24 | * [ ] Brak
25 |
26 | ## Przydatne linki
27 |
28 | React Compound Components - https://blog.logrocket.com/guide-to-react-compound-components-9c4b3eb482e9/
29 |
30 | ## Kawałek kodu dla lepszego początku!
31 | ```javascript
32 | const Toggler = ()=>{
33 | // jest to przycisk, który włacza i wyłącza sidebar
34 | return null
35 | }
36 |
37 | const Sidebar = ()=>{
38 | // to jest sidebar, którzy zawiera jakieś menu
39 | // jest przyczepiony do lewej strony ekranu
40 | // ma animację wejścia na ekran i wyjścia poza ekran
41 | // zajmuje 100% wysokości ekranu i 50% szerokości ekranu
42 | }
43 | ```
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Zbiór React/SimpleLogic/TableWithPagination.md:
--------------------------------------------------------------------------------
1 | Table With Pagination
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 |
7 | - JavaScript, React
8 |
9 |
10 | ## Technologie potrzebne do zadania
11 |
12 | - JavaScript, React
13 |
14 | ## Cele główne
15 | * [ ] Stwórz komponent `PaginatedTable`, który będzie renderował paginowaną tabelkę na podstawie danych przekazanych do propsa `dataEntries` - wygenerowanych przez Ciebie danych.
16 | * [ ] Stwórz komponent `Pagination` który będzie renderował wszystkie przyciski do zmiany stron
17 | * [ ] Stwórz hook `usePagination(dataEntries, elementsOnPage)` który zwraca poniższe dane:
18 | ```javascript
19 | const [
20 | { actualPageIdx, lastPageIdx, entriesOnSelectedPage, isBusy },
21 | { goToFirstPage, goToPrevPage, goToPage, goToNextPage, goToLastPage }
22 | ] = usePagination(dataEntries)
23 | // actualPageIdx to index aktualnej strony
24 | // lastPageIdx to index ostatniej strony
25 | // entriesOnSelectedPage to przy elementsOnPage = 50 zawiera 50 elementów z dataEntries dla aktualnej strony
26 | // isBusy - boolean true/false, defaultowo false, który jest włączony na 333ms podczas gdy zmieniana jest strona i wyświetlane są nowe dane
27 |
28 | // goToPage(pageIdx) - zmienia daną stronę
29 | // goToFirstPage, goToPrevPage, goToNextPage, goToLastPage - zmienia stronę na odpowiednią
30 | ```
31 |
32 | ## Cele dodatkowe
33 | * [ ] Brak
34 |
35 | ## Przydatne linki
36 |
37 | - Tworzenie własnych hooków - https://pl.reactjs.org/docs/hooks-custom.html
38 |
39 | ## Kawałek kodu na początek
40 | ```javascript
41 | const PaginatedTable = ({ dataEntries }) => {
42 | // ...
43 | return null
44 | }
45 |
46 | const Pagination = ({ paginationState, paginationActions })=>{
47 |
48 | }
49 | const usePagination = (dataEntries, elementsOnPage=50) => {
50 | // ...
51 | // return [paginationState, paginationActions]
52 | }
53 | ```
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/Zbiór React/SimpleLogic/useGeo.md:
--------------------------------------------------------------------------------
1 | Przykładowe zadanie ze zbiorow Gladiatorów Javascriptu. Kup nasze zbiory już dziś!
2 | https://gladiators-of-javascript.com/#gladiators
3 |
4 | useGeo hook
5 |
6 |
7 |
8 | ## Wymagana wiedza
9 |
10 | - JavaScript, React
11 |
12 |
13 | ## Technologie potrzebne do zadania
14 |
15 | - JavaScript, React
16 |
17 | ## Cele główne
18 | * [ ] Stwórz custom hook `useGeo`, który dodaje do komponentu poniższe właściwości:
19 | - `geoData` - zwraca wszystkie informacje geolokalizacyjne z window
20 | - `toggleListening` - true/false - akcja, która przyjmuje true/false i włacza lub wyłącza nasłuch na geolokalizacji
21 |
22 | * [ ] Sprawdź czy Twój hook działa poprawnie:
23 | - zwraca poprawny typ danych = `[boolean, function]`
24 | - włącza i wyłącza nasłuch na geolokalizacji
25 | - zwraca latitude i longitude
26 |
27 | * [ ] Zamockuj window oraz metody niezbędne do geolokalizacji ustawiając:
28 | - defaultowo lat i long na Londyn
29 | - ustawiając defaultowo nasłuch na wyłączony
30 |
31 | ## Cele dodatkowe
32 | * [ ] Brak
33 |
34 | ## Przydatne linki
35 | - latitude i longitude - https://www.latlong.net/
36 | - Tworzenie własnych hooków - https://pl.reactjs.org/docs/hooks-custom.html
37 |
38 | ## Kawałek kodu na lepszy początek
39 | ```javascript
40 | const useGeo = (ref) => {
41 | // return [geoData, toggleListening]
42 | }
43 | ```
44 |
45 |
--------------------------------------------------------------------------------
/Zbiór backend/express_or_next/bearerMiddleware.md:
--------------------------------------------------------------------------------
1 | Przykładowe zadanie ze zbiorow Gladiatorów Javascriptu. Kup nasze zbiory już dziś!
2 | https://gladiators-of-javascript.com/#gladiators
3 |
4 | Bearer token middleware
5 |
6 |
7 |
8 | ## Wymagana wiedza
9 | - Solidne podstawy JS-a.
10 | - Asynchroniczność(promise, async/await).
11 | - Podstawowa znajomość mechaniznów zabezpieczenia "bearer-token".
12 | - Podstawowa znajmość jednej z nizej wymienionych baz danych.
13 |
14 | ## Technologie potrzebne do zadania
15 |
16 | - Express.js lub Next.js.
17 | - mongoDB/PostgreSQL/Redis
18 |
19 | ## Cele główne
20 |
21 | * [ ] Na postawie tokenów przekazywanych w **Request Headers** oraz jednej dowolnej bazy danych **(mongo/sql/redis)** weryfikuj czy dany request jest zawiera poprawny token.
22 | * [ ] Jeśli request nie zawiera odpowiedniego **tokenu**, to response powinien zwracać odpowiedni komunikat i status
23 |
24 | ## Cele opcjonalne do wykonania
25 |
26 | - Brak
27 |
28 | ## Przydatne linki
29 |
30 | - Czym są middleware w express - https://developer.okta.com/blog/2018/09/13/build-and-understand-express-middleware-through-examples
31 | - Czym są bearer tokeny - https://stackoverflow.com/questions/25838183/what-is-the-oauth-2-0-bearer-token-exactly/25843058
32 |
33 | ## Kawałek kodu dla lepszego początku!
34 |
35 | ```javascript
36 | function bearerTokenMiddleware(){
37 | // ...
38 | }
39 |
40 | // aby użyć to tak w expressie
41 | const server = express()
42 | server.use(bearerTokenMiddleware)
43 | ```
44 |
--------------------------------------------------------------------------------
/Zbiór backend/express_or_next/googleSheetIntegration.md:
--------------------------------------------------------------------------------
1 | Google sheet integration
2 |
3 |
4 |
5 | ## Wymagana wiedza
6 | - Solidne podstawy JS-a.
7 | - Asynchroniczność(promise, async/await).
8 | - Podstawowa wiedza z zakresu frontendu(budowa formularza).
9 | - Podstawowa wiedza z zakresu połączenia z usługą google sheet i google drive
10 |
11 | ## Technologie potrzebne do zadania
12 |
13 | - Express.js lub Next.js.
14 |
15 | ## Cele główne
16 |
17 | * [ ] Przygotowanie integracji do google sheets, które będą swoistą bazą danych dla informacji z formularza na stronie(jeśli formularza zawiera imie, naziwsko, e-mail to arkusz google sheets powinien zawierać wszystkie dane z formulrza jako kolumny)
18 | * [ ] Stwórz możliwośc uploadu plików przez formularz na google drive. Do google sheets z informacja do tego formularza ma trafiać link do google drive(jedno kliknięcie aby ściągnąć)
19 | * [ ] Każdy wypełniony formularz ma mieć swój identyfikator i datę utworzenia(timestamp), każdy formularz ma mieć powiązane IP z osobą wysyłająca
20 | * [ ] Każdy formularza powinien mieć podstawową walidacje zarówno po stronie frontendu jak i backendu
21 |
22 | ## Cele opcjonalne do wykonania
23 |
24 | * [ ] Na podstawie IP z formularza dokonaj geolokalizacji osoby wysyłającej
25 |
26 | ## Przydatne linki
27 |
28 | - Przykład integracji node z google sheets - https://dev.to/osumgbachiamaka/how-to-build-an-api-with-nodejs-expressjs-and-google-sheet-1-45gf
29 | - Przykład budowy formularzy w HTML - https://www.htmlgoodies.com/html5/css/working-with-html-forms.html
30 |
31 | ## Kawałek kodu dla lepszego początku!
32 |
33 | ```javascript
34 | // część backendowa opowiedzialna za wysyłkę plików.
35 |
36 | const router = express.Router()
37 |
38 | router.post('/upload', (req,res) =>{
39 |
40 | // ... logika obsługująca wysyłkę plików
41 |
42 | })
43 | //
44 | // częśc frontendowa(potzebujemy jedynie formularza)
45 |
46 |
47 |