Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Π‘Π΅Π· Ρ€ΡƒΠ±Ρ€ΠΈΠΊΠΈ

🀯 Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ вашСго ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ прилоТСния Neuro React

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ сСгодня ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ состояниС Π½Π° основС намСрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Π‘Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ, Ρ€ΡƒΡ‡Π½Ρ‹ΠΌ двиТСниями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСводят … Π’Π΅Π³ΠΈ с JavaScript, React, Tustorial, WebDev.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ сСгодня ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Государство основанный Π½Π° Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π‘Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ, двиТСниями для Ρ€ΡƒΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ пСрСводят Π½Π° ΠΊΠ»ΠΈΠΊΠΈ, ΠΊΡ€Π°Π½Ρ‹, прСссы ΠΈ Ρ‚. Π”. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ начинаСтся Π² Π½Π°ΡˆΠΈΡ… ΠΌΠΎΠ·Π³Π°Ρ….

БСгодня ΠΌΡ‹ собираСмся ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΈΠΏ прилоТСния. ΠœΡ‹ построим ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ мСняСт Государство Π½Π° основС вашСго ΠšΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ состояниС ΠžΡ‚ΠΊΠ°Π·

Π’Ρ‹ΡΠ»ΡƒΡˆΠ°ΠΉ мСня.

Π§Ρ‚ΠΎ Ссли нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΎ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ WebGL ΠΎΠΊΠ΅Π°Π½ Π½Π° основС вашСго Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ? ΠžΠΏΡ‹Ρ‚ Β«Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ чувствуСтС сСбя.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ Ρ‚Π°ΠΊΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ. И для этого ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π°Ρ€Π½ΠΈΡ‚ΡƒΡ€Ρƒ прСдставлСния.

Начиная

НачнСм с Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ нашСго прилоТСния с созданиСм прилоТСния RACT (CRA). ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² VS-ΠΊΠΎΠ΄Π΅ ΠΈ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ локально.

  • NPX Create-racted-app
  • Код-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΡƒΠΌΠΎΠΌ-ΠΎΠΊΠ΅Π°Π½
  • NPM Start.

Если всС ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ React App View ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

πŸ”‘ аутСнтификация

ΠœΡ‹ Π²Π΅Ρ€ΠΈΠΌ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ понятиС являСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΌΠΎΠ·Π³ΠΎΠ²Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Auth Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ довольно просто. Для этого Π½Π°ΠΌ понадобится Ρ„ΠΎΡ€ΠΌΠ° Π²Ρ…ΠΎΠ΄Π° ΠΈ 3 ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹Π΅ эффСкты для синхронизации состояния Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ВсС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ ΠΌΠΎΠ·Π³ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€, это ΠΠ΅Π²Ρ€Π°ΡΡ‚ΠΎΠ²ΠΎΡΡ‚ΡŒ счСта ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ устройства. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с создания Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ…ΠΎΠ΄Π° Π² систСму, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

// src/components/LoginForm.js
import React, { useState } from "react";

export function LoginForm({ onLogin, loading, error }) {
  const [deviceId, setDeviceId] = useState("");
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  function onSubmit(event) {
    event.preventDefault();
    onLogin({ deviceId, email, password });
  }

  return (
    

Login

{!!error ?

{error}

: null}
setDeviceId(e.target.value)} />
setEmail(e.target.value)} />
setPassword(e.target.value)} />
); }

πŸ– Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ стили Π€ΠΎΡ€ΠΌΠ° – Π’ΠΎΡ‚ CSS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я использовал ΠžΡ‚ΠΊΠ°Π·

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Ρ‚ состояниС deviceid , элСктронноС письмо ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠžΡ‚ΠΊΠ°Π· ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, наша Ρ„ΠΎΡ€ΠΌΠ° Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ Онлогин ΠΎΠΏΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π’Ρ…ΠΎΠ΄Β». ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅ΠΌ Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠΎΡ€Ρ‹, ΠΊΠΎΠ³Π΄Π° прСдставляСтся прСдставлСниС Ρ„ΠΎΡ€ΠΌΡ‹, Π° Ошибка . ΠžΠΏΠΎΡ€Ρ‹ сообщСний ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ создали наш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π²Ρ…ΠΎΠ΄Π° Π² систСму, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ страницу Π²Ρ…ΠΎΠ΄Π° Π² систСму, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ наш Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

// src/pages/Login.js
import React, { useState, useEffect } from "react";
import { LoginForm } from "../components/LoginForm";

