diff --git a/components/contexts/GroupProvider.tsx b/components/contexts/GroupProvider.tsx index 16c16c3..b9fc34c 100644 --- a/components/contexts/GroupProvider.tsx +++ b/components/contexts/GroupProvider.tsx @@ -2,6 +2,7 @@ import {createContext, FC, useCallback, useContext, useMemo} from "react"; import {Group} from "../../src/types"; import {useLocalStorage} from "../../src/hooks/useLocalStorage"; import {ReactNodeLike} from "prop-types"; +import pako from "pako"; interface Props { children: ReactNodeLike @@ -23,8 +24,10 @@ interface GroupContextType { renameGroup(name: string, newName: string): void setFactories(name: string, factories: string[], type: 'exports'|'malls'): void - getInputType(uid: string): 'base'|'produced'|'unknown' + + store(): Uint8Array + load(str: Uint8Array): void } const defaultValues: GroupContextType = { @@ -43,12 +46,21 @@ const defaultValues: GroupContextType = { renameGroup() {}, setFactories() {}, - getInputType() {return 'unknown'} + getInputType() {return 'unknown'}, + + store() {return new Uint8Array(0)}, + load() {} } const GroupContext = createContext(defaultValues); export const useGroups = () => useContext(GroupContext) +interface StoredFile { + groups: Record, + basicValues: string[], + excludedSuggestions: string[] +} + export const GroupProvider: FC = ({children}) => { const [excludedSuggestions, setExcludedSuggestions] = useLocalStorage('excludedSuggestions', []) const [basicValues, setBasicValues] = useLocalStorage('basicValues', []) @@ -97,6 +109,25 @@ export const GroupProvider: FC = ({children}) => { else return 'unknown' }, [basicValues, exportedFactories]) + const store = useCallback(() => { + const btoa = (bin: Uint8Array) => Buffer.from(bin).toString('base64') + const value: StoredFile = { + groups, basicValues, excludedSuggestions + } + const uncompressed = JSON.stringify(value) + return pako.deflate(uncompressed) + }, [basicValues, excludedSuggestions, groups]) + + const load = useCallback((compressed: Uint8Array) => { + const atob = (str: string) => Buffer.from(str, 'base64') + const uncompressed = pako.inflate(compressed, {to: "string"}) + const value: StoredFile = JSON.parse(uncompressed) + if (!value.groups || !value.basicValues || !value.excludedSuggestions) return + setGroups(value.groups) + setBasicValues(value.basicValues) + setExcludedSuggestions(value.excludedSuggestions) + }, [setBasicValues, setExcludedSuggestions, setGroups]) + const value: GroupContextType = useMemo(() => ({ doNotSuggest, exportedFactories, @@ -113,7 +144,10 @@ export const GroupProvider: FC = ({children}) => { renameGroup, setFactories, - getInputType - }), [addGroup, basicValues, doNotSuggest, excludedSuggestions, exportedFactories, getInputType, groups, removeGroup, renameGroup, setBasicValues, setExcludedSuggestions, setFactories]) + getInputType, + + store, + load + }), [addGroup, basicValues, doNotSuggest, excludedSuggestions, exportedFactories, getInputType, groups, load, removeGroup, renameGroup, setBasicValues, setExcludedSuggestions, setFactories, store]) return {children} } diff --git a/components/home/FactorySelect/FactorySelect.tsx b/components/home/FactorySelect/FactorySelect.tsx index 58200a2..3d1187c 100644 --- a/components/home/FactorySelect/FactorySelect.tsx +++ b/components/home/FactorySelect/FactorySelect.tsx @@ -24,7 +24,6 @@ const FactorySelectBase: FC = ({id, factories, onSetFactories}) => { .filter(isNonNullable)) }, [factories]) - console.log("fddsdfd") return { + const stream = evt.currentTarget.files?.[0].stream() as globalThis.ReadableStream|undefined + if (stream) { + const array = await streamToArrayBuffer(stream) + load(array) + if (inputRef.current) inputRef.current.value = null as unknown as string + } + }}/>
Missing export factories @@ -90,7 +93,10 @@ export const HomeComponent: FC = () => {
{ - Object.values(groups).sort(sortByProperty(g => g.name)).map((group) => ) + Object + .values(groups) + .sort((a, b) => a.name.localeCompare(b.name)) + .map((group) => ) }
diff --git a/src/download.ts b/src/download.ts new file mode 100644 index 0000000..0fd4490 --- /dev/null +++ b/src/download.ts @@ -0,0 +1,29 @@ +export function download(filename: string, data: Uint8Array) { + const tag = document.createElement("a"); + tag.style.display = "none"; + document.body.appendChild(tag); + const blob = new Blob([data], {type: "octet/stream"}), + url = window.URL.createObjectURL(blob); + tag.href = url; + tag.download = filename; + tag.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(tag); +} + +export async function streamToArrayBuffer(stream: ReadableStream): Promise { + let result = new Uint8Array(0); + const reader = stream.getReader(); + while (true) { // eslint-disable-line no-constant-condition + const { done, value } = await reader.read(); + if (done) { + break; + } + + const newResult = new Uint8Array(result.length + value.length); + newResult.set(result); + newResult.set(value, result.length); + result = newResult + } + return result; +}