Merge branch 'active_did_redux' of ssh://173.199.124.46:222/trent_larson/crowd-funder-for-time-pwa into active_did_redux
This commit is contained in:
@@ -52,7 +52,11 @@ import { logger } from "@/utils/logger";
|
||||
import { Contact, ContactMaybeWithJsonStrings } from "@/db/tables/contacts";
|
||||
import { Account } from "@/db/tables/accounts";
|
||||
import { Temp } from "@/db/tables/temp";
|
||||
import { QueryExecResult, DatabaseExecResult } from "@/interfaces/database";
|
||||
import {
|
||||
QueryExecResult,
|
||||
DatabaseExecResult,
|
||||
SqlValue,
|
||||
} from "@/interfaces/database";
|
||||
import {
|
||||
generateInsertStatement,
|
||||
generateUpdateStatement,
|
||||
@@ -285,7 +289,7 @@ export const PlatformServiceMixin = {
|
||||
return [];
|
||||
}
|
||||
|
||||
return result.values.map((row: unknown[]) => row[0] as string);
|
||||
return result.values.map((row: SqlValue[]) => row[0] as string);
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
"[PlatformServiceMixin] Error getting available account DIDs:",
|
||||
@@ -498,7 +502,10 @@ export const PlatformServiceMixin = {
|
||||
/**
|
||||
* Enhanced database single row query method with error handling
|
||||
*/
|
||||
async $dbGetOneRow(sql: string, params?: unknown[]) {
|
||||
async $dbGetOneRow(
|
||||
sql: string,
|
||||
params?: unknown[],
|
||||
): Promise<SqlValue[] | undefined> {
|
||||
try {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
return await (this as any).platformService.dbGetOneRow(sql, params);
|
||||
@@ -699,7 +706,7 @@ export const PlatformServiceMixin = {
|
||||
|
||||
if (availableAccounts?.values?.length) {
|
||||
const accountDids = availableAccounts.values.map(
|
||||
(row: unknown[]) => row[0] as string,
|
||||
(row: SqlValue[]) => row[0] as string,
|
||||
);
|
||||
logger.debug(
|
||||
"[PlatformServiceMixin] Available accounts for user selection:",
|
||||
@@ -845,7 +852,7 @@ export const PlatformServiceMixin = {
|
||||
async $one(
|
||||
sql: string,
|
||||
params: unknown[] = [],
|
||||
): Promise<unknown[] | undefined> {
|
||||
): Promise<SqlValue[] | undefined> {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
return await (this as any).platformService.dbGetOneRow(sql, params);
|
||||
},
|
||||
@@ -1491,24 +1498,6 @@ export const PlatformServiceMixin = {
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get all account DIDs - $getAllAccountDids()
|
||||
* Retrieves all account DIDs from the accounts table
|
||||
* @returns Promise<string[]> Array of account DIDs
|
||||
*/
|
||||
async $getAllAccountDids(): Promise<string[]> {
|
||||
try {
|
||||
const accounts = await this.$query<Account>("SELECT did FROM accounts");
|
||||
return accounts.map((account) => account.did);
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
"[PlatformServiceMixin] Error getting all account DIDs:",
|
||||
error,
|
||||
);
|
||||
return [];
|
||||
}
|
||||
},
|
||||
|
||||
// =================================================
|
||||
// TEMP TABLE METHODS (for temporary storage)
|
||||
// =================================================
|
||||
@@ -1907,7 +1896,10 @@ export interface IPlatformServiceMixin {
|
||||
params?: unknown[],
|
||||
): Promise<QueryExecResult | undefined>;
|
||||
$dbExec(sql: string, params?: unknown[]): Promise<DatabaseExecResult>;
|
||||
$dbGetOneRow(sql: string, params?: unknown[]): Promise<unknown[] | undefined>;
|
||||
$dbGetOneRow(
|
||||
sql: string,
|
||||
params?: unknown[],
|
||||
): Promise<SqlValue[] | undefined>;
|
||||
$getMasterSettings(fallback?: Settings | null): Promise<Settings | null>;
|
||||
$getMergedSettings(
|
||||
defaultKey: string,
|
||||
@@ -2011,7 +2003,7 @@ declare module "@vue/runtime-core" {
|
||||
// Ultra-concise database methods (shortest possible names)
|
||||
$db(sql: string, params?: unknown[]): Promise<QueryExecResult | undefined>;
|
||||
$exec(sql: string, params?: unknown[]): Promise<DatabaseExecResult>;
|
||||
$one(sql: string, params?: unknown[]): Promise<unknown[] | undefined>;
|
||||
$one(sql: string, params?: unknown[]): Promise<SqlValue[] | undefined>;
|
||||
|
||||
// Query + mapping combo methods
|
||||
$query<T = Record<string, unknown>>(
|
||||
|
||||
90
src/utils/seedPhraseReminder.ts
Normal file
90
src/utils/seedPhraseReminder.ts
Normal file
@@ -0,0 +1,90 @@
|
||||
import { NotificationIface } from "@/constants/app";
|
||||
|
||||
const SEED_REMINDER_KEY = "seedPhraseReminderLastShown";
|
||||
const REMINDER_COOLDOWN_MS = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
|
||||
|
||||
/**
|
||||
* Checks if the seed phrase backup reminder should be shown
|
||||
* @param hasBackedUpSeed - Whether the user has backed up their seed phrase
|
||||
* @returns true if the reminder should be shown, false otherwise
|
||||
*/
|
||||
export function shouldShowSeedReminder(hasBackedUpSeed: boolean): boolean {
|
||||
// Don't show if user has already backed up
|
||||
if (hasBackedUpSeed) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check localStorage for last shown time
|
||||
const lastShown = localStorage.getItem(SEED_REMINDER_KEY);
|
||||
if (!lastShown) {
|
||||
return true; // First time, show the reminder
|
||||
}
|
||||
|
||||
try {
|
||||
const lastShownTime = parseInt(lastShown, 10);
|
||||
const now = Date.now();
|
||||
const timeSinceLastShown = now - lastShownTime;
|
||||
|
||||
// Show if more than 24 hours have passed
|
||||
return timeSinceLastShown >= REMINDER_COOLDOWN_MS;
|
||||
} catch (error) {
|
||||
// If there's an error parsing the timestamp, show the reminder
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Marks the seed phrase reminder as shown by updating localStorage
|
||||
*/
|
||||
export function markSeedReminderShown(): void {
|
||||
localStorage.setItem(SEED_REMINDER_KEY, Date.now().toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the seed phrase backup reminder notification
|
||||
* @returns NotificationIface configuration for the reminder modal
|
||||
*/
|
||||
export function createSeedReminderNotification(): NotificationIface {
|
||||
return {
|
||||
group: "modal",
|
||||
type: "confirm",
|
||||
title: "Backup Your Identifier Seed?",
|
||||
text: "It looks like you haven't backed up your identifier seed yet. It's important to back it up as soon as possible to secure your identity.",
|
||||
yesText: "Backup Identifier Seed",
|
||||
noText: "Remind me Later",
|
||||
onYes: async () => {
|
||||
// Navigate to seed backup page
|
||||
window.location.href = "/seed-backup";
|
||||
},
|
||||
onNo: async () => {
|
||||
// Mark as shown so it won't appear again for 24 hours
|
||||
markSeedReminderShown();
|
||||
},
|
||||
onCancel: async () => {
|
||||
// Mark as shown so it won't appear again for 24 hours
|
||||
markSeedReminderShown();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the seed phrase backup reminder if conditions are met
|
||||
* @param hasBackedUpSeed - Whether the user has backed up their seed phrase
|
||||
* @param notifyFunction - Function to show notifications
|
||||
* @returns true if the reminder was shown, false otherwise
|
||||
*/
|
||||
export function showSeedPhraseReminder(
|
||||
hasBackedUpSeed: boolean,
|
||||
notifyFunction: (notification: NotificationIface, timeout?: number) => void,
|
||||
): boolean {
|
||||
if (shouldShowSeedReminder(hasBackedUpSeed)) {
|
||||
const notification = createSeedReminderNotification();
|
||||
// Add 1-second delay before showing the modal to allow success message to be visible
|
||||
setTimeout(() => {
|
||||
// Pass -1 as timeout to ensure modal stays open until user interaction
|
||||
notifyFunction(notification, -1);
|
||||
}, 1000);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user