images are now saved locally
This commit is contained in:
+28
-9
@@ -4,6 +4,7 @@ import adeptusAstartesIcon from "../assets/adeptusAstartesIcon.png";
|
|||||||
import rangedIcon from "../assets/rangedIcon.png";
|
import rangedIcon from "../assets/rangedIcon.png";
|
||||||
import { Arrow, wavyLine } from "../assets/icons";
|
import { Arrow, wavyLine } from "../assets/icons";
|
||||||
import { Weapons, hasDifferentProfiles } from "./Weapons";
|
import { Weapons, hasDifferentProfiles } from "./Weapons";
|
||||||
|
import { useLocalStorage } from "../helpers/useLocalStorage";
|
||||||
|
|
||||||
export const Roster = ({ roster, onePerPage }) => {
|
export const Roster = ({ roster, onePerPage }) => {
|
||||||
if (!roster) {
|
if (!roster) {
|
||||||
@@ -64,7 +65,6 @@ const Force = ({ force, onePerPage }) => {
|
|||||||
const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
||||||
const [hide, setHide] = useState(false);
|
const [hide, setHide] = useState(false);
|
||||||
const uploadRef = useRef();
|
const uploadRef = useRef();
|
||||||
const [image, setImage] = useState(null);
|
|
||||||
let {
|
let {
|
||||||
name,
|
name,
|
||||||
meleeWeapons,
|
meleeWeapons,
|
||||||
@@ -77,6 +77,8 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
modelList,
|
modelList,
|
||||||
cost,
|
cost,
|
||||||
} = unit;
|
} = unit;
|
||||||
|
const [image, setImage] = useLocalStorage("image" + name);
|
||||||
|
const hasImage = image && image !== "undefined";
|
||||||
|
|
||||||
const weapons = [...meleeWeapons, ...rangedWeapons];
|
const weapons = [...meleeWeapons, ...rangedWeapons];
|
||||||
|
|
||||||
@@ -156,7 +158,7 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
: "",
|
: "",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div
|
<label
|
||||||
className="print-display-none"
|
className="print-display-none"
|
||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: "flex",
|
||||||
@@ -164,11 +166,9 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
justifyContent: "flex-end",
|
justifyContent: "flex-end",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<label className="print-display-none">
|
|
||||||
<input type="checkbox" onChange={() => setHide(!hide)} />
|
<input type="checkbox" onChange={() => setHide(!hide)} />
|
||||||
Don't print this card.
|
<span className="print-display-none">Don't print this card.</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
padding: "24px 0",
|
padding: "24px 0",
|
||||||
@@ -276,10 +276,10 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
top: 0,
|
top: 0,
|
||||||
height: "100%",
|
height: "100%",
|
||||||
bottom: 0,
|
bottom: 0,
|
||||||
width: "50%",
|
width: "45%",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{image && (
|
{hasImage && (
|
||||||
<img
|
<img
|
||||||
src={image}
|
src={image}
|
||||||
alt=""
|
alt=""
|
||||||
@@ -291,7 +291,7 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
style={{
|
style={{
|
||||||
position: "absolute",
|
position: "absolute",
|
||||||
border: "1px solid #999",
|
border: "1px solid #999",
|
||||||
top: 1,
|
top: 2,
|
||||||
right: 1,
|
right: 1,
|
||||||
padding: "1px 4px",
|
padding: "1px 4px",
|
||||||
fontSize: "0.8rem",
|
fontSize: "0.8rem",
|
||||||
@@ -316,8 +316,27 @@ const Unit = ({ unit, index, catalog, onePerPage, forceRules }) => {
|
|||||||
display: "none",
|
display: "none",
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
Upload image
|
{hasImage ? "Change image" : "Upload image "}
|
||||||
</label>
|
</label>
|
||||||
|
{hasImage && (
|
||||||
|
<button
|
||||||
|
className="button print-display-none"
|
||||||
|
style={{
|
||||||
|
position: "absolute",
|
||||||
|
border: "1px solid #999",
|
||||||
|
top: 2,
|
||||||
|
right: 84,
|
||||||
|
padding: "2px 4px",
|
||||||
|
fontSize: "0.8rem",
|
||||||
|
backgroundColor: "#f0f0f0",
|
||||||
|
}}
|
||||||
|
onClick={() => {
|
||||||
|
setImage(undefined);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Clear image
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import { useEffect, useState } from "react";
|
||||||
|
|
||||||
|
export function useLocalStorage(key, initValue) {
|
||||||
|
const [state, setState] = useState(() => {
|
||||||
|
const value = localStorage.getItem(key);
|
||||||
|
if (value) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initValue) {
|
||||||
|
localStorage.setItem(key, initValue);
|
||||||
|
window.dispatchEvent(new Event("storage"));
|
||||||
|
}
|
||||||
|
return initValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log(state);
|
||||||
|
if (!state || state === "undefined") {
|
||||||
|
localStorage.removeItem(key);
|
||||||
|
} else {
|
||||||
|
localStorage.setItem(key, state);
|
||||||
|
}
|
||||||
|
window.dispatchEvent(new Event("storage"));
|
||||||
|
}, [key, state]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const listenStorageChange = () => {
|
||||||
|
setState(() => {
|
||||||
|
const value = localStorage.getItem(key);
|
||||||
|
if (value) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initValue) {
|
||||||
|
localStorage.setItem(key, initValue);
|
||||||
|
window.dispatchEvent(new Event("storage"));
|
||||||
|
}
|
||||||
|
return initValue;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
window.addEventListener("storage", listenStorageChange);
|
||||||
|
return () => window.removeEventListener("storage", listenStorageChange);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return [state, setState];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user