Николай Ланец
18 янв. 2021 г., 17:19

Первая простая задача: вывести даты на странице задачи

Всем привет!


Может взяться любой, и не обязательно, чтобы только один был исполнитель. Так проще обмениваться опытом.
Вознаграждения не будет, но будет посильная помощь. :)

У меня такой вопрос я же ставил сборку nextJs мне надо новый проект скачивать или в этом проекте работать?
Олег, в таких случаях почти всегда правильней ветвиться именно от конечного проекта, в данном случае от https://github.com/freecode-academy/freecode.academy
На то две причины:
1. Почти наверняка, если ты попытаешься к себе обновиться через git pull https://github.com/freecode-academy/freecode.academy master, ты получишь конфликты.
2. Даже если ты сможешь разрешить все эти конфликты, велика вероятность, что ты их решишь как минимум чуть не так, как в моем проекте, а значит при попытке слить, будет не только твое решение по конечной задаче, но и эти решения конфликтов, которые в свою очередь могут привести к конфликтам.
3. Даже если конфликтов не возникнет, все равно при мерже возникнет автоматически созданный коммит, который создаст при слиянии лишнюю запись в истории.
Установил сборку из нового репозитория.
Когда запуская yarn start отображается пустая страница и в левой части надпись Main page.

Так и должно быть или что-то пошло не так?
git remote -v
что показывает?
Еще такой вопрос я паралельно курс прохожу по React и там тоже все запускается на http://localhost:3000/. При запуске yarn start он сначала не запустился, когда убил react приложение все запустилось. Вопрос вот в чем, как мне сделать запуск двух приложений, чтобы они не конфликтовали с друг-другом?
origin https://github.com/prisma-cms/nextjs.git (fetch)
origin https://github.com/prisma-cms/nextjs.git (push)
Вот тебе и ответ.
Ты обновился с заготовки https://github.com/prisma-cms/nextjs.git
А должен был с конечного проекта сайта https://github.com/freecode-academy/freecode.academy
Об этом я говорил.
Так я и делал clone https://github.com/freecode-academy/freecode.academy отсюда в новую папку. Как он его умудрился зацепить это же другой проект?
>> Еще такой вопрос я паралельно курс прохожу по React и там тоже все запускается на http://localhost:3000/.
Один порт может быть занят только одним процессом. Соответственно, если ты что-то запустил на порту 3000, то больше ты ничего не запустишь на нем.
Но можно запускаться так:
PORT=3003 yarn dev
PORT 3005 yarn start
Соответственно порт указать любой можно

Я понял Васян, так у тебя в настройках вот что стоит:

How to use

# Clone project git clone https://github.com/prisma-cms/nextjs.git # Install dependencies yarn install # Build bundles yarn build # Start bundled project yarn start

Так я и заклонил опять nextjs
>> Так я и делал clone https://github.com/freecode-academy/freecode.academy отсюда в новую папку. Как он его умудрился зацепить это же другой проект?
Олег, просто так ничего не бывает. Скорее всего ты пытался это сделать, но получил ошибку от гита типа "Не могу создать, папка уже есть" или типа того. Ты проигнорил и дальше стал работать в этой папке.
Выполни
history | grep freecode
и проверь какие ты последние команды выполнял и было ли там что.
Смотри выше ответ. Поменять описание настроек нужно. Иначе не только я буду так запускаться.
Ааа, копипаста - наше все?)))
Не думая и не смотря что выполняешь? Находка для злоумышленника)))
Поправлю.
Кстати, я на гитхабе просто копирую адрес проекта из адресной строки браузера и все. Так нормально клонируется.
Обрати внимание, у меня указано git clone https://github.com/freecode-academy/freecode.academy без всяких .git на конце.
Если на странице задачи нажать редактирование задачи, то можно увидеть 4 поля редактирования дат.
Надо эти даты вывести и на самой странице задачи, просто для просмотра.

Получается на этой же странице нужно вывести и где конкретно ее нужно вывести?
>> Смотри выше ответ. Поменять описание настроек нужно. Иначе не только я буду так запускаться.
Уже поправил. Скоро выкачу в гит.

