diff --git a/web/src/helpers/consts.ts b/web/src/helpers/consts.ts index a990a91f8..4e6a51875 100644 --- a/web/src/helpers/consts.ts +++ b/web/src/helpers/consts.ts @@ -11,7 +11,7 @@ export const TOAST_ANIMATION_DURATION = 400; export const DAILY_TIMESTAMP = 3600 * 24 * 1000; // tag regex -export const TAG_REG = /#\s?(.+?)\s/g; +export const TAG_REG = /#(.+?)\s/g; // URL regex export const LINK_REG = /(https?:\/\/[^\s<\\*>']+)/g; diff --git a/web/src/labs/Provider.tsx b/web/src/labs/Provider.tsx deleted file mode 100644 index 7355236fa..000000000 --- a/web/src/labs/Provider.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { useEffect, useState } from "react"; -import { Store } from "./createStore"; - -interface Props { - children: React.ReactElement; - store: Store; - context: React.Context; -} - -/** - * Toy-Redux Provider - * Just for debug with the app store - */ -const Provider: React.FC = (props: Props) => { - const { children, store, context: Context } = props; - const [appState, setAppState] = useState(store.getState()); - - useEffect(() => { - const unsubscribe = store.subscribe((ns) => { - setAppState(ns); - }); - - return () => { - unsubscribe(); - }; - }, []); - - return {children}; -}; - -export default Provider; diff --git a/web/src/labs/combineReducers.ts b/web/src/labs/combineReducers.ts deleted file mode 100644 index 8fcbcd0ff..000000000 --- a/web/src/labs/combineReducers.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Action, Reducer, State } from "./createStore"; - -interface ReducersMapObject { - [key: string]: Reducer; -} - -type StateFromReducersMapObject = M extends ReducersMapObject - ? { [P in keyof M]: M[P] extends Reducer ? S : never } - : never; - -function combineReducers(reducers: ReducersMapObject): Reducer { - const reducerKeys = Object.keys(reducers); - const finalReducersObj: ReducersMapObject = {}; - - for (const key of reducerKeys) { - if (typeof reducers[key] === "function") { - finalReducersObj[key] = reducers[key]; - } - } - - return ((state: StateFromReducersMapObject = {}, action: A) => { - let hasChanged = false; - const nextState: StateFromReducersMapObject = {}; - - for (const key of reducerKeys) { - const prevStateForKey = state[key]; - const nextStateForKey = finalReducersObj[key](prevStateForKey, action); - nextState[key] = nextStateForKey; - hasChanged = hasChanged || nextStateForKey !== prevStateForKey; - } - - return hasChanged ? nextState : state; - }) as any as Reducer; -} - -export default combineReducers; diff --git a/web/src/labs/createStore.ts b/web/src/labs/createStore.ts deleted file mode 100644 index a243ee743..000000000 --- a/web/src/labs/createStore.ts +++ /dev/null @@ -1,63 +0,0 @@ -export type State = Readonly>; -export type Action = { - type: string; - payload: any; -}; - -export type Reducer = (s: S, a: A) => S; -type Listener = (ns: S, ps?: S) => void; -type Unsubscribe = () => void; - -export interface Store { - dispatch: (a: A) => void; - getState: () => S; - subscribe: (listener: Listener) => Unsubscribe; -} - -/** - * Toy-Redux - * @param preloadedState initial state - * @param reducer reducer pure function - * @returns store - */ -function createStore(preloadedState: S, reducer: Reducer): Store, A> { - const listeners: Listener[] = []; - let currentState = preloadedState; - - const dispatch = (action: A) => { - const nextState = reducer(currentState, action); - const prevState = currentState; - currentState = nextState; - - for (const cb of listeners) { - cb(currentState, prevState); - } - }; - - const subscribe = (listener: Listener) => { - let isSubscribed = true; - listeners.push(listener); - - return () => { - if (!isSubscribed) { - return; - } - - const index = listeners.indexOf(listener); - listeners.splice(index, 1); - isSubscribed = false; - }; - }; - - const getState = () => { - return currentState; - }; - - return { - dispatch, - getState, - subscribe, - }; -} - -export default createStore; diff --git a/web/src/labs/useSelector.ts b/web/src/labs/useSelector.ts deleted file mode 100644 index 45cfb1c17..000000000 --- a/web/src/labs/useSelector.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useEffect, useState } from "react"; - -type State = Readonly>; -interface Action { - type: string; -} -type Listener = (ns: S, ps?: S) => void; - -interface Store { - dispatch: (a: A) => void; - getState: () => S; - subscribe: (listener: Listener) => () => void; -} - -export default function useSelector(store: Store): S { - const [state, setState] = useState(store.getState()); - - useEffect(() => { - const unsubscribe = store.subscribe((ns) => { - setState(ns); - }); - - return () => { - unsubscribe(); - }; - }, []); - - return state; -}