import { useArk } from "@lume/ark"; import { InfoIcon, LoaderIcon } from "@lume/icons"; import { useStorage } from "@lume/storage"; import { FETCH_LIMIT } from "@lume/utils"; import { NDKKind } from "@nostr-dev-kit/ndk"; import * as Switch from "@radix-ui/react-switch"; import { useQueryClient } from "@tanstack/react-query"; import { isPermissionGranted, requestPermission, } from "@tauri-apps/plugin-notification"; import { useEffect, useState } from "react"; import { useNavigate } from "react-router-dom"; import { toast } from "sonner"; export function OnboardingScreen() { const ark = useArk(); const storage = useStorage(); const queryClient = useQueryClient(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [apiKey, setAPIKey] = useState(""); const [settings, setSettings] = useState({ notification: false, lowPower: false, translation: false, }); const toggleLowPower = async () => { await storage.createSetting("lowPower", String(+!settings.lowPower)); setSettings((state) => ({ ...state, autoupdate: !settings.lowPower })); }; const toggleTranslation = async () => { await storage.createSetting("translation", String(+!settings.translation)); setSettings((state) => ({ ...state, translation: !settings.translation })); }; const toggleNofitication = async () => { await requestPermission(); setSettings((state) => ({ ...state, notification: !settings.notification, })); }; const completeAuth = async () => { if (settings.translation) { if (!apiKey.length) return toast.warning( "You need to provide Translate API if enable translation", ); await storage.createSetting("translateApiKey", apiKey); } setLoading(true); // get account contacts await ark.getUserContacts(ark.account.pubkey); // refetch newsfeed await queryClient.prefetchInfiniteQuery({ queryKey: ["timeline-9999"], initialPageParam: 0, queryFn: async ({ signal, pageParam, }: { signal: AbortSignal; pageParam: number; }) => { const events = await ark.getInfiniteEvents({ filter: { kinds: [NDKKind.Text, NDKKind.Repost], authors: ark.account.contacts, }, limit: FETCH_LIMIT, pageParam, signal, }); return events; }, }); navigate("/"); }; useEffect(() => { async function loadSettings() { // get notification permission const permissionGranted = await isPermissionGranted(); setSettings((prev) => ({ ...prev, notification: permissionGranted })); // get other settings const data = await storage.getAllSettings(); for (const item of data) { if (item.key === "lowPower") setSettings((prev) => ({ ...prev, lowPower: !!parseInt(item.value), })); if (item.key === "translation") setSettings((prev) => ({ ...prev, translation: !!parseInt(item.value), })); } } loadSettings(); }, []); return (

You're almost ready to use Lume.

Let's start personalizing your experience.

toggleNofitication()} className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800" >

Push notification

Enabling push notifications will allow you to receive notifications from Lume.

toggleLowPower()} className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800" >

Low Power Mode

Limited relay connection and hide all media, sustainable for low network environment

toggleTranslation()} className="relative mt-1 h-7 w-12 shrink-0 cursor-default rounded-full outline-none data-[state=checked]:bg-blue-500 bg-neutral-800" >

Translation (nostr.wine)

Translate text to your preferred language, powered by Nostr Wine

{settings.translation ? (

Translate API Key

setAPIKey(e.target.value)} className="w-full text-xl border-transparent outline-none focus:outline-none focus:ring-0 focus:border-none h-11 rounded-lg ring-0 placeholder:text-neutral-600 bg-neutral-900" />
) : null}

There are many more settings you can configure from the "Settings" screen. Be sure to visit it later.

); }