>> Получается на этой же странице нужно вывести и где конкретно ее нужно вывести?
Да, на этой. На твое усмотрение. Пока задача - освоить технические моменты. Потом постепенно и красоту будем наводить.
Такой вопрос. В react есть файл App, куда мы привязываем все страницы, если так корректно высказываться. Короче смысл в чем, есть ли какая-нибудь статья где описана структура твоего проекта.

По папкам и файлам к примеру:

Здесь react
Здесь nextJs
Здесь CSS
Здесь typeScript
Здесь JS

что- то вроде этого?


Там все максимально подробно, От и До. В чем-то отличия будут, но общие правила будут все теже самые.
В задаче я ссылки дал на файл, в котором работать и на файл-пример. Этого тебе достаточно для выполнения задачи. Сначала сделай хотя бы просто выбор. С оформлением (стилями и т.п.) будем бороться позже.
Вообще на будущее, если планируется обучение на реально проекте. Было бы неплохо начать с того, как все ты эти технологии собрал в кучу react+nextJs+typeScript+GraphQl и начать прям самим собирать это все в кучу, чтобы было понятно откуда куда все прилетает, если конечно это возможно)
Тогда тебе сюда: https://nextjs.org/docs/getting-started
и вот сюда: https://www.apollographql.com/
и еще вот сюда: https://expressjs.com/ru/

И это далеко не все ресурсы, в которых ты боле менее должен ориентироваться, если хочешь знать проект в целом. Хотя бы чуть-чуть...

Олег, у нас нет здесь задачи научить делать проекты с нуля От и До. В современных реалиях это почти нереально (сорри за каламбур).
Задача состоит в том, чтобы каждый более менее освоил какое-то направление (или направления). Каждый по потельности самостоятельно какой-то боле менее крупный проект не сможет сделать, но вместе - вполне. То есть цель проекта - научить и объединить, а так же обеспечить платными задачами. Правильное обозначение целей - уже плюс к вероятности успешного результата.
Короче, что могу сказать, со структорой по видео вроде немного разобрался.

По задаче, смотрю вьюху топика, если правильно понимаю нам нужно вывести такой же стейт во вьюхе задачи:

onChangeState = (data: EditorComponentProps['_dirty']) => { this.updateObject(data) return data }

Но что-то совсем не могу понять, как осуществляется вывод во вьюхе топика в гридах и в коде я не вижу совсем вывода даты.

И если честно не совсем понимаю, как работают компоненты в реакте вроде добавляется, как тег компонент, а у тебя одни переменные с ретурном.

И не совсем понимаю, почему ты скинул для примера именно вьюху топику, там где он создается, а не саму страницу топика где сам вывод?




С топиком, видимо, неудачный пример я привел, потому что в таске вьюха - это функциональный компонент, а в топике классовые. Подробней о различиях между ними читай здесь: https://ru.reactjs.org/docs/components-and-props.html

Если коротко, то у классовых компонентов несколько методов есть и в итоге конечная отрисовка выполняется в методе Component::render, а функциональные - это конечные функции, у которых нет условно дополнительных методов и они как будто и есть функция render, то есть они сами по себе через return возвращают то, что должно быть отрисовано на странице, а вся логика выполняется в них самих (и различных хуках, которые так же выполняются в них). Сразу обозначу, что сейчас я все пишу на функциональных, и вам советую. А где встретятся class-based - это просто legacy, то есть наследие, которое лень было переписывать :)
Итак, тебе следует разобраться с жизненным циклом наших страниц.
1. Основа всего - GraphQL API. Так как данные мы забираем по API, то если мы не можем получить эти данные, то и вывести ничего не можем.
Для того, чтобы выполнить GraphQL-запрос на API-сервер, нам надо этот самый запрос прописать (то есть query task {...} и т.п.). В классическом случае эти запросы прописывались непосредственно в аполло-запросах. Пример: https://www.apollographql.com/docs/react/data/queries/

