mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-04-23 19:37:52 +00:00
changes to saved pinned apps
This commit is contained in:
parent
aa9e2d1178
commit
900fe2a2fb
@ -388,7 +388,7 @@ function App() {
|
|||||||
|
|
||||||
const qortalRequestCheckbox1Ref = useRef(null);
|
const qortalRequestCheckbox1Ref = useRef(null);
|
||||||
useRetrieveDataLocalStorage();
|
useRetrieveDataLocalStorage();
|
||||||
useQortalGetSaveSettings(userInfo?.name);
|
useQortalGetSaveSettings(userInfo?.name, extState === "authenticated");
|
||||||
const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom);
|
const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom);
|
||||||
const [isEnabledDevMode, setIsEnabledDevMode] =
|
const [isEnabledDevMode, setIsEnabledDevMode] =
|
||||||
useRecoilState(enabledDevModeAtom);
|
useRecoilState(enabledDevModeAtom);
|
||||||
|
@ -40,6 +40,10 @@ export const sortablePinnedAppsAtom = atom({
|
|||||||
{
|
{
|
||||||
name: 'Q-Manager',
|
name: 'Q-Manager',
|
||||||
service: 'APP'
|
service: 'APP'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Q-Blog',
|
||||||
|
service: 'APP'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
@ -407,7 +407,7 @@ export const AppsDesktop = ({ mode, setMode, show , myName, goToHome, setDesktop
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
</ButtonBase> */}
|
</ButtonBase> */}
|
||||||
<Save isDesktop disableWidth />
|
<Save isDesktop disableWidth myName={myName}/>
|
||||||
{isEnabledDevMode && (
|
{isEnabledDevMode && (
|
||||||
<ButtonBase
|
<ButtonBase
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
@ -282,7 +282,7 @@ export const AppsDevMode = ({ mode, setMode, show , myName, goToHome, setDesktop
|
|||||||
/>
|
/>
|
||||||
</IconWrapper>
|
</IconWrapper>
|
||||||
</ButtonBase>
|
</ButtonBase>
|
||||||
<Save isDesktop disableWidth />
|
<Save isDesktop disableWidth myName={myName} />
|
||||||
<ButtonBase
|
<ButtonBase
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setDesktopViewMode('dev')
|
setDesktopViewMode('dev')
|
||||||
|
@ -11,7 +11,7 @@ import { useRecoilState } from 'recoil';
|
|||||||
import { enabledDevModeAtom } from '../atoms/global';
|
import { enabledDevModeAtom } from '../atoms/global';
|
||||||
import { AppsIcon } from '../assets/Icons/AppsIcon';
|
import { AppsIcon } from '../assets/Icons/AppsIcon';
|
||||||
|
|
||||||
export const DesktopSideBar = ({goToHome, setDesktopSideView, toggleSideViewDirects, hasUnreadDirects, isDirects, toggleSideViewGroups,hasUnreadGroups, isGroups, isApps, setDesktopViewMode, desktopViewMode }) => {
|
export const DesktopSideBar = ({goToHome, setDesktopSideView, toggleSideViewDirects, hasUnreadDirects, isDirects, toggleSideViewGroups,hasUnreadGroups, isGroups, isApps, setDesktopViewMode, desktopViewMode, myName }) => {
|
||||||
const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom)
|
const [isEnabledDevMode, setIsEnabledDevMode] = useRecoilState(enabledDevModeAtom)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -98,7 +98,7 @@ export const DesktopSideBar = ({goToHome, setDesktopSideView, toggleSideViewDire
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
</ButtonBase> */}
|
</ButtonBase> */}
|
||||||
<Save isDesktop disableWidth />
|
<Save isDesktop disableWidth myName={myName} />
|
||||||
{/* <CoreSyncStatus imageSize="30px" position="left" /> */}
|
{/* <CoreSyncStatus imageSize="30px" position="left" /> */}
|
||||||
{isEnabledDevMode && (
|
{isEnabledDevMode && (
|
||||||
<ButtonBase
|
<ButtonBase
|
||||||
|
@ -9,14 +9,17 @@ import {
|
|||||||
settingsQDNLastUpdatedAtom,
|
settingsQDNLastUpdatedAtom,
|
||||||
sortablePinnedAppsAtom,
|
sortablePinnedAppsAtom,
|
||||||
} from "../../atoms/global";
|
} from "../../atoms/global";
|
||||||
import { ButtonBase } from "@mui/material";
|
import { Box, ButtonBase, Popover, Typography } from "@mui/material";
|
||||||
import { objectToBase64 } from "../../qdn/encryption/group-encryption";
|
import { objectToBase64 } from "../../qdn/encryption/group-encryption";
|
||||||
import { MyContext } from "../../App";
|
import { MyContext } from "../../App";
|
||||||
import { getFee } from "../../background";
|
import { getFee } from "../../background";
|
||||||
import { CustomizedSnackbars } from "../Snackbar/Snackbar";
|
import { CustomizedSnackbars } from "../Snackbar/Snackbar";
|
||||||
import { SaveIcon } from "../../assets/svgs/SaveIcon";
|
import { SaveIcon } from "../../assets/svgs/SaveIcon";
|
||||||
import { IconWrapper } from "../Desktop/DesktopFooter";
|
import { IconWrapper } from "../Desktop/DesktopFooter";
|
||||||
export const Save = ({ isDesktop, disableWidth }) => {
|
import { Spacer } from "../../common/Spacer";
|
||||||
|
import { LoadingButton } from "@mui/lab";
|
||||||
|
import { saveToLocalStorage } from "../Apps/AppsNavBar";
|
||||||
|
export const Save = ({ isDesktop, disableWidth, myName }) => {
|
||||||
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom);
|
const [pinnedApps, setPinnedApps] = useRecoilState(sortablePinnedAppsAtom);
|
||||||
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(
|
const [settingsQdnLastUpdated, setSettingsQdnLastUpdated] = useRecoilState(
|
||||||
settingsQDNLastUpdatedAtom
|
settingsQDNLastUpdatedAtom
|
||||||
@ -31,7 +34,7 @@ export const Save = ({ isDesktop, disableWidth }) => {
|
|||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const [infoSnack, setInfoSnack] = useState(null);
|
const [infoSnack, setInfoSnack] = useState(null);
|
||||||
const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom);
|
const [oldPinnedApps, setOldPinnedApps] = useRecoilState(oldPinnedAppsAtom);
|
||||||
|
const [anchorEl, setAnchorEl] = useState(null);
|
||||||
const { show } = useContext(MyContext);
|
const { show } = useContext(MyContext);
|
||||||
|
|
||||||
const hasChanged = useMemo(() => {
|
const hasChanged = useMemo(() => {
|
||||||
@ -83,9 +86,7 @@ export const Save = ({ isDesktop, disableWidth }) => {
|
|||||||
.sendMessage(
|
.sendMessage(
|
||||||
"ENCRYPT_DATA",
|
"ENCRYPT_DATA",
|
||||||
{
|
{
|
||||||
|
data64,
|
||||||
data64,
|
|
||||||
|
|
||||||
},
|
},
|
||||||
60000
|
60000
|
||||||
)
|
)
|
||||||
@ -135,6 +136,7 @@ export const Save = ({ isDesktop, disableWidth }) => {
|
|||||||
message: "Sucessfully published to QDN",
|
message: "Sucessfully published to QDN",
|
||||||
});
|
});
|
||||||
setOpenSnack(true);
|
setOpenSnack(true);
|
||||||
|
setAnchorEl(null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -147,20 +149,31 @@ export const Save = ({ isDesktop, disableWidth }) => {
|
|||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
const handlePopupClick = (event) => {
|
||||||
|
event.stopPropagation(); // Prevent parent onClick from firing
|
||||||
|
setAnchorEl(event.currentTarget);
|
||||||
|
};
|
||||||
|
|
||||||
|
const revertChanges = () => {
|
||||||
|
setPinnedApps(oldPinnedApps);
|
||||||
|
saveToLocalStorage("ext_saved_settings", "sortablePinnedApps", null);
|
||||||
|
setAnchorEl(null)
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ButtonBase
|
<ButtonBase
|
||||||
onClick={saveToQdn}
|
onClick={handlePopupClick}
|
||||||
disabled={
|
disabled={
|
||||||
!hasChanged ||
|
// !hasChanged ||
|
||||||
!canSave ||
|
// !canSave ||
|
||||||
isLoading ||
|
isLoading
|
||||||
settingsQdnLastUpdated === -100
|
// settingsQdnLastUpdated === -100
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{isDesktop ? (
|
{isDesktop ? (
|
||||||
<IconWrapper
|
<IconWrapper
|
||||||
disableWidth={disableWidth}
|
disableWidth={disableWidth}
|
||||||
color="rgba(250, 250, 250, 0.5)"
|
color="rgba(250, 250, 250, 0.5)"
|
||||||
label="Save"
|
label="Save"
|
||||||
selected={false}
|
selected={false}
|
||||||
@ -187,6 +200,204 @@ export const Save = ({ isDesktop, disableWidth }) => {
|
|||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</ButtonBase>
|
</ButtonBase>
|
||||||
|
<Popover
|
||||||
|
open={!!anchorEl}
|
||||||
|
anchorEl={anchorEl}
|
||||||
|
onClose={() => setAnchorEl(null)} // Close popover on click outside
|
||||||
|
anchorOrigin={{
|
||||||
|
vertical: "bottom",
|
||||||
|
horizontal: "center",
|
||||||
|
}}
|
||||||
|
transformOrigin={{
|
||||||
|
vertical: "top",
|
||||||
|
horizontal: "center",
|
||||||
|
}}
|
||||||
|
sx={{
|
||||||
|
width: "300px",
|
||||||
|
maxWidth: "90%",
|
||||||
|
maxHeight: "80%",
|
||||||
|
overflow: "auto",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
padding: "15px",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
gap: 1,
|
||||||
|
width: '100%'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{!myName ? (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
width: "100%",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
You need a registered Qortal name to save your pinned apps to QDN.
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
{hasChanged && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
width: "100%",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
You have unsaved changes to your pinned apps. Save them to QDN.
|
||||||
|
</Typography>
|
||||||
|
<Spacer height="10px" />
|
||||||
|
<LoadingButton
|
||||||
|
sx={{
|
||||||
|
backgroundColor: "var(--green)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 0.7,
|
||||||
|
"&:hover": {
|
||||||
|
backgroundColor: "var(--green)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 1,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
size="small"
|
||||||
|
loading={isLoading}
|
||||||
|
onClick={saveToQdn}
|
||||||
|
variant="contained"
|
||||||
|
>
|
||||||
|
Save to QDN
|
||||||
|
</LoadingButton>
|
||||||
|
<Spacer height="20px" />
|
||||||
|
{!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated > 0 && (
|
||||||
|
<>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Don't like your current local changes? Would you like to
|
||||||
|
reset to your saved QDN pinned apps?
|
||||||
|
</Typography>
|
||||||
|
<Spacer height="10px" />
|
||||||
|
<LoadingButton
|
||||||
|
size="small"
|
||||||
|
loading={isLoading}
|
||||||
|
onClick={revertChanges}
|
||||||
|
variant="contained"
|
||||||
|
sx={{
|
||||||
|
backgroundColor: "var(--unread)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 0.7,
|
||||||
|
"&:hover": {
|
||||||
|
backgroundColor: "var(--unread)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 1,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Revert to QDN
|
||||||
|
</LoadingButton>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated === 0 && (
|
||||||
|
<>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Don't like your current local changes? Would you like to
|
||||||
|
reset to the default pinned apps?
|
||||||
|
</Typography>
|
||||||
|
<Spacer height="10px" />
|
||||||
|
<LoadingButton
|
||||||
|
loading={isLoading}
|
||||||
|
onClick={revertChanges}
|
||||||
|
variant="contained"
|
||||||
|
>
|
||||||
|
Revert to default
|
||||||
|
</LoadingButton>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
{!isNaN(settingsQdnLastUpdated) && settingsQdnLastUpdated === -100 && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
width: "100%",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
The app was unable to download your existing QDN-saved pinned
|
||||||
|
apps. Would you like to overwrite those changes?
|
||||||
|
</Typography>
|
||||||
|
<Spacer height="10px" />
|
||||||
|
<LoadingButton
|
||||||
|
size="small"
|
||||||
|
loading={isLoading}
|
||||||
|
onClick={saveToQdn}
|
||||||
|
variant="contained"
|
||||||
|
sx={{
|
||||||
|
backgroundColor: "var(--unread)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 0.7,
|
||||||
|
"&:hover": {
|
||||||
|
backgroundColor: "var(--unread)",
|
||||||
|
color: "black",
|
||||||
|
opacity: 1,
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Overwrite to QDN
|
||||||
|
</LoadingButton>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
{!hasChanged && (
|
||||||
|
<Box
|
||||||
|
sx={{
|
||||||
|
width: "100%",
|
||||||
|
display: "flex",
|
||||||
|
flexDirection: "column",
|
||||||
|
alignItems: "center",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography
|
||||||
|
sx={{
|
||||||
|
fontSize: "14px",
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
You currently do not have any changes to your pinned apps
|
||||||
|
</Typography>
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
|
||||||
|
</Box>
|
||||||
|
</Popover>
|
||||||
<CustomizedSnackbars
|
<CustomizedSnackbars
|
||||||
duration={3500}
|
duration={3500}
|
||||||
open={openSnack}
|
open={openSnack}
|
||||||
|
@ -40,7 +40,6 @@ const getPublishRecord = async (myName) => {
|
|||||||
);
|
);
|
||||||
data = await res.text();
|
data = await res.text();
|
||||||
|
|
||||||
|
|
||||||
if(!data) throw new Error('Unable to fetch publish')
|
if(!data) throw new Error('Unable to fetch publish')
|
||||||
|
|
||||||
const decryptedKey: any = await decryptResource(data);
|
const decryptedKey: any = await decryptResource(data);
|
||||||
@ -53,7 +52,8 @@ const getPublishRecord = async (myName) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useQortalGetSaveSettings = (myName) => {
|
|
||||||
|
export const useQortalGetSaveSettings = (myName, isAuthenticated) => {
|
||||||
const setSortablePinnedApps = useSetRecoilState(sortablePinnedAppsAtom);
|
const setSortablePinnedApps = useSetRecoilState(sortablePinnedAppsAtom);
|
||||||
const setCanSave = useSetRecoilState(canSaveSettingToQdnAtom);
|
const setCanSave = useSetRecoilState(canSaveSettingToQdnAtom);
|
||||||
const setSettingsQDNLastUpdated = useSetRecoilState(settingsQDNLastUpdatedAtom);
|
const setSettingsQDNLastUpdated = useSetRecoilState(settingsQDNLastUpdatedAtom);
|
||||||
@ -67,7 +67,7 @@ export const useQortalGetSaveSettings = (myName) => {
|
|||||||
const settings = await getPublish(myName)
|
const settings = await getPublish(myName)
|
||||||
if(settings?.sortablePinnedApps && timestamp > settingsLocalLastUpdated){
|
if(settings?.sortablePinnedApps && timestamp > settingsLocalLastUpdated){
|
||||||
setSortablePinnedApps(settings.sortablePinnedApps)
|
setSortablePinnedApps(settings.sortablePinnedApps)
|
||||||
|
|
||||||
setSettingsQDNLastUpdated(timestamp || 0)
|
setSettingsQDNLastUpdated(timestamp || 0)
|
||||||
} else if(settings?.sortablePinnedApps){
|
} else if(settings?.sortablePinnedApps){
|
||||||
setSettingsQDNLastUpdated(timestamp || 0)
|
setSettingsQDNLastUpdated(timestamp || 0)
|
||||||
@ -87,8 +87,8 @@ export const useQortalGetSaveSettings = (myName) => {
|
|||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
useEffect(()=> {
|
useEffect(()=> {
|
||||||
if(!myName || !settingsLocalLastUpdated) return
|
if(!myName || !settingsLocalLastUpdated || !isAuthenticated) return
|
||||||
getSavedSettings(myName, settingsLocalLastUpdated)
|
getSavedSettings(myName, settingsLocalLastUpdated)
|
||||||
}, [getSavedSettings, myName, settingsLocalLastUpdated])
|
}, [getSavedSettings, myName, settingsLocalLastUpdated, isAuthenticated])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,11 @@ export const useRetrieveDataLocalStorage = () => {
|
|||||||
const pinnedAppsLocal = fetchFromLocalStorage('ext_saved_settings')
|
const pinnedAppsLocal = fetchFromLocalStorage('ext_saved_settings')
|
||||||
if(pinnedAppsLocal?.sortablePinnedApps){
|
if(pinnedAppsLocal?.sortablePinnedApps){
|
||||||
setSortablePinnedApps(pinnedAppsLocal?.sortablePinnedApps)
|
setSortablePinnedApps(pinnedAppsLocal?.sortablePinnedApps)
|
||||||
|
setSettingsLocalLastUpdated(pinnedAppsLocal?.timestamp || -1)
|
||||||
|
} else {
|
||||||
|
setSettingsLocalLastUpdated(-1)
|
||||||
}
|
}
|
||||||
setSettingsLocalLastUpdated(pinnedAppsLocal?.timestamp || -1)
|
|
||||||
}, [])
|
}, [])
|
||||||
useEffect(()=> {
|
useEffect(()=> {
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user