- Add dev-only "Use 10-minute rollover (testing)" toggle in Reminder Notifications (Account view). Visible only when not on prod API server (isNotProdServer). Toggle persists and reschedules reminder with rolloverIntervalMinutes when changed. - Extend daily notification flow to pass optional rolloverIntervalMinutes to the plugin: NotificationService/NativeNotificationService options, PushNotificationPermission dialog options, first-time and edit flows. - Add settings: reminderFastRolloverForTesting (Settings, AccountSettings, PlatformServiceMixin boolean mapping, migration 007). - Centralize isNotProdServer(apiServer) in constants/app.ts; use in AccountViewView (toggle visibility), ImportAccountView, and TestView. - Add docs/plugin-spec-rollover-interval-minutes.md for the plugin repo (configurable rollover interval and persistence after reboot). Note: Daily notification plugin dependency is currently pointed at the "rollover-interval" branch for testing this feature.
87 lines
3.0 KiB
TypeScript
87 lines
3.0 KiB
TypeScript
/**
|
|
* Generic strings that could be used throughout the app.
|
|
*
|
|
* See also ../libs/veramo/setup.ts
|
|
*/
|
|
export enum AppString {
|
|
// This is used in titles and verbiage inside the app.
|
|
// There is also an app name without spaces, for packaging in the package.json file used in the manifest.
|
|
APP_NAME = "Time Safari",
|
|
APP_NAME_NO_SPACES = "TimeSafari",
|
|
|
|
PROD_ENDORSER_API_SERVER = "https://api.endorser.ch",
|
|
TEST_ENDORSER_API_SERVER = "https://test-api.endorser.ch",
|
|
LOCAL_ENDORSER_API_SERVER = "http://127.0.0.1:3000",
|
|
|
|
PROD_IMAGE_API_SERVER = "https://image-api.timesafari.app",
|
|
TEST_IMAGE_API_SERVER = "https://test-image-api.timesafari.app",
|
|
LOCAL_IMAGE_API_SERVER = "http://127.0.0.1:3001",
|
|
|
|
PROD_PARTNER_API_SERVER = "https://partner-api.endorser.ch",
|
|
TEST_PARTNER_API_SERVER = "https://test-partner-api.endorser.ch",
|
|
// eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
|
|
LOCAL_PARTNER_API_SERVER = "http://127.0.0.1:3000",
|
|
|
|
PROD_PUSH_SERVER = "https://timesafari.app",
|
|
TEST1_PUSH_SERVER = "https://test.timesafari.app",
|
|
TEST2_PUSH_SERVER = "https://timesafari-pwa.anomalistlabs.com",
|
|
|
|
NO_CONTACT_NAME = "(no name)",
|
|
}
|
|
|
|
export const APP_SERVER =
|
|
import.meta.env.VITE_APP_SERVER || "https://timesafari.app";
|
|
|
|
export const DEFAULT_ENDORSER_API_SERVER =
|
|
import.meta.env.VITE_DEFAULT_ENDORSER_API_SERVER ||
|
|
AppString.PROD_ENDORSER_API_SERVER;
|
|
|
|
export const DEFAULT_IMAGE_API_SERVER =
|
|
import.meta.env.VITE_DEFAULT_IMAGE_API_SERVER ||
|
|
AppString.PROD_IMAGE_API_SERVER;
|
|
|
|
export const DEFAULT_PARTNER_API_SERVER =
|
|
import.meta.env.VITE_DEFAULT_PARTNER_API_SERVER ||
|
|
AppString.PROD_PARTNER_API_SERVER;
|
|
|
|
export const DEFAULT_PUSH_SERVER =
|
|
import.meta.env.VITE_DEFAULT_PUSH_SERVER || AppString.PROD_PUSH_SERVER;
|
|
|
|
export const IMAGE_TYPE_PROFILE = "profile";
|
|
|
|
/**
|
|
* True when the current API server is not production (test/local build).
|
|
* Use this to show dev/test-only UI (e.g. 10-minute rollover toggle, test user mnemonic).
|
|
*/
|
|
export function isNotProdServer(apiServer: string): boolean {
|
|
return apiServer !== AppString.PROD_ENDORSER_API_SERVER;
|
|
}
|
|
|
|
export const PASSKEYS_ENABLED =
|
|
!!import.meta.env.VITE_PASSKEYS_ENABLED || false;
|
|
|
|
/**
|
|
* The possible values for "group" and "type" are in App.vue.
|
|
* Some of this comes from the notiwind package, some is custom.
|
|
*/
|
|
export interface NotificationIface {
|
|
group: string; // "alert" | "modal"
|
|
type: string; // "toast" | "info" | "success" | "warning" | "danger"
|
|
title?: string;
|
|
text?: string;
|
|
callback?: (success: boolean) => Promise<void>; // if this triggered an action
|
|
noText?: string;
|
|
onCancel?: (stopAsking?: boolean) => Promise<void>;
|
|
onNo?: (stopAsking?: boolean) => Promise<void>;
|
|
onYes?: () => Promise<void>;
|
|
promptToStopAsking?: boolean;
|
|
yesText?: string;
|
|
membersData?: Array<{
|
|
member: { admitted: boolean; content: string; memberId: number };
|
|
name: string;
|
|
did: string;
|
|
isContact: boolean;
|
|
contact?: { did: string; name?: string; seesMe?: boolean };
|
|
}>; // For passing member data to visibility dialog
|
|
}
|