teen-mode-settings.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { STORAGE } from '@/core/constants/storage-keys'
  2. const PIN_LENGTH = 4
  3. export function isValidTeenPin(pin) {
  4. return new RegExp(`^\\d{${PIN_LENGTH}}$`).test(String(pin || ''))
  5. }
  6. function normalizeTeenMode(raw) {
  7. if (raw === null || raw === undefined || raw === '') {
  8. return { enabled: false, pin: '' }
  9. }
  10. if (typeof raw === 'boolean') {
  11. return { enabled: raw, pin: '' }
  12. }
  13. if (typeof raw === 'number') {
  14. return { enabled: raw === 1, pin: '' }
  15. }
  16. if (typeof raw === 'string') {
  17. try {
  18. return normalizeTeenMode(JSON.parse(raw))
  19. } catch (_) {
  20. return { enabled: false, pin: '' }
  21. }
  22. }
  23. if (typeof raw !== 'object') {
  24. return { enabled: false, pin: '' }
  25. }
  26. const enabled = !!(raw.enabled ?? raw.state ?? raw.isOpen ?? raw.open)
  27. const pin = String(raw.pin ?? raw.password ?? raw.pwd ?? '')
  28. return { enabled, pin }
  29. }
  30. export function getStoredTeenMode() {
  31. try {
  32. return normalizeTeenMode(uni.getStorageSync(STORAGE.teenMode))
  33. } catch (_) {}
  34. return { enabled: false, pin: '' }
  35. }
  36. export function isTeenModeEnabled() {
  37. return !!getStoredTeenMode().enabled
  38. }
  39. export function verifyTeenPin(pin) {
  40. const stored = getStoredTeenMode()
  41. return stored.pin && String(pin || '') === stored.pin
  42. }
  43. export function setStoredTeenMode({ enabled, pin } = {}) {
  44. const next = {
  45. enabled: !!enabled,
  46. pin: enabled ? String(pin || '') : getStoredTeenMode().pin
  47. }
  48. if (next.enabled && !isValidTeenPin(next.pin)) return false
  49. uni.setStorageSync(STORAGE.teenMode, next)
  50. return true
  51. }
  52. export function enableTeenMode(pin) {
  53. if (!isValidTeenPin(pin)) return false
  54. return setStoredTeenMode({ enabled: true, pin })
  55. }
  56. export function disableTeenMode() {
  57. const stored = getStoredTeenMode()
  58. return setStoredTeenMode({ enabled: false, pin: stored.pin })
  59. }
  60. export function updateTeenPin(oldPin, newPin) {
  61. const stored = getStoredTeenMode()
  62. if (!stored.enabled || stored.pin !== String(oldPin || '')) return false
  63. if (!isValidTeenPin(newPin)) return false
  64. return setStoredTeenMode({ enabled: true, pin: newPin })
  65. }