2022-08-30 16:13:11 +05:00
|
|
|
/* This file is part of the Notesnook project (https://notesnook.com/)
|
|
|
|
|
*
|
|
|
|
|
* Copyright (C) 2022 Streetwriters (Private) Limited
|
|
|
|
|
*
|
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
* (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/
|
|
|
|
|
|
2022-08-26 16:19:39 +05:00
|
|
|
import React from "react";
|
|
|
|
|
import { ActivityIndicator, useWindowDimensions, View } from "react-native";
|
|
|
|
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
|
|
|
import { useThemeStore } from "../../stores/use-theme-store";
|
|
|
|
|
import { useSettingStore } from "../../stores/use-setting-store";
|
|
|
|
|
import { useTip } from "../../services/tip-manager";
|
|
|
|
|
import { COLORS_NOTE } from "../../utils/color-scheme";
|
|
|
|
|
import { SIZE } from "../../utils/size";
|
|
|
|
|
import { Button } from "../ui/button";
|
|
|
|
|
import Seperator from "../ui/seperator";
|
|
|
|
|
import { Tip } from "../tip";
|
|
|
|
|
import Heading from "../ui/typography/heading";
|
|
|
|
|
import Paragraph from "../ui/typography/paragraph";
|
|
|
|
|
import { notesnook } from "../../../e2e/test.ids";
|
2022-02-28 13:48:59 +05:00
|
|
|
|
|
|
|
|
export const Empty = React.memo(
|
2022-08-27 15:23:11 +05:00
|
|
|
function Empty({
|
|
|
|
|
loading = true,
|
|
|
|
|
placeholderData,
|
|
|
|
|
headerProps,
|
|
|
|
|
type,
|
|
|
|
|
screen
|
|
|
|
|
}) {
|
2022-08-26 16:19:39 +05:00
|
|
|
const colors = useThemeStore((state) => state.colors);
|
2022-02-28 13:48:59 +05:00
|
|
|
const insets = useSafeAreaInsets();
|
|
|
|
|
const { height } = useWindowDimensions();
|
2022-08-26 16:19:39 +05:00
|
|
|
const introCompleted = useSettingStore(
|
|
|
|
|
(state) => state.settings.introCompleted
|
|
|
|
|
);
|
2022-03-03 15:09:30 +05:00
|
|
|
|
2022-02-28 13:48:59 +05:00
|
|
|
const tip = useTip(
|
2022-08-26 16:19:39 +05:00
|
|
|
screen === "Notes" && introCompleted
|
|
|
|
|
? "first-note"
|
|
|
|
|
: placeholderData.type || type,
|
|
|
|
|
screen === "Notes" ? "notes" : null
|
2022-02-28 13:48:59 +05:00
|
|
|
);
|
2022-08-27 15:23:11 +05:00
|
|
|
|
2022-02-28 13:48:59 +05:00
|
|
|
return (
|
|
|
|
|
<View
|
|
|
|
|
style={[
|
|
|
|
|
{
|
|
|
|
|
height: height - (140 + insets.top),
|
2022-08-26 16:19:39 +05:00
|
|
|
width: "80%",
|
|
|
|
|
justifyContent: "center",
|
|
|
|
|
alignSelf: "center"
|
2022-02-28 13:48:59 +05:00
|
|
|
}
|
|
|
|
|
]}
|
|
|
|
|
>
|
|
|
|
|
{!loading ? (
|
|
|
|
|
<>
|
|
|
|
|
<Tip
|
2022-08-26 16:19:39 +05:00
|
|
|
color={
|
|
|
|
|
COLORS_NOTE[headerProps.color?.toLowerCase()]
|
|
|
|
|
? headerProps.color
|
|
|
|
|
: "accent"
|
|
|
|
|
}
|
2022-03-23 12:23:51 +05:00
|
|
|
tip={tip || { text: placeholderData.paragraph }}
|
2022-02-28 13:48:59 +05:00
|
|
|
style={{
|
2022-08-26 16:19:39 +05:00
|
|
|
backgroundColor: "transparent",
|
2022-02-28 13:48:59 +05:00
|
|
|
paddingHorizontal: 0
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
{placeholderData.button && (
|
|
|
|
|
<Button
|
2022-04-01 01:02:04 +05:00
|
|
|
testID={notesnook.buttons.add}
|
2022-02-28 13:48:59 +05:00
|
|
|
type="grayAccent"
|
|
|
|
|
title={placeholderData.button}
|
|
|
|
|
iconPosition="right"
|
|
|
|
|
icon="arrow-right"
|
|
|
|
|
onPress={placeholderData.action}
|
|
|
|
|
accentColor={
|
2022-08-26 16:19:39 +05:00
|
|
|
COLORS_NOTE[headerProps.color?.toLowerCase()]
|
|
|
|
|
? headerProps.color
|
|
|
|
|
: "accent"
|
2022-02-28 13:48:59 +05:00
|
|
|
}
|
|
|
|
|
accentText="light"
|
|
|
|
|
style={{
|
2022-08-26 16:19:39 +05:00
|
|
|
alignSelf: "flex-start",
|
2022-02-28 13:48:59 +05:00
|
|
|
borderRadius: 5,
|
|
|
|
|
height: 40
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
)}
|
|
|
|
|
</>
|
|
|
|
|
) : (
|
|
|
|
|
<>
|
|
|
|
|
<View
|
|
|
|
|
style={{
|
2022-08-26 16:19:39 +05:00
|
|
|
alignSelf: "center",
|
|
|
|
|
alignItems: "flex-start",
|
|
|
|
|
width: "100%"
|
2022-02-28 13:48:59 +05:00
|
|
|
}}
|
|
|
|
|
>
|
|
|
|
|
<Heading>{placeholderData.heading}</Heading>
|
|
|
|
|
<Paragraph size={SIZE.sm} textBreakStrategy="balanced">
|
|
|
|
|
{placeholderData.loading}
|
|
|
|
|
</Paragraph>
|
|
|
|
|
<Seperator />
|
|
|
|
|
<ActivityIndicator
|
|
|
|
|
size={SIZE.lg}
|
2022-08-26 16:19:39 +05:00
|
|
|
color={
|
|
|
|
|
COLORS_NOTE[headerProps.color?.toLowerCase()] || colors.accent
|
|
|
|
|
}
|
2022-02-28 13:48:59 +05:00
|
|
|
/>
|
|
|
|
|
</View>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
</View>
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
(prev, next) => {
|
|
|
|
|
if (prev.loading === next.loading) return true;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Make a tips manager.
|
|
|
|
|
* The tip manager stores many tips. Each tip has following values
|
|
|
|
|
* 1. Text
|
|
|
|
|
* 2. contexts: An array of context strings. // Places where the tip can be shown
|
|
|
|
|
* 3. Button if any.
|
|
|
|
|
* 4. Image/Gif asset.
|
|
|
|
|
*
|
|
|
|
|
* Tip manager adds the following methods -> get(context). Returns a random tip for the following context.
|
|
|
|
|
*
|
|
|
|
|
* Tips can be shown in a sheet or in a list. For sheets, GeneralSheet can be used to
|
|
|
|
|
* render tips.
|
|
|
|
|
*
|
|
|
|
|
* Where can the tips be shown and how?
|
|
|
|
|
* 1. When transitioning, show tips in a sheet. Make sure its useful
|
|
|
|
|
* 2. Replace placeholders with tips.
|
|
|
|
|
* 3. Show tips in editor placeholder.
|
|
|
|
|
* 4. Show tips between list items?
|
|
|
|
|
*
|
|
|
|
|
* Tooltips.
|
|
|
|
|
* Small tooltips can be shown in initial render first time.
|
|
|
|
|
* Especially for items that are not shown on blank page. Should be
|
|
|
|
|
* in places where it makes sense and does not interrupt the user.
|
|
|
|
|
*
|
|
|
|
|
* Can also be shown when first time entering a screen that
|
|
|
|
|
* has something that the user might not know of. Like sorting and side menu.
|
|
|
|
|
*
|
|
|
|
|
* Todo:
|
|
|
|
|
* 1. Make a tip manager.
|
|
|
|
|
* 2. Make a list of tips.
|
|
|
|
|
* 3. Add images for those tips.
|
|
|
|
|
* 4. Show tips
|
|
|
|
|
*/
|