memos/web/src/store/module/location.ts
boojack ef621a444f
refactor: introducing use{Module}Store instead of service (#768)
* refactor: introducing `useEditorStore`

* refactor: update

* chore: update
2022-12-18 15:25:18 +08:00

122 lines
3 KiB
TypeScript

import { stringify } from "qs";
import store, { useAppSelector } from "../";
import { setQuery, setPathname, Query, updateStateWithLocation, updatePathnameStateWithLocation } from "../reducer/location";
const updateLocationUrl = (method: "replace" | "push" = "replace") => {
// avoid pathname confusion when entering from non-home page
store.dispatch(updatePathnameStateWithLocation());
const { query, pathname, hash } = store.getState().location;
let queryString = stringify(query);
if (queryString) {
queryString = "?" + queryString;
} else {
queryString = "";
}
if (method === "replace") {
window.history.replaceState(null, "", pathname + hash + queryString);
} else {
window.history.pushState(null, "", pathname + hash + queryString);
}
store.dispatch(updateStateWithLocation());
};
export const useLocationStore = () => {
const state = useAppSelector((state) => state.location);
return {
state,
getState: () => {
return store.getState().location;
},
updateStateWithLocation: () => {
store.dispatch(updateStateWithLocation());
},
setPathname: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl();
},
pushHistory: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl("push");
},
replaceHistory: (pathname: string) => {
store.dispatch(setPathname(pathname));
updateLocationUrl("replace");
},
setQuery: (query: Query) => {
store.dispatch(setQuery(query));
updateLocationUrl();
},
clearQuery: () => {
store.dispatch(
setQuery({
tag: undefined,
type: undefined,
duration: undefined,
text: undefined,
shortcutId: undefined,
visibility: undefined,
})
);
updateLocationUrl();
},
setMemoTypeQuery: (type?: MemoSpecType) => {
store.dispatch(
setQuery({
type: type,
})
);
updateLocationUrl();
},
setMemoShortcut: (shortcutId?: ShortcutId) => {
store.dispatch(
setQuery({
shortcutId: shortcutId,
})
);
updateLocationUrl();
},
setTextQuery: (text?: string) => {
store.dispatch(
setQuery({
text: text,
})
);
updateLocationUrl();
},
setTagQuery: (tag?: string) => {
store.dispatch(
setQuery({
tag: tag,
})
);
updateLocationUrl();
},
setFromAndToQuery: (from?: number, to?: number) => {
let duration = undefined;
if (from && to && from < to) {
duration = {
from,
to,
};
}
store.dispatch(
setQuery({
duration,
})
);
updateLocationUrl();
},
setMemoVisibilityQuery: (visibility?: Visibility) => {
store.dispatch(
setQuery({
visibility: visibility,
})
);
updateLocationUrl();
},
};
};