Jelajahi Sumber

HW<19>continued

Gennadysht 2 tahun lalu
induk
melakukan
37aa816752

+ 5 - 5
js/19_Redux_pro/hw_19_01 _1.html

@@ -43,7 +43,7 @@
             }
         }
 
-        function actionPromise({ name, promise }) {
+        function actionPromise(name, promise) {
             return async function Exec(dispatch) {
                 dispatch(actionPending(name))               //сигнализируем redux, что промис начался
                 try {
@@ -57,9 +57,9 @@
             };
         }
 
-        const actionPending = (name) => ({ type: 'PROMISE', name: name, status: 'PENDING'  });
-        const actionFulfilled = (name, payload) => ({ type: 'PROMISE', name: name, payload: payload, status: 'FULFILLED'  });
-        const actionRejected = (name, error) => ({ type: 'PROMISE', name: name, error: error, status: 'REJECTED'  });
+        const actionPending = (name) => ({ type: 'PROMISE', name: name, status: 'PENDING' });
+        const actionFulfilled = (name, payload) => ({ type: 'PROMISE', name: name, payload: payload, status: 'FULFILLED' });
+        const actionRejected = (name, error) => ({ type: 'PROMISE', name: name, error: error, status: 'REJECTED' });
 
         const store = createStore(promiseReducer)
 
@@ -71,7 +71,7 @@
 
 
         //let execFunc = actionPromise({ name: "auth", promise: signIn("test457", "123123", "http://shop-roles.node.ed.asmer.org.ua/graphql") });
-        store.dispatch(execFunc);
+       // store.dispatch(execFunc);
 
         /*
                 const actionPending = () => ({ type: 'PROMISE', status: 'PENDING' })

+ 98 - 0
js/19_Redux_pro/hw_19_02_auth.html

@@ -0,0 +1,98 @@
+<header>reducers auth</header>
+
+<body>
+    <div id="testDiv">
+        Test
+    </div>
+
+    <script>
+        function jwtDecode(token) {                         // расщифровки токена авторизации
+            if (!token || typeof token != "string")
+                return undefined;
+            let tokenArr = token.split(".");
+            if (tokenArr.length != 3)
+                return undefined;
+            try {
+                let tokenJsonStr = atob(tokenArr[1]);
+                let tokenJson = JSON.parse(tokenJsonStr);
+                return tokenJson;
+            }
+            catch {
+                return undefined;
+            }
+        }
+        function authReducer(state = {}, action) {                   // диспетчер обработки login
+            if (action) {
+                if (action.type === 'AUTH_LOGIN') {
+                    let newState = { ...state };
+                    newState.token = action.token;
+                    newState.payload = jwtDecode(action.token);
+                    if (!newState.payload) {
+                        newState.token = undefined;
+                    }
+                    return newState;
+                }
+                else if (action.type === 'AUTH_LOGOUT') {
+                    let newState = { ...state };
+                    newState.token = undefined;
+                    newState.payload = undefined;
+                    return newState;
+                }
+            }
+            return state;
+        }
+
+        function createStore(reducer) {
+            let state = reducer(undefined, {})              //стартовая инициализация состояния, запуск редьюсера со state === undefined
+            let cbs = []                                      //массив подписчиков
+
+            const getState = () => state                   //функция, возвращающая переменную из замыкания
+            const subscribe = cb => (cbs.push(cb),            //запоминаем подписчиков в массиве
+                () => cbs = cbs.filter(c => c !== cb))      //возвращаем функцию unsubscribe, которая удаляет подписчика из списка
+
+            function dispatch(action) {
+                if (typeof action === 'function') {         //если action - не объект, а функция
+                    return action(dispatch, getState)       //запускаем эту функцию и даем ей dispatch и getState для работы
+                }
+                const newState = reducer(state, action)      //пробуем запустить редьюсер
+                if (newState !== state) {                    //проверяем, смог ли редьюсер обработать action
+                    state = newState                        //если смог, то обновляем state 
+                    for (let cb of cbs) cb()                //и запускаем подписчиков
+                }
+            }
+
+            return {
+                getState,                                   //добавление функции getState в результирующий объект
+                dispatch,
+                subscribe                                   //добавление subscribe в объект
+            }
+        }
+
+        function actionPromise(promise) {
+            return async function Exec(dispatch) {
+                try {
+                    const payload = await promise           //ожидаем промиса;
+                    dispatch(actionAuthLogin(payload)); //сигнализируем redux, что промис успешно выполнен
+                    return payload                              //в месте запуска store.dispatch с этим thunk можно так же получить результат промиса
+                }
+                catch (error) {
+                    dispatch(actionLogOut())           //в случае ошибки - сигнализируем redux, что промис несложился
+                }
+            };
+        }
+
+
+        const actionAuthLogin = token => ({ type: 'AUTH_LOGIN', token });
+        const actionAuthLogout = () => ({ type: 'AUTH_LOGOUT' });
+
+        const store = createStore(authReducer)
+
+        store.subscribe(() => {
+            console.log(store.getState())
+        });
+        const token =
+            "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOiI2Mzc3ZTEzM2I3NGUxZjVmMmVjMWMxMjUiLCJsb2dpbiI6InRlc3Q1IiwiYWNsIjpbIjYzNzdlMTMzYjc0ZTFmNWYyZWMxYzEyNSIsInVzZXIiXX0sImlhdCI6MTY2ODgxMjQ1OH0.t1eQlRwkcP7v9JxUPMo3dcGKprH-uy8ujukNI7xE3A0"
+        store.dispatch(actionAuthLogin(token));
+        store.dispatch(actionAuthLogout());
+    </script>
+</body>

File diff ditekan karena terlalu besar
+ 117 - 0
js/19_Redux_pro/hw_19_03_cart_reducer.html