export function Login({ notion, user, setUser, setDeviceId }) {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [error, setError] = useState("");
  const [isLoggingIn, setIsLoggingIn] = useState(false);

  function onLogin({ email, password, deviceId }) {
    if (email && password && deviceId) {
      setError("");
      setEmail(email);
      setPassword(password);
      setDeviceId(deviceId);
    } else {
      setError("Please fill the form");
    }
  }

  return (
    
  );
}

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Form Π²Ρ…ΠΎΠ΄Π°

ЦСлью этой страницы являСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ Π²Ρ…ΠΎΠ΄Π° Π² систСму, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· SetError Ѐункция ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ…ΠΎΠ΄Π° Π² систСму. Для послСднСго, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ синхронизируСтся с элСктронноС письмо , ΠΏΠ°Ρ€ΠΎΠ»ΡŒ И Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ страницу.

useEffect(() => {
  if (!user && notion && email && password) {
    login();
  }

  async function login() {
    setIsLoggingIn(true);
    const auth = await notion
      .login({ email, password })
      .catch(error => {
        setError(error.message);
      });

    if (auth) {
      setUser(auth.user);
    }

    setIsLoggingIn(false);
  }
}, [email, password, notion, user, setUser, setError]);

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Как ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит сСанс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ AUTH AUTH, установлСнный API понятия. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нашими Π’ΠΎΠΉΡ‚ΠΈ () Ѐункция, Ссли Π½Π΅Ρ‚ сСанса аутСнтирования, Ρƒ нас Π΅ΡΡ‚ΡŒ экзСмпляр понятия Π² состоянии, ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» элСктронноС письмо ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ.

ΠžΡ‡Π΅Π½ΡŒ скоро Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹: ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ, setuser, setdeviceId ΠžΡ‚ΠΊΠ°Π· Но ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ сдСлаСм это, Π΄Π°Π²Π°ΠΉΡ‚Π΅ вСрнСмся ΠΊ Π½Π°ΡˆΠ΅ΠΌΡƒ App.js ΠΈ Π½Π°Ρ‡Π½ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ всС это вмСстС.

βš™οΈ состояниС прилоТСния

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ просто, ΠΌΡ‹ просто Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Regive УмСститС ΠšΡ€ΡŽΠΊ, Ρ€ΠΎΡƒΡ‚Π΅Ρ€ rain, ΠΈ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΡ€ΡŽΠΊ для хранСния, ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π²Π°ΠΌ ИспользованиС πŸ‘ πŸ‘ ΠžΡ‚ΠΊΠ°Π· Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ наша общая стратСгия состояния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· сохранСния глобального состояния Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² прилоТСния ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ€Π΅ΠΊΠ²ΠΈΠ·ΠΈΡ‚Ρ‹ Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ.

  • NPM Установка @ Reach/Router Reaction-race

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°, Π½ΠΎ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ 2 ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

// src/App.js
import React, { useState, useEffect } from "react";
import { Router, navigate } from "@reach/router";
import useLocalStorage from "react-use/lib/useLocalStorage";
import { Login } from "./pages/Login";

export function App() {
  const [notion, setNotion] = useState(null);
  const [user, setUser] = useState(null);
  const [deviceId, setDeviceId] = useLocalStorage("deviceId");
  const [loading, setLoading] = useState(true);

  return (
    
      
    
  );
}

πŸ† Π― нашСл Π”ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π Π°ΠΉΠ°Π½ΠΎΠΌ ЀлорСнция (ΠΈ Π΄Ρ€ΡƒΠ·ΡŒΡΠΌΠΈ) Π±Ρ‹Ρ‚ΡŒ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌ балансом ΠΌΠ΅ΠΆΠ΄Ρƒ простотой ΠΈ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒΡŽ. Π˜Ρ… докумСнтация Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ясна ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»Π° ΠΌΠ½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²ΡƒΡŽ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρƒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ½ΡƒΡ‚.

Если Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ интСрСсно, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ deviceid Π’ мСстном Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π½Π΅ΠΌΡƒ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ ΠΈ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²ΠΎΠΉΠ΄Π΅Ρ‚ Π² систСму. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ приятный ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠΏΡ‹Ρ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ нСсколько Ρ€Π°Π·.

🧠 ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ государствСнноС ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° мСстС, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ Установив API ΠΈ импортируя Π΅Π³ΠΎ Π² App.js ΠžΡ‚ΠΊΠ°Π·

  • NPM ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ @neurosity/понятиС