import { gql, useQuery } from '@apollo/client'; const GET_DOGS = gql` query GetDogs { dogs { id breed } } `; function Dogs({ onDogSelected }) { const { loading, error, data } = useQuery(GET_DOGS); if (loading) return 'Loading...'; if (error) return `Error! ${error.message}`; return ( <select name="dog" onChange={onDogSelected}> {data.dogs.map(dog => ( <option key={dog.id} value={dog.breed}> {dog.breed} </option> ))} </select> ); }
Но это не круто. Представь, что один и тот же запрос выполняться будет в нескольких компонентах. Надо запросы уметь складывать куда-то так, чтобы можно было из разных мест дергать один и тот же. Но тут возникает и другая проблема: надо потом иметь возможность узнавать какие компоненты мы зааффектили, если изменили этот запрос, так как изменения могут быть критическими и надо бежать поправлять все компоненты, которые используют эти запросы. А еще нужна проверка, что эти запросы соответствуют схеме API-сервера, а то вдруг на сервере что-то поменялось и наши запросы сломанные.

Вот для решения этих задач и написан скрипт, который вызывается yarn generate:types
Этот скрипт обращается к API-серверу, тянет его схему и генерирует из него TypeScript типы https://raw.githubusercontent.com/freecode-academy/freecode.academy/master/src/modules/gql/generated/types.ts.
В нем ты можешь найти в том числе и описание модели задачи.

export interface Task extends Node { __typename?: 'Task'; id: Scalars['ID']; createdAt: Scalars['DateTime']; updatedAt: Scalars['DateTime']; name: Scalars['String']; description?: Maybe<Scalars['String']>; content?: Maybe<Scalars['Json']>; status: TaskStatus; TaskProjects?: Maybe<Array<ProjectTask>>; CreatedBy?: Maybe<User>; Members?: Maybe<Array<TaskMember>>; Parent?: Maybe<Task>; Childs?: Maybe<Array<Task>>; RelatedFrom?: Maybe<Array<Task>>; RelatedTo?: Maybe<Array<Task>>; startDatePlaning?: Maybe<Scalars['DateTime']>; endDatePlaning?: Maybe<Scalars['DateTime']>; startDate?: Maybe<Scalars['DateTime']>; endDate?: Maybe<Scalars['DateTime']>; Timers?: Maybe<Array<Timer>>; Reactions?: Maybe<Array<TaskReaction>>; ChatRoom?: Maybe<ChatRoom>; CodeChallengeCompletion?: Maybe<CodeChallengeCompletion>; }
Среди всех полей можно найти как раз нужные нам startDate, endDate, startDatePlaning и endDatePlaning. То есть в принципе, если данные с сервера будут получены, то там и эти поля должны быть. Но на самом деле это зависит от того, какие поля на самом деле прописали в запросах. Так вот, вторая часть указанного скрипта - это пройтись по самому проекту, найти все написанные в нем GraphQL-запросы и сформировать уже для них типы и конечные аполло-запросы.

В нашем случае запрос для страницы задачи написан здесь https://github.com/freecode-academy/freecode.academy/blob/b94b55a4a8fc0a75b2a45eea7a0cf03fc324af25/src/pages/Tasks/Task/gql/task.graphql: (хотя и будет скорее всего в будущем перемещен в https://github.com/freecode-academy/freecode.academy/tree/master/src/gql)


query task($where: TaskWhereUniqueInput!, $timersWhere: TimerWhereInput) { object: task(where: $where) { ...task_ Timers(orderBy: createdAt_DESC, where: $timersWhere) { ...timersConnectionTimer } } }
Обрати внимание на конструкцию ...task_. Троеточие - это указывает на то, что здесь надо вставить другой фрагмент, имя которому легион (нет, task_). Шутка про легион не спроста, таких вложений фрагментов может быть сколько угодно, но GraphQL следит за тем, чтобы они были корректны и составлены по правилам, иначе выдаст ошибку.
Там, как ты видишь, есть вложения и других фрагментов. Но главное, там есть вложение ...TaskNoNesting. В этом фрагменте перечислены нужные нам поля, так что все ОК.

2.Вывод полученных данных на странице.

В результате выполнения этого скрипта у нас появляются готовые функции для выполнения API-запросов, которые содержат в себе все прописанные нами поля. Конкретно для таски у нас вот хук-запрос: https://github.com/freecode-academy/freecode.academy/blob/b94b55a4a8fc0a75b2a45eea7a0cf03fc324af25/src/modules/gql/generated/task.ts#L61-L63

