Skip to content

Instantly share code, notes, and snippets.

View zzdjk6's full-sized avatar

Thor(Shenghan) Chen zzdjk6

  • Palmerston North, New Zealand
View GitHub Profile
// Selectors
// Select the whole loading state object
export const selectLoadingState = (state: RootState) => state.ui.loading;
// Select whether a given routine is loading
export const selectLoading = (routineType: string) => {
return createSelector([selectLoadingState], (state: LoadingState) => {
return !!state[routineType];
});
@zzdjk6
zzdjk6 / types.ts
Last active November 21, 2019 08:40
Listing 0: Type Definition of Loading State
// State
// To know more about Record type, see https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkt
export type LoadingState = Record<string, boolean>;
@zzdjk6
zzdjk6 / reducer.ts
Last active November 21, 2019 08:41
Listing 1: Loading Reducer
// Reducer
export default (state: LoadingState = {}, action: Action<any>): LoadingState => {
const { type } = action;
const matches = /(.*)\/(REQUEST|SUCCESS|FAILURE)/.exec(type);
// Ignore non-routine actions:
// A routine action should have one of three suffixes:
// ['/REQUEST', '/SUCCESS', '/FAILURE']
if (!matches) return state;
const discount1 = (price, discount) => {
const final = price * (1 - discount);
console.log(`V1 -- Original Price: ${price}, Discount: ${discount}, Final Price: ${final}`);
}
discount1(500, 0.5);
discount1(400, 0.5);
discount1(300, 0.5);
const halfPrice1 = price => discount1(price, 0.5);
@zzdjk6
zzdjk6 / connectToContext.jsx
Created August 21, 2019 23:01
Connect To Context
// @flow
import React from 'react';
type MapValuesToProps = (values: any) => any;
export const connectToContext = (context: React$Context<any>) => (mapValuesToProps: MapValuesToProps) => (
Comp: any
) => {
const wrapped = (props: any) => {
@zzdjk6
zzdjk6 / sendRequest.js
Created August 17, 2019 04:29
WKWebView CORS Solution: sendRequest.js
const sendNativePostRequest = (url, params) => {
return new Promise((resolve, reject) => {
const uuid = uuidv4();
_.set(window, `jsCallbackBridge.promises.${uuid}`, { resolve, reject });
const body = ''; //TODO: construct body
window.webkit.messageHandlers.native.postMessage({
type: 'SEND_HTTP_REQUEST',
url,
body,
@zzdjk6
zzdjk6 / callback.js
Created August 17, 2019 04:03
WKWebView CORS Solution: callback.js
import _ from 'lodash';
const resolvePromise = (uuid, resolveData, rejectReason) => {
const promise = _.get(window, `jsCallbackBridge.promises.${uuid}`);
if (!promise) {
return;
}
const { resole, reject } = {...promise};
@zzdjk6
zzdjk6 / ProcessResult.swift
Last active August 17, 2019 03:56
WKWebView CORS Solution: ProcessResult.swift
if let error = error {
let js = "window.jsCallbackBridge.resolvePromise('\(uuid)', null, '\(error.localizedDescription)')"
DispatchQueue.main.async {
self.webView?.evaluateJavaScript(js, completionHandler: nil)
}
return
}
guard let response = response as? HTTPURLResponse, (200...299).contains(response.statusCode) else {
let js = "window.jsCallbackBridge.resolvePromise('\(uuid)', null, 'server error')"
@zzdjk6
zzdjk6 / WebAppViewController.swift
Last active August 17, 2019 04:04
WKWebView CORS Solution: WebAppViewController.swift
class WebAppViewController: UIViewController {
var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
let contentController = WKUserContentController()
contentController.add(self, name: "native")
// 1. Define a routine
const FetchDataRoutine: createThunkRoutine<DataType, Error>('FETCH_DATA')
// 2. Create a thunk
const fetchData = () => async (dispatch: Dispatch, getState: () => RootState) => {
dispatch(FetchDataRoutine.request());
try {
const data = await api.fetchData();
dispatch(FetchDataRoutine.success(data));
} catch (e) {