🀯 API понятия обСспСчиваСт ΠΏΠΎΠ»Π½ΡƒΡŽ связь ΠΌΠ΅ΠΆΠ΄Ρƒ устройством ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² зависимости ΠΎΡ‚ ΠΊΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ состояния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Для этого прилоТСния ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ с Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ API.

import { Notion } from "@neurosity/notion";

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ устройству понятия прост. ΠœΡ‹ создали Π½ΠΎΠ²ΡƒΡŽ ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ ΠΈ пропуститС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ устройства. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСт экзСмпляр Π² состояниС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΏΡƒΡ‚Π΅ΠΌ синхронизации deviceid ΠžΡ‚ΠΊΠ°Π·

πŸ“– Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎΠ»Π½ΡƒΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ Π½Π° docs.neurosity.co ΠžΡ‚ΠΊΠ°Π·

useEffect(() => {
  if (deviceId) {
    const notion = new Notion({ deviceId }); // 😲
    setNotion(notion);
  } else {
    setLoading(false);
  }
}, [deviceId]);

Π”Ρ€ΡƒΠ³ΠΎΠ΅ состояниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, это ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ государство.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ синхронизируСтся со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Если ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ Π΅Ρ‰Π΅ Π½Π΅ установлСн, Ρ‚ΠΎ ΠΌΡ‹ пропустим подписку Π½Π° Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ Бобытия Π΄ΠΎ ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ экзСмпляр создан.

useEffect(() => {
  if (!notion) {
    return;
  }

  const subscription = notion.onAuthStateChanged().subscribe(user => {
    if (user) {
      setUser(user);
    } else {
      navigate("/");
    }
    setLoading(false);
  });

  return () => {
    subscription.unsubscribe();
  };
}, [notion]);

Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ сСанс ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ понятия, ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‡Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π²ΠΎΠΉΡ‚ΠΈ Π² систСму ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² состояниС Π² нашСм ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ прилоТСния.

OnauthstateChanged ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΡ‹ΠΉ ΠΈΠ· событий Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании API понятия Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ сСанс сохранится Ρ‡Π΅Ρ€Π΅Π· локальноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅. Π˜Ρ‚Π°ΠΊ, Ссли Π²Ρ‹ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚Π΅ страницу, сСанс Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ ΠΈ OnauthstateChanged Π²Π΅Ρ€Π½Π΅Ρ‚ сСанс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ вмСсто Π½ΡƒΠ»Π΅Π²ΠΎΠΉ . Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ.

Если сСанс Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π½Π° страницу Π²Ρ…ΠΎΠ΄Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π°Π±ΠΎΡ€ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π² состоянии ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ»Π½ΡƒΡŽ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² страницу Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· систСмы.

// src/pages/Logout.js
import { useEffect } from "react";
import { navigate } from "@reach/router";

export function Logout({ notion, resetState }) {
  useEffect(() => {
    if (notion) {
      notion.logout().then(() => {
        resetState();
        navigate("/");
      });
    }
  }, [notion, resetState]);

  return null;
}

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° Β«Π’Ρ‹Ρ…ΠΎΠ΄Β» – это просто Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±Π΅Π· элСмСнтов DOM. ЕдинствСнная Π»ΠΎΠ³ΠΈΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½, это ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ½ΠΈΡ‚ Notion.logout () ΠœΠ΅Ρ‚ΠΎΠ΄, Ссли понятиС экзСмпляр присутствуСт. НаконСц, ΠΎΠ½ пСрСнаправляСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ послС Π²Ρ‹Ρ…ΠΎΠ΄Π°.

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠ°ΠΊ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ App.js ΠžΡ‚ΠΊΠ°Π·

// src/App.js
// ...
import { Logout } from "./pages/Logout";
// ...

return (
  
    {/* ... */}
     {
      setNotion(null);
      setUser(null);
      setDeviceId("");
    }} />
  
);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° аутСнтификация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ прилоТСния Π½Π° основС нашСго ΠšΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ состояниС Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ

🌊 WebGL окСан

ΠœΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° я Π²ΠΈΠ΄Π΅Π» Дэвид WebGL Ocean, я влюбился Π² это. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ понятиС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΠΎΠ³ΠΎΠ΄Ρƒ, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ окСанскиС Π²ΠΎΠ»Π½Ρ‹, ΠΏΠΎΡ‡ΡƒΠ²ΡΡ‚Π²ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ Π·Π°Π±Π°Π²Π½Ρ‹ΠΌ экспСримСнтом.