export function useTaskQuery(baseOptions: Apollo.QueryHookOptions<TaskQuery, TaskQueryVariables>) { return Apollo.useQuery<TaskQuery, TaskQueryVariables>(TaskDocument, baseOptions); }
То есть теперь, в любом нашем функциональном компоненте мы можем вызывать этот запрос и в ответ получать запрошенные данные. Что мы и делаем вот здесь: https://github.com/freecode-academy/freecode.academy/blob/b94b55a4a8fc0a75b2a45eea7a0cf03fc324af25/src/pages/Tasks/Task/index.tsx#L32-L35

const response = useTaskQuery({ variables, onError: console.error, })
Надо понимать, что данные самого запрошеггого объекта - это не сам объект response, а его свойство data. Помимо data там есть и другие свойства, типа loading (флаг того, что запрос в процессе выполнения, errors и другие). См официальную документацию: https://www.apollographql.com/docs/react/data/queries/#result

И вот полученный нами объект мы передаем во вьюху: https://github.com/freecode-academy/freecode.academy/blob/b94b55a4a8fc0a75b2a45eea7a0cf03fc324af25/src/pages/Tasks/Task/index.tsx#L52

И там уже получаем свойства этого объекта, как то {task.name}, {task.status} и т.п.
Вот и ты там можешь получить, к примеру, task.startDate и вывести в каком-либо виде. Только следи за ошибками тайпскрипта, потому что эти поля не строчные, а объекты Date. Вот как раз для этого и давал вьюху топика как пример. Смотри как там вывод сделан.
{createdAt ? ( <Typography variant="caption" color="textSecondary"> {moment(createdAt).format('lll')} </Typography> ) : null}
то есть выполняет проверка на наличие значения, и если есть, выводится через форматирование компонентом moment.

Думаю, это должно тебе пролить свет на выполнение задачи.
https://ru.reactjs.org/docs/components-and-props.html Кстати очень хорошая документация, очень доступно все объясняют.
Таки сам постоянно пользуюсь.
Если я правильно понял:
1. Есть файл yarn generate:types, который хранит в себе все модели и парметры всех запросов с типами.

2. Этот же файл yarn generate:types, ходит по проекту и собирает все GraphQL-запросы и компилирует их в Аполло-запросы.

3. Запрсы для GraphQL должны быть написаны специальным способом ...task_, чтобы можно было в них вставлять другие фрагменты. Для того, чтобы подцепить фрагмент он выносится в отдельный файл. Получается вроде базового запроса для которого мы формируем отдельные фрагменты в разных файлах и можем к нему подключить любой фрагмент или поменять.
- Здесь вопрос: вставил этот запрос:


query task($where: TaskWhereUniqueInput!, $timersWhere: TimerWhereInput) { object: task(where: $where) { ...task_ Timers(orderBy: createdAt_DESC, where: $timersWhere) { ...timersConnectionTimer } } }
в https://api.prisma-cms.com/, но он выдал что-то непонятное?

4. В итоге выполнение этого скрипта yarn generate:types, у нас появляются готовые аполо-функции.
- Здесь вопрос: несовсем понятно, как они появляются и где они появляются. Они появляются в конкретных файлах сами и как ты контролируешь появление такого большого количества функций судя по самому файлу? И собственно, как этот файл понимает куда что пихать, а если ты в процессе работы решил новый запрос создать, его нужно перезапустить после создания запроса?

5. После чего делаем вызов запрсоа в функциональном компоненте.

Здесь вопрос:
const response = useTaskQuery({
variables,
onError: console.error, })

Зачем здесь еще переменная variables и что такое onError: console.error откудо оно тянется?

6. В итоге мы делаем вывод в нуждном месте.

Здесь вопрос:

<Grid item>
{CreatedBy ? (
<UserLink user={CreatedBy} withAvatar={false} />
) : null}

{createdAt ? (
<Typography variant="caption" color="textSecondary">
{moment(createdAt).format('lll')} </Typography>
) : null}
</Grid>

Зачем столько гридов мы ими регулируем в каком месте выводить?
CreatedBy & createdAt в чем отличие зачем они нужны?

7. Создание task.startDate, как объект.

Если правильно понимаю у объекта должен быть ключ и значение. По твоему из топика примеру не совсем понятно, как именно он дату выводит больше всего непонятно, как в данном случае вывод обращается к функции из 5 пункта {task.name}, {task.status} , или этот вывод:

