jilo-web/app/classes/feedback.php

224 lines
6.6 KiB
PHP
Raw Normal View History

<?php
2025-02-15 08:13:39 +00:00
class Feedback {
// Feedback types
const TYPE_SUCCESS = 'success';
const TYPE_ERROR = 'danger';
const TYPE_INFO = 'info';
const TYPE_WARNING = 'warning';
2025-02-15 08:13:39 +00:00
// Default feedback message configurations
const NOTICE = [
'DEFAULT' => [
'type' => self::TYPE_INFO,
'dismissible' => true
]
];
const ERROR = [
'DEFAULT' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
]
];
const LOGIN = [
'LOGIN_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'LOGIN_FAILED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'LOGOUT_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'IP_BLACKLISTED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'IP_NOT_WHITELISTED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'TOO_MANY_ATTEMPTS' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
]
];
const SECURITY = [
'WHITELIST_ADD_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'WHITELIST_ADD_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => true
],
'WHITELIST_REMOVE_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'WHITELIST_REMOVE_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => true
],
'BLACKLIST_ADD_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'BLACKLIST_ADD_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => true
],
'BLACKLIST_REMOVE_SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'BLACKLIST_REMOVE_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => true
],
'RATE_LIMIT_INFO' => [
'type' => self::TYPE_INFO,
'dismissible' => false
],
'PERMISSION_DENIED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'IP_REQUIRED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
]
];
2025-02-11 15:25:55 +00:00
const REGISTER = [
'SUCCESS' => [
'type' => self::TYPE_SUCCESS,
'dismissible' => true
],
'FAILED' => [
'type' => self::TYPE_ERROR,
'dismissible' => true
],
'DISABLED' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
];
const SYSTEM = [
'DB_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'DB_CONNECT_ERROR' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
'DB_UNKNOWN_TYPE' => [
'type' => self::TYPE_ERROR,
'dismissible' => false
],
];
private static $strings = null;
/**
2025-02-15 08:13:39 +00:00
* Get feedback message strings
*/
private static function getStrings() {
if (self::$strings === null) {
2025-02-15 08:13:39 +00:00
self::$strings = require __DIR__ . '/../includes/strings.php';
}
return self::$strings;
}
/**
2025-02-15 08:13:39 +00:00
* Get feedback message configuration by key
*/
public static function get($category, $key) {
$config = constant("self::$category")[$key] ?? null;
if (!$config) return null;
$strings = self::getStrings();
$message = $strings[$category][$key] ?? '';
return array_merge($config, ['message' => $message]);
}
/**
2025-02-15 08:13:39 +00:00
* Render feedback message HTML
*/
2025-02-15 08:13:39 +00:00
// Usage: echo Feedback::render('LOGIN', 'LOGIN_SUCCESS', 'custom message [or null]', true [for dismissible; or null], true [for small; or omit]);
2025-01-15 16:22:49 +00:00
public static function render($category, $key, $customMessage = null, $dismissible = null, $small = false, $sanitize = true) {
$config = self::get($category, $key);
if (!$config) return '';
$message = $customMessage ?? $config['message'];
2025-01-07 11:02:57 +00:00
$isDismissible = $dismissible ?? $config['dismissible'] ?? false;
$dismissClass = $isDismissible ? ' alert-dismissible fade show' : '';
2025-01-06 09:43:20 +00:00
$dismissButton = $isDismissible ? '<button type="button" class="btn-close' . ($small ? ' btn-close-sm' : '') . '" data-bs-dismiss="alert" aria-label="Close"></button>' : '';
$smallClass = $small ? ' alert-sm' : '';
return sprintf(
2025-01-06 09:43:20 +00:00
'<div class="alert alert-%s%s%s" role="alert">%s%s</div>',
$config['type'],
$dismissClass,
2025-01-06 09:43:20 +00:00
$smallClass,
2025-01-15 16:22:49 +00:00
$sanitize ? htmlspecialchars($message) : $message,
$dismissButton
);
}
2025-01-23 10:37:10 +00:00
/**
2025-02-15 08:13:39 +00:00
* Get feedback message data for JavaScript
2025-01-23 10:37:10 +00:00
*/
public static function getMessageData($category, $key, $customMessage = null, $dismissible = null, $small = false) {
$config = self::get($category, $key);
if (!$config) return null;
return [
'type' => $config['type'],
'message' => $customMessage ?? $config['message'],
'dismissible' => $dismissible ?? $config['dismissible'] ?? false,
'small' => $small
];
}
/**
2025-02-15 08:13:39 +00:00
* Store feedback message in session for display after redirect
*/
2025-02-15 08:13:39 +00:00
// Usage: Feedback::flash('LOGIN', 'LOGIN_SUCCESS', 'custom message [or null]', true [for dismissible; or null], true [for small; or omit]);
2025-01-07 11:02:57 +00:00
public static function flash($category, $key, $customMessage = null, $dismissible = null, $small = false) {
if (!isset($_SESSION['flash_messages'])) {
$_SESSION['flash_messages'] = [];
}
2025-01-07 11:02:57 +00:00
2025-02-15 08:13:39 +00:00
// Get the feedback message configuration
2025-01-07 11:02:57 +00:00
$config = self::get($category, $key);
$isDismissible = $dismissible ?? $config['dismissible'] ?? false;
$_SESSION['flash_messages'][] = [
'category' => $category,
'key' => $key,
'custom_message' => $customMessage,
2025-01-07 11:02:57 +00:00
'dismissible' => $isDismissible,
2025-01-06 09:43:20 +00:00
'small' => $small
];
}
/**
2025-02-15 08:13:39 +00:00
* Get and clear all flash feedback messages
*/
public static function getFlash() {
2025-02-15 08:13:39 +00:00
$system_messages = $_SESSION['flash_messages'] ?? [];
unset($_SESSION['flash_messages']);
2025-02-15 08:13:39 +00:00
return $system_messages;
}
}