πŸ’‘ Π—Π°Π±Π°Π²Π½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚: это симуляция Ocean Wave Π±Ρ‹Π»ΠΎ создано Π² 2013 Π³ΠΎΠ΄Ρƒ David Li с JavaScript ΠΈ WebGL. Он Π±Ρ‹Π» прСдставлСн ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ экспСримСнтов Google. Π― Π±Ρ‹Π» Ρ€Π°Π΄ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎ ΠΏΠΎ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠΈ MIT.

Для этой ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части идСя состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WebGL Ocean. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Ocean ( ./src/components/ocean ) ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹.

// src/components/Ocean/Ocean.js
import React, { useState, useEffect, useRef } from "react";
import useRafState from "react-use/lib/useRafState";

import { Simulator, Camera } from "./simulation.js"; // by David Li
import { mapCalmToWeather } from "./weather.js";

const camera = new Camera();

export function Ocean({ calm }) {
  const ref = useRef();
  const [simulator, setSimulator] = useState();
  const [lastTime, setLastTime] = useRafState(Date.now());

  useEffect(() => {
    const { innerWidth, innerHeight } = window;
    const simulator = new Simulator(ref.current, innerWidth, innerHeight);
    setSimulator(simulator);
  }, [ref, setSimulator]);

  useEffect(() => {
    if (simulator) {
      const currentTime = Date.now();
      const deltaTime = (currentTime - lastTime) / 1000 || 0.0;
      setLastTime(currentTime);
      simulator.render(deltaTime, camera);
    }
  }, [simulator, lastTime, setLastTime]);

  return ;
}

И Ссли всС ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ это.

ΠœΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ»Π½Ρ‹ Ocean

ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ здСсь происходит.

  • 1️⃣. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ React Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ элСмСнт холста для сцСны 3D WebGL
  • 2️⃣. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ React’s Π£Π‘Π­Π Π•Π€ Для доступа ΠΊ HTML-элСмСнту Canvas
  • 3️⃣. ΠœΡ‹ создали Π½ΠΎΠ²ΡƒΡŽ Бимулятор ΠΊΠΎΠ³Π΄Π° ссылочныС измСнСния измСняСтся. Бимулятор Класс нСсСт ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ΠΎΠΌ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅Π΄Π²ΠΈΠΆΠΈΠΌΠΎΡΡ‚ΡŒ погодности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Π΅Ρ‚Π΅Ρ€ , Choppiness ΠΈ Π Π°Π·ΠΌΠ΅Ρ€ ΠžΡ‚ΠΊΠ°Π·
  • 4️⃣ ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ UserAf (ProcessanimationFrame) ΠΊΡ€ΡŽΡ‡ΠΎΠΊ для создания Ρ†ΠΈΠΊΠ»Π°, Π³Π΄Π΅ выполняСтся ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ°Π΄Ρ€Π΅ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ.

На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ наши окСанскиС Π²ΠΎΠ»Π½Ρ‹ двиТутся Π½Π° основС статичСских Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠΎΠ³ΠΎΠ΄Ρ‹: мСлководьС , Π²Π΅Ρ‚Π΅Ρ€ ΠΈ Π Π°Π·ΠΌΠ΅Ρ€ ΠžΡ‚ΠΊΠ°Π· Π˜Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ‹ рассмотрим эти настройки ΠΏΠΎΠ³ΠΎΠ΄Ρ‹ Π½Π° основС спокойствиС счСт?

Для этого я создал Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ Π² Weather.js Для сопоставлСния спокойствиС ΠžΡ†Π΅Π½ΠΊΠ° ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ настройкам ΠΏΠΎΠ³ΠΎΠ΄Ρ‹: мСлководьС , Π²Π΅Ρ‚Π΅Ρ€ ΠΈ Π Π°Π·ΠΌΠ΅Ρ€ ΠžΡ‚ΠΊΠ°Π· А Π·Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ синхронизируСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ ΠžΡ†Π΅Π½ΠΊΠ° мСняСтся.

useEffect(() => {
  if (simulator) {
    setWeatherBasedOnCalm(animatedCalm, 0, 0);
  }

  function setWeatherBasedOnCalm(calm) {
    const { choppiness, wind, size } = mapCalmToWeather(calm);
    simulator.setChoppiness(choppiness);
    simulator.setWind(wind, wind);
    simulator.setSize(size);
  }
}, [calm, simulator]);

ΠšΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ΅ состояниС

Π­Ρ‚ΠΎ вСсСлая Ρ‡Π°ΡΡ‚ΡŒ. ИмСнно здСсь ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ ΠΌΠΎΠ·Π³Π° ΠΈ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Π΅Π³ΠΎ Π² состояниС прилоТСния.