{createdAt ? (
<Typography variant="caption" color="textSecondary">
{moment(createdAt).format('lll')}
</Typography>
) : null}

Здесь я так понимаю он вообще к другой функции обращается, так как это из другой оперы.

И какую страницу редактировать в итоге вьюху правильно https://github.com/freecode-academy/freecode.academy/blob/b94b55a4a8fc0a75b2a45eea7a0cf03fc324af25/src/pages/Tasks/Task/View/index.tsx ?

>> Если я правильно понял:
1. Есть файл yarn generate:types,

Нет, неправильно понял. yarn generate:types - это не файл, а выполняемая в терминале команда yarn с подпрограммой generate:types, прописанной в package.json: https://github.com/freecode-academy/freecode.academy/blob/master/package.json#L17.
Тебя не насторожило, что yarn generate:types очень похоже на yarn dev, yarn build, yarn start и т.п. ?

2, 3, 4 - это все вот в этих скриптах: https://github.com/freecode-academy/freecode.academy/tree/master/src/modules/gql/cli/generateTypes. Но тебе пока туда не надо лезть, это все было написано для описания общей картины.

Все остальное - тоже пока много не нужных вопросов. То есть ты пытаешься каждую букву разобрать. Этого не надо делать. Это все равно, как начать учиться водить машину и не тронуться с места, пока не выучишь ДВС со всеми законами термодинамики. Не надо так. Пока что просто вставь куда-нибудь {moment(task.startDate).format('lll')} с проверкой значения и возрадуйся тому, что что-то появится на странице. А потом глубже начнешь копать.

Вставил такой код:
<Grid item> <{createdAt ? ( <Typography variant="caption" color="textSecondary"> {moment(task.startDate).format('lll')} </Typography> ) : null} </Grid>
Он мне подчеркивает createdAt, moment и </Grid>. Походу я сломал TaskViewStyled.

Если просто вставляю:


<Grid item> {moment(task.startDate).format('lll')} </Grid>
Он подчеркивает moment.

Если засовываю в другой грид:


<Grid item xs> <Typography variant="title">{task.name}</Typography> {moment(task.startDate).format('lll')} </Grid>
Он подчеркивает moment.
Так ты на подчеркнутое наведи мышку, появится всплывашка с описанием ошибки. Что за ошибка?
Это уже в третьем варианте:

(alias) moment(inp?: moment.MomentInput, strict?: boolean | undefined): moment.Moment (+2 overloads) export namespace moment
@param strict Strict parsing disables the deprecated fallback to the native Date constructor when parsing a string.
'moment' refers to a UMD global, but the current file is a module. Consider adding an import instead.

Во втором такая же ошибка.

В первом гора ошибок везде.
Сделай так:
git checkout -b with_error git add . git commit -am "WithError" --no-verify git push --no-verify
И пришли ссылку на коммит, посмотрю что у тебя и научу с ошибками работать.

nex@nA-nex:~/git/freecode.academy$ git push --no-verify
fatal: Текущая ветка with_error не имеет вышестоящей ветки.
Чтобы отправить текущую ветку и установить внешнюю ветку как вышестоящую для этой ветки, используйте

git push --set-upstream origin with_error

Ну он тебе и пишет добавь git push --set-upstream origin with_error
К нему же добавь --no-verify, так как иначе не выльет, потому что у тебя ошибки локально есть сейчас.
Итого git push --set-upstream origin with_error --no-verify

Внимание! Вы не должны использовать --no-verify постоянно, то есть почти никогда. Используйте его только тогда, когда надо вылить коммит с ошибками, сознательно. Вы просто этим флагом указываете "Не надо выполнять прехуки на коммит и пуш".