Подписавшись Π½Π° Notion.Calm () ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ ΠžΡ†Π΅Π½ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСкунду. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ Π² качСствС ΠΎΠΏΠΎΡ€Ρ‹ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ синхронизируСтся с экзСмпляром ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ ΠΈ с ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠžΡ‚ΠΊΠ°Π· Если эти Π΄Π²Π° состояния ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ бСзопасно ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ ΠžΡ‚ΠΊΠ°Π·

πŸ§˜πŸΏβ™€οΈ. Бпокойная ΠΎΡ†Π΅Π½ΠΊΠ° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° ΠΈΠ· вашСго пассивного ΠΊΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ состояния. Π­Ρ‚Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° основС ΠΠ»ΡŒΡ„Π°-Π’ΠΎΠ»Π½Π° ΠžΡ‚ΠΊΠ°Π· Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹Π΅ ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Π°Ρ€ΡŒΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ 0,0 ΠΊ 1.0 . Π§Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΡ†Π΅Π½ΠΊΠ°, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ A Π‘ΠΏΠΎΠΊΠΎΠΉΠ½Ρ‹ΠΉ Чувство ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ спокойной ΠΎΡ†Π΅Π½ΠΊΠΈ Π½Π°Π΄ 0,3 Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ спокойный Π±Π°Π»Π», Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π³Π»Π°Π·, сохраняя всС Π΅Ρ‰Π΅, Π΄Ρ‹ΡˆΠ°Ρ‚ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ ΠΈΠ»ΠΈ ΠΌΠ΅Π΄ΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

// src/pages/Calm.js
import React, { useState, useEffect } from "react";
import { Ocean } from "../components/Ocean/Ocean";

export function Calm({ user, notion }) {
  const [calm, setCalm] = useState(0);

  useEffect(() => {
    if (!user || !notion) {
      return;
    }

    const subscription = notion.calm().subscribe(calm => {
      const calmScore = Number(calm.probability.toFixed(2));
      setCalm(calmScore);
    });

    return () => {
      subscription.unsubscribe();
    };
  }, [user, notion]);

  return (
    
  );
}

πŸ’‘ ВсС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ понятия, Π² Ρ‚ΠΎΠΌ числС Notion.Calm () Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ подписку RXJS, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для бСзопасной отписания, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π°Π·ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ добавляСм Π½Π°ΡˆΡƒ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΡƒΡŽ страницу Π² App.js ΠžΡ‚ΠΊΠ°Π·

// src/App.js
// ...
import { Calm } from "./pages/Calm";
// ...

// If already authenticated, redirect user to the Calm page
useEffect(() => {
  if (user) {
    navigate("/calm");
  }
}, [user]);

return (
  
    {/* ... */}
    
  
);

И с этим нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Neuro React Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ.

ΠΠ΅Π²Ρ€Π°ΡΡ‚ΠΎΠ²ΠΎΡΡ‚ΡŒ/понятиС-ΠΎΠΊΠ΅Π°Π½

🌊 Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠΎΠ·Π³ΠΎΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ для управлСния Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ WebGL ΠΎΠΊΠ΅Π°Π½Π°

Π― Π²Π·Π²ΠΎΠ»Π½ΠΎΠ²Π°Π½ ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π»ΠΈΡΡŽΡ‚, ΠΊΡ‚ΠΎ ΠΌΡ‹ являСмся Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ·Π³ отличаСтся, Π½ΠΎ ΠΌΡ‹ сохраняСм ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠΏΡ‹Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π§Ρ‚ΠΎ Ссли прилоТСния Π±Ρ‹Π»ΠΈ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΊ Π’Ρ‹ Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ

Π§Ρ‚ΠΎ Ссли прилоТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π²Π°ΠΌ Ρ€Π°ΡΡΠ»Π°Π±ΠΈΡ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚Π΅ΡΡŒ?

Π§Ρ‚ΠΎ, Ссли Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с вашими ΠΌΠΎΠ·Π³ΠΎΠ²Ρ‹ΠΌΠΈ Π²ΠΎΠ»Π½Π°ΠΌΠΈ?

Π§Ρ‚ΠΎ Ссли Π²ΠΈΠ΄Π΅ΠΎΠΈΠ³Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ свой рассказ Π½Π° основС Π²Π°ΡˆΠΈΡ… чувств?

Π§Ρ‚ΠΎ, Ссли…

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»: “https://dev.to/neurosity/building-your-first-neuro-app-with-react-49pj”