Но вопрос еще что у тебя за origin. Если мой, то ты логично туда не выльешь, тупо потому что прав нет. Я писал сразу: надо делать форк проекта, чтобы на гитхабе иметь свой проект, и с него уже клонироваться и в него пушить свои изменения и оттуда уже в случае успеха отправлять пулл-реквесты на мой проект.
Получается мне нужно сейчас сделать форк, потом все заново переустоновить, воспроизвести ошибку в своем форке, выполнить команды, которые ты прислал и потом сделать пуллреквест?
Нет, не обязательно все переустанавливать. Достаточно просто изменить урл ориджина
git remote set-url orign new_url
Потом проверь
git remote -v
отправил пулл-реквест
Отправлять ПР было рано еще, у тебя же там куча ошибок. Собственно, автоматические тесты ПРа сразу выявили ошибки и поставили крест на нем. https://github.com/freecode-academy/freecode.academy/pull/1/checks?check_run_id=1737032855#step:5:9

Error: 110:14 error 'moment' is not defined no-undef Error: 150:6 error React Hook useMemo has a missing dependency: 'task.startDate'. Either include it or remove the dependency array react-hooks/exhaustive-deps ✖ 2 problems (2 errors, 0 warnings)
Собственно, эти две ошибки ты и должен был увидеть в редакторе своем, а не только тайпскриптовые. Вопрос, у тебя расширение Eslint стоит в редакторе?
Просто TypeScript ругается на ошибки в типизации (они были, потому что ты не импортировал модуль moment). А вот проверки кода синтаксические выполняются эслинтом (чтобы переменные все были, не было не используемых, правила именования и т.п.).
То есть ты должен был при наведении мышкой видеть такую всплывашку:

(alias) moment(inp?: moment.MomentInput, strict?: boolean | undefined): moment.Moment (+2 overloads) export namespace moment @param strict Strict parsing disables the deprecated fallback to the native Date constructor when parsing a string. 'moment' is not defined.eslintno-undef 'moment' refers to a UMD global, but the current file is a module. Consider adding an import instead.ts(2686)
Вот ты или не все скопировал прислал, или просто плагин эслинг не стоит.

Проверку можно выполнить еще через терминал.

yarn lint - запускает эслинт на проверку кода всего проекта.
Результат по твоей репе:
yarn lint yarn run v1.22.5 $ eslint . --ext ts --ext tsx --ext js /disk480/www/freecode.academy/test/p1aton/src/pages/Tasks/Task/View/index.tsx 75:14 error 'moment' is not defined no-undef 111:6 error React Hook useMemo has a missing dependency: 'task.startDate'. Either include it or remove the dependency array react-hooks/exhaustive-deps ✖ 2 problems (2 errors, 0 warnings) error Command failed with exit code 1.
yarn types - Запускает тайпскрипт на проверку всего кода.
yarn types yarn run v1.22.5 $ tsc --pretty --noEmit src/pages/Tasks/Task/View/index.tsx:75:14 - error TS2686: 'moment' refers to a UMD global, but the current file is a module. Consider adding an import instead. 75 {moment(task.startDate).format('lll')} ~~~~~~ Found 1 error. error Command failed with exit code 2.
Эти проверки уже показывают, что в проекте все плохо.


И записал видео с разбором ситуации https://www.youtube.com/watch?v=RZ10Dw2Jl4Q

Eslint не стоит сейчас поставлю.
Кинь правильную ссыль, почитать про хуки.
И подскажи, как правильно мне через гит забрать те измения, которые ты сделал.
>> Кинь правильную ссыль, почитать про хуки.
Подскажи где я дал неправильную ссыль про хуки.

>> И подскажи, как правильно мне через гит забрать те измения, которые ты сделал.
git pull

Они же в твоем проекте теперь.

Подскажи где я дал неправильную ссыль про хуки.
Ты не давал ссылку, сказал почитайте про хуки.

И подскажи, как правильно мне через гит забрать те измения, которые ты сделал.
Я понял, что в моем, только вот не понял, ты получается мою ветку редактировал и там кстати в Action так и висят ошибки.
Значит мне надо делать git pull origin with_error2 ? (просто git pull он же вроде по умолчанию мастер тянет)
>> Ты не давал ссылку, сказал почитайте про хуки.
Ну таки гугл в помощь! Я даю все необходимое, довольно подробно. Если подробно не рассмотрел, значит сейчас не очень важно. Если очень хочется глубже копнуть - то это уже самому. Но я повторюсь еще раз: ты слишком сильно уходишь в сторону. Тебе надо разобраться с малым и далее уже идти к большему. Ты же пытаешься постигнуть сразу большее. В итоге не познаешь ни большего, ни меньшего, плодя только больше и больше вопросов и непонимания.

> просто git pull он же вроде по умолчанию мастер тянет
git pull по умолчанию и всегда тянет все. Просто тянет это в remote-бранчи. Сделай git remote -v и увидишь красным "скрытые бранчи". То есть по сути, когда ты делаешь git pull, он стягивает все не в текущую ветку, а просто все внешнее в их ветки. А вот дальше происходит следующее: если у текущей ветки указан upstream, то он сразу применяет изменения из remote-ветки. Ты выливал же git push --set-upstream origin with_error, то есть сразу с установкой апстрима. В таком случае, если ты находишься в этой ветке и делаешь git pull, он в том числе и накатит сразу изменения из remote-ветки в твою.

В крайнем случае можешь сделать git log чтобы посмотреть какие сейчас коммиты находятся в твоем текущем бранче.
Обновил твои исправления все прилетело нормально, но дата не отображается.

Попробовал возпроизвести, то что ты показывал в видео console.log('task', task); но он тоже ничего не показывает.
Запустил console.log('task', task); в самой консоли выдает такую ошибку:
Uncaught ReferenceError: task is not defined at <anonymous>:1:21 (anonymous) @ VM226:1

А ты как запустил проект после того, как обновился? Какой командой?

>> Запустил console.log('task', task); в самой консоли выдает такую ошибку:
Логично. У нас все переменные локальные, они не должны просто так попадать в консоль браузера, точнее в область видимости объекта window, из которого консоль дергает данные.
А ты как запустил проект после того, как обновился? Какой командой?

Я его не запускал, он у меня был запущен. Просто открыл http://localhost:3005/ и жду результата:)

Видимо надо сделать заново yarn build и yarn start?
Все добавил все даты. Отображаются конечно криво, но все работает.

Как тебе на проверку правильно отправить в git?
>> Как тебе на проверку правильно отправить в git?
>> и там кстати в Action так и висят ошибки.

Оказывается там конфликт был при вливании моего коммита, поэтому не запускались экшены. Пофиксил.
Теперь ПР готов к слиянию https://github.com/freecode-academy/freecode.academy/pull/1

Но я пока не буду его вливать. Вольем все разом. Тебе теперь надо:
1. Закоммититься у себя локально и убедиться что все без ошибок, то есть выполнить
git commit ...
yarn types

2. Если все ОК локально, скачай себе коммит с фиксом.
git pull

git log должен показать в списке коммитов в том числе и #9940ea80b9ea380b41e7b6 Merge branch 'master' into with_error2

3. Если какие-то конфликты возникнут, пофикси.

4. Вылей все обратно на гитхаб
git push
Все готово) осталось только отобразить нормально.

Вот такое обучение мне нравится)
Только надо было еще не забывать включать таймеры, чтобы можно было потом видеть сколько времени потратил на решение.
Можешь теперь вот эту задачу взять в работу: https://freecode.academy/tasks/ckk2nixyrm2wj0730pt6ap42j

Сюда закину, чтобы не потерять про стили в реакте https://styled-components.com/docs/basics#getting-started
Но это еще не все.

Можно вместо селекторов вкладывать другие компоненты.
Пример https://github.com/freecode-academy/freecode.academy/blob/master/src/components/GridTable/styles/index.ts

Это вот эта таблица: https://freecode.academy/tasks?status_in=New&status_in=Accepted&status_in=Progress&status_in=Paused&status_in=RevisionsRequired&status_in=Discuss&status_in=Approved&status_in=Done

Их потом можно как разметку использовать https://github.com/freecode-academy/freecode.academy/blob/master/src/pages/Tasks/View/index.tsx

И можно в своих стилях расширять https://github.com/freecode-academy/freecode.academy/blob/master/src/pages/Tasks/View/styles/index.ts
Это чтобы не придумывать классы row, col и т.п. и не следить, чтобы с кем-то не пересеклись случайно, а просто вот вложенность компонентов делаешь и все, генерится CSS
Олег, заведи себе блокнотик локально :)
Ты выдернул сообщения из контекста и здесь не очень понятно чего для чего.
Лучше освой сначала, и когда прозреешь, напишешь топик-туториал.

Добавить комментарий