[{"data":1,"prerenderedAt":50597},["ShallowReactive",2],{"navigation_docs":3,"-react-native-version2-auth-secure-storage":3728,"-react-native-version2-auth-secure-storage-surround":50592},[4,1707,1912,2366,2547,2673,2880,3002,3052,3109,3143,3269,3346,3360,3495,3512,3525,3671,3724],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"C#","i-devicon-csharp","\u002Fcsharp","01.csharp",[10,13,60,90,120,202,219,253,379,404,457,650,1364,1654,1703],{"title":11,"path":7,"stem":12},"C# та .NET","01.csharp\u002Findex",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":59},"Fundamentals","i-lucide-book-open","\u002Fcsharp\u002Ffundamentals","01.csharp\u002F01.fundamentals",[19,23,27,31,35,39,43,47,51,55],{"title":20,"path":21,"stem":22},"Вступ до екосистеми .NET","\u002Fcsharp\u002Ffundamentals\u002Fintroduction-to-ecosystem","01.csharp\u002F01.fundamentals\u002F01.introduction-to-ecosystem",{"title":24,"path":25,"stem":26},"Структура програми на C#","\u002Fcsharp\u002Ffundamentals\u002Fprogram-structure","01.csharp\u002F01.fundamentals\u002F02.program-structure",{"title":28,"path":29,"stem":30},"Змінні та Типи Даних","\u002Fcsharp\u002Ffundamentals\u002Fvariables-data-types","01.csharp\u002F01.fundamentals\u002F03.variables-data-types",{"title":32,"path":33,"stem":34},"Масиви","\u002Fcsharp\u002Ffundamentals\u002Farrays","01.csharp\u002F01.fundamentals\u002F04.arrays",{"title":36,"path":37,"stem":38},"Strings & Text Handling","\u002Fcsharp\u002Ffundamentals\u002Fstrings-text-handling","01.csharp\u002F01.fundamentals\u002F05.strings-text-handling",{"title":40,"path":41,"stem":42},"Дати і Час","\u002Fcsharp\u002Ffundamentals\u002Fdates-time-handling","01.csharp\u002F01.fundamentals\u002F06.dates-time-handling",{"title":44,"path":45,"stem":46},"Потік Керування","\u002Fcsharp\u002Ffundamentals\u002Fcontrol-flow","01.csharp\u002F01.fundamentals\u002F07.control-flow",{"title":48,"path":49,"stem":50},"Методи","\u002Fcsharp\u002Ffundamentals\u002Fmethods","01.csharp\u002F01.fundamentals\u002F08.methods",{"title":52,"path":53,"stem":54},"Основи Відлагодження","\u002Fcsharp\u002Ffundamentals\u002Fdebugging-basics","01.csharp\u002F01.fundamentals\u002F09.debugging-basics",{"title":56,"path":57,"stem":58},"Інтерактивна Консоль (Classic)","\u002Fcsharp\u002Ffundamentals\u002Finteractive-console","01.csharp\u002F01.fundamentals\u002F10.interactive-console",false,{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":59},"OOP","i-lucide-box","\u002Fcsharp\u002Foop","01.csharp\u002F02.oop",[66,70,74,78,82,86],{"title":67,"path":68,"stem":69},"Package Management (Управління Пакетами)","\u002Fcsharp\u002Foop\u002Fpackage-management","01.csharp\u002F02.oop\u002F01.package-management",{"title":71,"path":72,"stem":73},"Класи та Об'єкти","\u002Fcsharp\u002Foop\u002Fclasses-objects","01.csharp\u002F02.oop\u002F02.classes-objects",{"title":75,"path":76,"stem":77},"Властивості та Поля","\u002Fcsharp\u002Foop\u002Fproperties-fields","01.csharp\u002F02.oop\u002F03.properties-fields",{"title":79,"path":80,"stem":81},"Стовпи ООП","\u002Fcsharp\u002Foop\u002Foop-pillars","01.csharp\u002F02.oop\u002F04.oop-pillars",{"title":83,"path":84,"stem":85},"Advanced Types","\u002Fcsharp\u002Foop\u002Fadvanced-types","01.csharp\u002F02.oop\u002F05.advanced-types",{"title":87,"path":88,"stem":89},"Namespaces (Простори Імен)","\u002Fcsharp\u002Foop\u002Fnamespaces","01.csharp\u002F02.oop\u002F06.namespaces",{"title":91,"icon":92,"path":93,"stem":94,"children":95,"page":59},"Advanced Core","i-lucide-zap","\u002Fcsharp\u002Fadvanced-core","01.csharp\u002F03.advanced-core",[96,100,104,108,112,116],{"title":97,"path":98,"stem":99},"Generics (Узагальнення)","\u002Fcsharp\u002Fadvanced-core\u002Fgenerics","01.csharp\u002F03.advanced-core\u002F01.generics",{"title":101,"path":102,"stem":103},"Делегати, Події та Лямбда-вирази","\u002Fcsharp\u002Fadvanced-core\u002Fdelegates-events-lambdas","01.csharp\u002F03.advanced-core\u002F02.delegates-events-lambdas",{"title":105,"path":106,"stem":107},"Interfaces Deep Dive (Інтерфейси: Поглиблений Розгляд)","\u002Fcsharp\u002Fadvanced-core\u002Finterfaces-deep-dive","01.csharp\u002F03.advanced-core\u002F03.interfaces-deep-dive",{"title":109,"path":110,"stem":111},"Обробка Винятків","\u002Fcsharp\u002Fadvanced-core\u002Fexception-handling","01.csharp\u002F03.advanced-core\u002F04.exception-handling",{"title":113,"path":114,"stem":115},"Pattern Matching","\u002Fcsharp\u002Fadvanced-core\u002Fpattern-matching","01.csharp\u002F03.advanced-core\u002F05.pattern-matching",{"title":117,"path":118,"stem":119},"Додаткові Можливості C#","\u002Fcsharp\u002Fadvanced-core\u002Fadditional-features","01.csharp\u002F03.advanced-core\u002F06.additional-features",{"title":121,"icon":122,"path":123,"stem":124,"children":125,"page":59},"Architecture Best Practices","i-lucide-building-2","\u002Fcsharp\u002Farchitecture-best-practices","01.csharp\u002F04.architecture-best-practices",[126,130,149,153,157,161,165,169],{"title":127,"path":128,"stem":129},"Software Design Principles (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fsoftware-design-principles","01.csharp\u002F04.architecture-best-practices\u002F01.software-design-principles",{"title":131,"icon":132,"path":133,"stem":134,"children":135,"page":59},"Design Patterns","i-lucide-folder","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns",[136],{"title":137,"icon":132,"path":138,"stem":139,"children":140,"page":59},"Creational","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational",[141,145],{"title":142,"path":143,"stem":144},"Singleton (Одинак)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fsingleton","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F01.singleton",{"title":146,"path":147,"stem":148},"Builder (Будівельник)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdesign-patterns\u002Fcreational\u002Fbuilder","01.csharp\u002F04.architecture-best-practices\u002F02.design-patterns\u002Fcreational\u002F02.builder",{"title":150,"path":151,"stem":152},"Building Professional CLIs","\u002Fcsharp\u002Farchitecture-best-practices\u002Fbuilding-professional-clis","01.csharp\u002F04.architecture-best-practices\u002F03.building-professional-clis",{"title":154,"path":155,"stem":156},"Validation & Flow Control","\u002Fcsharp\u002Farchitecture-best-practices\u002Fvalidation-flow-control","01.csharp\u002F04.architecture-best-practices\u002F04.validation-flow-control",{"title":158,"path":159,"stem":160},"The Modern .NET Host (Microsoft.Extensions)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fmodern-dotnet-host","01.csharp\u002F04.architecture-best-practices\u002F05.modern-dotnet-host",{"title":162,"path":163,"stem":164},"Data Mapper: Repository та DAO патерни (Частина 1)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part1","01.csharp\u002F04.architecture-best-practices\u002F06.data-mapper-part1",{"title":166,"path":167,"stem":168},"Data Mapper: Repository та DAO патерни (Частина 2)","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdata-mapper-part2","01.csharp\u002F04.architecture-best-practices\u002F07.data-mapper-part2",{"title":170,"icon":132,"path":171,"stem":172,"children":173,"page":59},"Di Ioc","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc",[174,178,182,186,190,194,198],{"title":175,"path":176,"stem":177},"Проблема залежностей та Інверсія Контролю","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fthe-dependency-problem","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F01.the-dependency-problem",{"title":179,"path":180,"stem":181},"Будуємо власний Service Container","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fbuild-your-own-container","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F02.build-your-own-container",{"title":183,"path":184,"stem":185},"Service Locator: Паттерн та Анти-паттерн","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-locator-pattern","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F03.service-locator-pattern",{"title":187,"path":188,"stem":189},"Паттерни Dependency Injection","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdependency-injection-patterns","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F04.dependency-injection-patterns",{"title":191,"path":192,"stem":193},"Microsoft DI: IServiceCollection та IServiceProvider","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fmicrosoft-di-deep-dive","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F05.microsoft-di-deep-dive",{"title":195,"path":196,"stem":197},"Service Lifetimes та Scopes","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fservice-lifetimes-and-scopes","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F06.service-lifetimes-and-scopes",{"title":199,"path":200,"stem":201},"DI Анти-паттерни та Найкращі Практики","\u002Fcsharp\u002Farchitecture-best-practices\u002Fdi-ioc\u002Fdi-anti-patterns-and-best-practices","01.csharp\u002F04.architecture-best-practices\u002F08.di-ioc\u002F07.di-anti-patterns-and-best-practices",{"title":203,"icon":132,"path":204,"stem":205,"children":206,"page":59},"Standard Library","\u002Fcsharp\u002Fstandard-library","01.csharp\u002F05.standard-library",[207,211,215],{"title":208,"path":209,"stem":210},"Collections (Колекції)","\u002Fcsharp\u002Fstandard-library\u002Fcollections","01.csharp\u002F05.standard-library\u002F01.collections",{"title":212,"path":213,"stem":214},"High Performance Types (Високопродуктивні Типи)","\u002Fcsharp\u002Fstandard-library\u002Fhigh-performance-types","01.csharp\u002F05.standard-library\u002F02.high-performance-types",{"title":216,"path":217,"stem":218},"LINQ (Language Integrated Query)","\u002Fcsharp\u002Fstandard-library\u002Flinq","01.csharp\u002F05.standard-library\u002F03.linq",{"title":220,"icon":221,"path":222,"stem":223,"children":224,"page":59},"System Internals Concurrency","i-lucide-server","\u002Fcsharp\u002Fsystem-internals-concurrency","01.csharp\u002F06.system-internals-concurrency",[225,229,233,237,241,245,249],{"title":226,"path":227,"stem":228},"Memory Management","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmemory-management","01.csharp\u002F06.system-internals-concurrency\u002F01.memory-management",{"title":230,"path":231,"stem":232},"Reflection API: System.Type та Метадані","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Freflection-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F02.reflection-fundamentals",{"title":234,"path":235,"stem":236},"Attributes та Dynamic Language Runtime","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fattributes-dynamic","01.csharp\u002F06.system-internals-concurrency\u002F03.attributes-dynamic",{"title":238,"path":239,"stem":240},"Expression Trees: Швидка Альтернатива Рефлексії","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fexpression-trees-compiled","01.csharp\u002F06.system-internals-concurrency\u002F04.expression-trees-compiled",{"title":242,"path":243,"stem":244},"Source Generators: Compile-Time Code Generation","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsource-generators","01.csharp\u002F06.system-internals-concurrency\u002F05.source-generators",{"title":246,"path":247,"stem":248},"Multithreading Fundamentals","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fmultithreading-fundamentals","01.csharp\u002F06.system-internals-concurrency\u002F06.multithreading-fundamentals",{"title":250,"path":251,"stem":252},"Synchronization Primitives","\u002Fcsharp\u002Fsystem-internals-concurrency\u002Fsynchronization-primitives","01.csharp\u002F06.system-internals-concurrency\u002F07.synchronization-primitives",{"title":254,"icon":255,"path":256,"stem":257,"children":258,"page":59},"System Programming Windows","i-lucide-cpu","\u002Fcsharp\u002Fsystem-programming-windows","01.csharp\u002F07.system-programming-windows",[259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327,331,335,339,343,347,351,355,359,363,367,371,375],{"title":260,"path":261,"stem":262},"Як Працює Операційна Система","\u002Fcsharp\u002Fsystem-programming-windows\u002Fhow-os-works","01.csharp\u002F07.system-programming-windows\u002F01.how-os-works",{"title":264,"path":265,"stem":266},"Процеси в .NET — API та Запуск","\u002Fcsharp\u002Fsystem-programming-windows\u002Fprocesses-in-dotnet","01.csharp\u002F07.system-programming-windows\u002F02.processes-in-dotnet",{"title":268,"path":269,"stem":270},"Процеси в .NET — IPC та Міжпроцесна Комунікація","\u002Fcsharp\u002Fsystem-programming-windows\u002F02a.processes-ipc","01.csharp\u002F07.system-programming-windows\u002F02a.processes-ipc",{"title":272,"path":273,"stem":274},"Application Domains та Збірки — AppDomain і AssemblyLoadContext","\u002Fcsharp\u002Fsystem-programming-windows\u002Fappdomains-assemblies","01.csharp\u002F07.system-programming-windows\u002F03.appdomains-assemblies",{"title":276,"path":277,"stem":278},"Application Domains та Збірки — Plug-in Система з Hot-Reload","\u002Fcsharp\u002Fsystem-programming-windows\u002F03a.appdomains-plugin-system","01.csharp\u002F07.system-programming-windows\u002F03a.appdomains-plugin-system",{"title":280,"path":281,"stem":282},"Потоки — Основи та API Thread","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-fundamentals","01.csharp\u002F07.system-programming-windows\u002F04.thread-fundamentals",{"title":284,"path":285,"stem":286},"Потоки — Lifecycle, Пріоритети та Безпечне Завершення","\u002Fcsharp\u002Fsystem-programming-windows\u002F04a.thread-lifecycle-priorities","01.csharp\u002F07.system-programming-windows\u002F04a.thread-lifecycle-priorities",{"title":288,"path":289,"stem":290},"Проблеми Спільного Стану — Race Condition та Data Race","\u002Fcsharp\u002Fsystem-programming-windows\u002Fshared-state-problems","01.csharp\u002F07.system-programming-windows\u002F05.shared-state-problems",{"title":292,"path":293,"stem":294},"Проблеми Спільного Стану — Memory Model та volatile","\u002Fcsharp\u002Fsystem-programming-windows\u002F05a.shared-state-memory-model","01.csharp\u002F07.system-programming-windows\u002F05a.shared-state-memory-model",{"title":296,"path":297,"stem":298},"Синхронізація — Monitor, lock та еволюція примітивів","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-fundamentals","01.csharp\u002F07.system-programming-windows\u002F06.synchronization-fundamentals",{"title":300,"path":301,"stem":302},"Синхронізація — Наскрізний Приклад та Deadlock Detection","\u002Fcsharp\u002Fsystem-programming-windows\u002F06a.synchronization-walkthrough","01.csharp\u002F07.system-programming-windows\u002F06a.synchronization-walkthrough",{"title":304,"path":305,"stem":306},"Синхронізація — Mutex, Semaphore та Event-Based Primitives","\u002Fcsharp\u002Fsystem-programming-windows\u002Fsynchronization-advanced","01.csharp\u002F07.system-programming-windows\u002F07.synchronization-advanced",{"title":308,"path":309,"stem":310},"Синхронізація — Interlocked, Volatile та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002F07a.synchronization-advanced-walkthrough","01.csharp\u002F07.system-programming-windows\u002F07a.synchronization-advanced-walkthrough",{"title":312,"path":313,"stem":314},"Interlocked, CAS та Lock-Free Структури","\u002Fcsharp\u002Fsystem-programming-windows\u002Finterlocked-cas-lockfree","01.csharp\u002F07.system-programming-windows\u002F08.interlocked-cas-lockfree",{"title":316,"path":317,"stem":318},"Volatile, Memory Model та Spinning","\u002Fcsharp\u002Fsystem-programming-windows\u002F08a.volatile-memory-model","01.csharp\u002F07.system-programming-windows\u002F08a.volatile-memory-model",{"title":320,"path":321,"stem":322},"ThreadPool — Пул Потоків для Ефективного Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fthread-pool","01.csharp\u002F07.system-programming-windows\u002F09.thread-pool",{"title":324,"path":325,"stem":326},"ThreadPool — Просунуті Сценарії та Внутрішня Будова","\u002Fcsharp\u002Fsystem-programming-windows\u002F09a.thread-pool-advanced","01.csharp\u002F07.system-programming-windows\u002F09a.thread-pool-advanced",{"title":328,"path":329,"stem":330},"Concurrent та Immutable Collections","\u002Fcsharp\u002Fsystem-programming-windows\u002Fconcurrent-collections","01.csharp\u002F07.system-programming-windows\u002F10.concurrent-collections",{"title":332,"path":333,"stem":334},"TPL, Task та Композиція — Від Thread до Task","\u002Fcsharp\u002Fsystem-programming-windows\u002Ftpl-parallel-plinq","01.csharp\u002F07.system-programming-windows\u002F11.tpl-parallel-plinq",{"title":336,"path":337,"stem":338},"Parallel Class та PLINQ — Data Parallelism","\u002Fcsharp\u002Fsystem-programming-windows\u002F11a.tpl-parallel-plinq-advanced","01.csharp\u002F07.system-programming-windows\u002F11a.tpl-parallel-plinq-advanced",{"title":340,"path":341,"stem":342},"Async\u002FAwait — Фундамент Асинхронного Програмування","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-fundamentals","01.csharp\u002F07.system-programming-windows\u002F12.async-fundamentals",{"title":344,"path":345,"stem":346},"SynchronizationContext та ConfigureAwait — Контекст Виконання","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-context-configureawait","01.csharp\u002F07.system-programming-windows\u002F13.async-context-configureawait",{"title":348,"path":349,"stem":350},"Async — Просунуті Паттерни","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-advanced","01.csharp\u002F07.system-programming-windows\u002F14.async-advanced",{"title":352,"path":353,"stem":354},"System.Threading.Channels — Async Producer-Consumer","\u002Fcsharp\u002Fsystem-programming-windows\u002Fchannels","01.csharp\u002F07.system-programming-windows\u002F15.channels",{"title":356,"path":357,"stem":358},"Асинхронна Синхронізація","\u002Fcsharp\u002Fsystem-programming-windows\u002Fasync-synchronization","01.csharp\u002F07.system-programming-windows\u002F16.async-synchronization",{"title":360,"path":361,"stem":362},"Unsafe Code та Вказівники","\u002Fcsharp\u002Fsystem-programming-windows\u002Funsafe-code","01.csharp\u002F07.system-programming-windows\u002F17.unsafe-code",{"title":364,"path":365,"stem":366},"P\u002FInvoke та Windows API — Міст між .NET та Native Code","\u002Fcsharp\u002Fsystem-programming-windows\u002Fpinvoke-winapi","01.csharp\u002F07.system-programming-windows\u002F18.pinvoke-winapi",{"title":368,"path":369,"stem":370},"Реєстр Windows — Центральна База Конфігурації Системи","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-registry","01.csharp\u002F07.system-programming-windows\u002F19.windows-registry",{"title":372,"path":373,"stem":374},"Windows Hooks, Hotkeys та Services — Глибока Інтеграція з ОС","\u002Fcsharp\u002Fsystem-programming-windows\u002Fwindows-hooks-services","01.csharp\u002F07.system-programming-windows\u002F20.windows-hooks-services",{"title":376,"path":377,"stem":378},"Системне Програмування C# (Windows) — 07.system-programming-windows","\u002Fcsharp\u002Fsystem-programming-windows\u002Fimplementation_plan","01.csharp\u002F07.system-programming-windows\u002Fimplementation_plan",{"title":380,"icon":132,"path":381,"stem":382,"children":383,"page":59},"Io","\u002Fcsharp\u002Fio","01.csharp\u002F08.io",[384,388,392,396,400],{"title":385,"path":386,"stem":387},"8.1.1. Основи роботи з файловою системою","\u002Fcsharp\u002Fio\u002Ffile-system-basics","01.csharp\u002F08.io\u002F01.file-system-basics",{"title":389,"path":390,"stem":391},"8.1.2. Потоки (Streams) та Серіалізація Даних","\u002Fcsharp\u002Fio\u002Fstreams-serialization","01.csharp\u002F08.io\u002F02.streams-serialization",{"title":393,"path":394,"stem":395},"8.2.1. JSON Serialization з System.Text.Json","\u002Fcsharp\u002Fio\u002Fjson-serialization","01.csharp\u002F08.io\u002F03.json-serialization",{"title":397,"path":398,"stem":399},"8.2.2. XML Serialization та LINQ to XML","\u002Fcsharp\u002Fio\u002Fxml-serialization","01.csharp\u002F08.io\u002F04.xml-serialization",{"title":401,"path":402,"stem":403},"8.2.3. Binary Serialization: MessagePack та Protocol Buffers","\u002Fcsharp\u002Fio\u002Fbinary-serialization","01.csharp\u002F08.io\u002F05.binary-serialization",{"title":405,"icon":132,"path":406,"stem":407,"children":408,"page":59},"Ado Net","\u002Fcsharp\u002Fado-net","01.csharp\u002F09.ado-net",[409,413,417,421,425,429,433,437,441,445,449,453],{"title":410,"path":411,"stem":412},"9.1. Введення в ADO.NET","\u002Fcsharp\u002Fado-net\u002Fintroduction-to-adonet","01.csharp\u002F09.ado-net\u002F01.introduction-to-adonet",{"title":414,"path":415,"stem":416},"9.2. Клас DbConnection — з'єднання з базою даних","\u002Fcsharp\u002Fado-net\u002Fconnection","01.csharp\u002F09.ado-net\u002F02.connection",{"title":418,"path":419,"stem":420},"9.3. Клас DbCommand — виконання SQL-запитів","\u002Fcsharp\u002Fado-net\u002Fcommand-and-queries","01.csharp\u002F09.ado-net\u002F03.command-and-queries",{"title":422,"path":423,"stem":424},"9.4. Клас DbDataReader — ефективне читання даних","\u002Fcsharp\u002Fado-net\u002Fdatareader","01.csharp\u002F09.ado-net\u002F04.datareader",{"title":426,"path":427,"stem":428},"9.5. Параметризовані запити та захист від SQL Injection","\u002Fcsharp\u002Fado-net\u002Fparameters-and-sql-injection","01.csharp\u002F09.ado-net\u002F05.parameters-and-sql-injection",{"title":430,"path":431,"stem":432},"9.6. Транзакції в ADO.NET","\u002Fcsharp\u002Fado-net\u002Ftransactions","01.csharp\u002F09.ado-net\u002F06.transactions",{"title":434,"path":435,"stem":436},"9.7. DbProviderFactory — провайдер-незалежний код","\u002Fcsharp\u002Fado-net\u002Fprovider-factory","01.csharp\u002F09.ado-net\u002F07.provider-factory",{"title":438,"path":439,"stem":440},"9.8. Асинхронний доступ до даних","\u002Fcsharp\u002Fado-net\u002Fasync-data-access","01.csharp\u002F09.ado-net\u002F08.async-data-access",{"title":442,"path":443,"stem":444},"9.9. Від'єднаний режим: DataSet, DataTable, DataRow","\u002Fcsharp\u002Fado-net\u002Fdisconnected-mode-dataset","01.csharp\u002F09.ado-net\u002F09.disconnected-mode-dataset",{"title":446,"path":447,"stem":448},"9.10. DataAdapter — міст між DataSet та базою даних","\u002Fcsharp\u002Fado-net\u002Fdata-adapter","01.csharp\u002F09.ado-net\u002F10.data-adapter",{"title":450,"path":451,"stem":452},"9.11. Data Mapper та Repository: Архітектура доступу до даних","\u002Fcsharp\u002Fado-net\u002Fdata-mapper-repository","01.csharp\u002F09.ado-net\u002F11.data-mapper-repository",{"title":454,"path":455,"stem":456},"9.12. Identity Map, Unit of Work та Specification Pattern","\u002Fcsharp\u002Fado-net\u002Fadvanced-patterns","01.csharp\u002F09.ado-net\u002F12.advanced-patterns",{"title":458,"icon":255,"path":459,"stem":460,"children":461,"page":59},"Ef Core","\u002Fcsharp\u002Fef-core","01.csharp\u002F10.ef-core",[462,466,470,474,478,482,486,490,494,498,502,506,510,514,518,522,526,532,538,542,546,550,554,558,562,566,570,574,578,582,586,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646],{"title":463,"path":464,"stem":465},"Що таке ORM? Від SQL до об'єктів","\u002Fcsharp\u002Fef-core\u002Fwhat-is-orm","01.csharp\u002F10.ef-core\u002F01.what-is-orm",{"title":467,"path":468,"stem":469},"Перший проєкт — від нуля до CRUD","\u002Fcsharp\u002Fef-core\u002Ffirst-project","01.csharp\u002F10.ef-core\u002F02.first-project",{"title":471,"path":472,"stem":473},"DbContext — Серце EF Core","\u002Fcsharp\u002Fef-core\u002Fdbcontext-deep-dive","01.csharp\u002F10.ef-core\u002F03.dbcontext-deep-dive",{"title":475,"path":476,"stem":477},"Провайдери баз даних — Архітектура та Вибір СУБД","\u002Fcsharp\u002Fef-core\u002Fdatabase-providers","01.csharp\u002F10.ef-core\u002F04.database-providers",{"title":479,"path":480,"stem":481},"Конвенції EF Core — Магія без конфігурації","\u002Fcsharp\u002Fef-core\u002Fconventions","01.csharp\u002F10.ef-core\u002F05.conventions",{"title":483,"path":484,"stem":485},"Fluent API та Data Annotations — Явна конфігурація моделі","\u002Fcsharp\u002Fef-core\u002Ffluent-api-vs-annotations","01.csharp\u002F10.ef-core\u002F06.fluent-api-vs-annotations",{"title":487,"path":488,"stem":489},"Зв'язки — One-to-One та One-to-Many","\u002Fcsharp\u002Fef-core\u002Frelationships-basics","01.csharp\u002F10.ef-core\u002F07.relationships-basics",{"title":491,"path":492,"stem":493},"Зв'язки Advanced — Many-to-Many та Складні Сценарії","\u002Fcsharp\u002Fef-core\u002Frelationships-advanced","01.csharp\u002F10.ef-core\u002F08.relationships-advanced",{"title":495,"path":496,"stem":497},"Властивості — Типи, Конвертери, Компаратори (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part1","01.csharp\u002F10.ef-core\u002F09.property-configuration-part1",{"title":499,"path":500,"stem":501},"Властивості — Value Comparers, Generators, Shadow Properties (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fproperty-configuration-part2","01.csharp\u002F10.ef-core\u002F09.property-configuration-part2",{"title":503,"path":504,"stem":505},"Складні типи — Owned Types та Complex Types (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part1","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part1",{"title":507,"path":508,"stem":509},"Складні типи — Complex Types, Keyless Entities, Порівняння (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fcomplex-types-owned-part2","01.csharp\u002F10.ef-core\u002F10.complex-types-owned-part2",{"title":511,"path":512,"stem":513},"JSON Columns — Складні дані у JSON (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part1","01.csharp\u002F10.ef-core\u002F11.json-columns-part1",{"title":515,"path":516,"stem":517},"JSON Columns — Value Comparers, Індекси, Провайдери (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fjson-columns-part2","01.csharp\u002F10.ef-core\u002F11.json-columns-part2",{"title":519,"path":520,"stem":521},"Успадкування — Абстрактні класи та TPH (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finheritance-part1","01.csharp\u002F10.ef-core\u002F12.inheritance-part1",{"title":523,"path":524,"stem":525},"Успадкування — TPT, TPC та Порівняння Стратегій (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finheritance-part2","01.csharp\u002F10.ef-core\u002F12.inheritance-part2",{"title":527,"path":528,"stem":529,"children":530},"Індекси, Обмеження та Схема (Частина 1)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part1","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part1",[531],{"title":527,"path":528,"stem":529},{"title":533,"path":534,"stem":535,"children":536},"Індекси, Обмеження та Схема (Частина 2)","\u002Fcsharp\u002Fef-core\u002Findexes-constraints-part2","01.csharp\u002F10.ef-core\u002F13.indexes-constraints-part2",[537],{"title":533,"path":534,"stem":535},{"title":539,"path":540,"stem":541},"Seed Data — Початкові Дані (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fseeding-part1","01.csharp\u002F10.ef-core\u002F14.seeding-part1",{"title":543,"path":544,"stem":545},"Seed Data — SQL-скрипти, Bogus та Стратегії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fseeding-part2","01.csharp\u002F10.ef-core\u002F14.seeding-part2",{"title":547,"path":548,"stem":549},"Global Query Filters — Глобальні Фільтри (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part1","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part1",{"title":551,"path":552,"stem":553},"Global Query Filters — Підводні камені та Інтеграція (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fglobal-query-filters-part2","01.csharp\u002F10.ef-core\u002F15.global-query-filters-part2",{"title":555,"path":556,"stem":557},"LINQ-запити в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part1","01.csharp\u002F10.ef-core\u002F16.linq-queries-part1",{"title":559,"path":560,"stem":561},"LINQ-запити в EF Core (Частина 2)","\u002Fcsharp\u002Fef-core\u002Flinq-queries-part2","01.csharp\u002F10.ef-core\u002F16.linq-queries-part2",{"title":563,"path":564,"stem":565},"Завантаження Пов'язаних Даних (Частина 1)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part1","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part1",{"title":567,"path":568,"stem":569},"Завантаження Пов'язаних Даних (Частина 2)","\u002Fcsharp\u002Fef-core\u002Floading-related-data-part2","01.csharp\u002F10.ef-core\u002F17.loading-related-data-part2",{"title":571,"path":572,"stem":573},"Raw SQL, Views та Stored Procedures (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part1","01.csharp\u002F10.ef-core\u002F18.raw-sql-part1",{"title":575,"path":576,"stem":577},"Raw SQL — Stored Procedures, DbFunction та Bulk Operations (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fraw-sql-part2","01.csharp\u002F10.ef-core\u002F18.raw-sql-part2",{"title":579,"path":580,"stem":581},"Продвинуті Запити — Compiled Queries, Bulk та Оптимізація (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part1","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part1",{"title":583,"path":584,"stem":585},"Продвинуті Запити — Query Tags, Bulk та Interceptors (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fadvanced-queries-part2","01.csharp\u002F10.ef-core\u002F19.advanced-queries-part2",{"title":587,"path":588,"stem":589},"Change Tracker — Відстеження Змін (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part1","01.csharp\u002F10.ef-core\u002F20.change-tracking-part1",{"title":591,"path":592,"stem":593},"Change Tracker — Графи Об'єктів та Disconnected (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fchange-tracking-part2","01.csharp\u002F10.ef-core\u002F20.change-tracking-part2",{"title":595,"path":596,"stem":597},"Збереження Даних та Транзакції (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part1","01.csharp\u002F10.ef-core\u002F21.saving-data-part1",{"title":599,"path":600,"stem":601},"Збереження Даних — Concurrency та Outbox (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fsaving-data-part2","01.csharp\u002F10.ef-core\u002F21.saving-data-part2",{"title":603,"path":604,"stem":605},"Конкурентність та Блокування (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part1","01.csharp\u002F10.ef-core\u002F22.concurrency-part1",{"title":607,"path":608,"stem":609},"Конкурентність — Дедлоки та Queue Processing (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fconcurrency-part2","01.csharp\u002F10.ef-core\u002F22.concurrency-part2",{"title":611,"path":612,"stem":613},"Міграції в EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part1","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part1",{"title":615,"path":616,"stem":617},"Міграції в EF Core — Основи (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-basics-part2","01.csharp\u002F10.ef-core\u002F23.migrations-basics-part2",{"title":619,"path":620,"stem":621},"Міграції — Просунуті Сценарії (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part1","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part1",{"title":623,"path":624,"stem":625},"Міграції — Просунуті Сценарії (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fmigrations-advanced-part2","01.csharp\u002F10.ef-core\u002F24.migrations-advanced-part2",{"title":627,"path":628,"stem":629},"Управління Схемою та Database-First (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part1","01.csharp\u002F10.ef-core\u002F25.schema-management-part1",{"title":631,"path":632,"stem":633},"Управління Схемою та Database-First (Частина 2)","\u002Fcsharp\u002Fef-core\u002Fschema-management-part2","01.csharp\u002F10.ef-core\u002F25.schema-management-part2",{"title":635,"path":636,"stem":637},"Продуктивність EF Core — Основи (Частина 1)","\u002Fcsharp\u002Fef-core\u002Fperformance-fundamentals-part1","01.csharp\u002F10.ef-core\u002F26.performance-fundamentals-part1",{"title":639,"path":640,"stem":641},"Interceptors в EF Core (Частина 1)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part1","01.csharp\u002F10.ef-core\u002F29.interceptors-part1",{"title":643,"path":644,"stem":645},"Interceptors в EF Core — Connection, Transaction та Materialization (Частина 2)","\u002Fcsharp\u002Fef-core\u002Finterceptors-part2","01.csharp\u002F10.ef-core\u002F29.interceptors-part2",{"title":647,"path":648,"stem":649},"План вивчення Entity Framework Core — Повний курс","\u002Fcsharp\u002Fef-core\u002Fimplementation_plan","01.csharp\u002F10.ef-core\u002Fimplementation_plan",{"title":651,"icon":652,"path":653,"stem":654,"children":655,"page":59},"ASP.NET","i-devicon-dotnetcore","\u002Fcsharp\u002Faspnet","01.csharp\u002F11.aspnet",[656,730,791,869,927,941,967,1057,1111,1182,1212,1289,1346],{"title":657,"icon":658,"path":659,"stem":660,"children":661,"page":59},"Minimal API","i-lucide-network","\u002Fcsharp\u002Faspnet\u002Fminimal-api","01.csharp\u002F11.aspnet\u002F01.minimal-api",[662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726],{"title":663,"path":664,"stem":665},"Вступ до ASP.NET та еволюція фреймворку","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fintroduction","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F01.introduction",{"title":667,"path":668,"stem":669},"Перший додаток на ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Ffirst-application","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F02.first-application",{"title":671,"path":672,"stem":673},"WebApplication, Builder та Dependency Injection","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fwebapplication-builder","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F03.webapplication-builder",{"title":675,"path":676,"stem":677},"Конвеєр запитів та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frequest-pipeline-middleware","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F04.request-pipeline-middleware",{"title":679,"path":680,"stem":681},"Маршрутизація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F05.routing-basics",{"title":683,"path":684,"stem":685},"Маршрутизація в ASP.NET Core: Розширені можливості","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Frouting-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F06.routing-advanced",{"title":687,"path":688,"stem":689},"Статичні файли в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-files","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F07.static-files",{"title":691,"path":692,"stem":693},"Статичні Активи: MapStaticAssets (ASP.NET Core 9.0)","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstatic-assets","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F08.static-assets",{"title":695,"path":696,"stem":697},"Конфігурація в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-fundamentals","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F09.configuration-fundamentals",{"title":699,"path":700,"stem":701},"Конфігурація: Паттерн Options","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fconfiguration-options","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F10.configuration-options",{"title":703,"path":704,"stem":705},"Логування в ASP.NET Core: Основи","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-basics","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F11.logging-basics",{"title":707,"path":708,"stem":709},"Логування: Serilog та Middleware","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Flogging-advanced","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F12.logging-advanced",{"title":711,"path":712,"stem":713},"Управління станом: HttpContext.Items та Cookies","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fstate-management","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F13.state-management",{"title":715,"path":716,"stem":717},"Стан сесії: Sessions","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fsession-state","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F14.session-state",{"title":719,"path":720,"stem":721},"Структура проєкту: від хаосу до архітектури","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fproject-structure","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F15.project-structure",{"title":723,"path":724,"stem":725},"Scalar у Minimal API: повний проєкт і Fluent OpenAPI","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fscalar-openapi-fluent","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F16.scalar-openapi-fluent",{"title":727,"path":728,"stem":729},"Swagger \u002F Swashbuckle у Minimal API: окремий класичний шлях","\u002Fcsharp\u002Faspnet\u002Fminimal-api\u002Fswagger-swashbuckle","01.csharp\u002F11.aspnet\u002F01.minimal-api\u002F17.swagger-swashbuckle",{"title":731,"icon":658,"path":732,"stem":733,"children":734,"page":59},"API","\u002Fcsharp\u002Faspnet\u002Fapi","01.csharp\u002F11.aspnet\u002F02.api",[735,739,743,747,751,755,759,763,767,771,775,779,783,787],{"title":736,"path":737,"stem":738},"Що таке API. Клієнт-серверна архітектура","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fwhat-is-api","01.csharp\u002F11.aspnet\u002F02.api\u002F01.what-is-api",{"title":740,"path":741,"stem":742},"Формати даних: JSON, XML, TOML та бінарні формати","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fdata-formats","01.csharp\u002F11.aspnet\u002F02.api\u002F02.data-formats",{"title":744,"path":745,"stem":746},"Парадигми API та концепція REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-paradigms-rest","01.csharp\u002F11.aspnet\u002F02.api\u002F03.api-paradigms-rest",{"title":748,"path":749,"stem":750},"HTTP-методи, статус-коди та заголовки","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fhttp-methods-status-codes","01.csharp\u002F11.aspnet\u002F02.api\u002F04.http-methods-status-codes",{"title":752,"path":753,"stem":754},"Організація HTTP API за принципами REST","\u002Fcsharp\u002Faspnet\u002Fapi\u002Frest-organizing","01.csharp\u002F11.aspnet\u002F02.api\u002F05.rest-organizing",{"title":756,"path":757,"stem":758},"Номенклатура URL та CRUD-операції","\u002Fcsharp\u002Faspnet\u002Fapi\u002Furl-nomenclature-crud","01.csharp\u002F11.aspnet\u002F02.api\u002F06.url-nomenclature-crud",{"title":760,"path":761,"stem":762},"Правила дизайну: іменування та стандарти","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-naming","01.csharp\u002F11.aspnet\u002F02.api\u002F07.api-design-naming",{"title":764,"path":765,"stem":766},"Валідація, ліміти та обробка помилок","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-validation","01.csharp\u002F11.aspnet\u002F02.api\u002F08.api-design-validation",{"title":768,"path":769,"stem":770},"Обробка помилок у Minimal API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Ferror-handling-http","01.csharp\u002F11.aspnet\u002F02.api\u002F09.error-handling-http",{"title":772,"path":773,"stem":774},"Ідемпотентність та синхронізація стану","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fidempotency-sync","01.csharp\u002F11.aspnet\u002F02.api\u002F10.idempotency-sync",{"title":776,"path":777,"stem":778},"Пагінація та організація списків","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fpagination-lists","01.csharp\u002F11.aspnet\u002F02.api\u002F11.pagination-lists",{"title":780,"path":781,"stem":782},"Безпека API, кешування та інтернаціоналізація","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fsecurity-auth","01.csharp\u002F11.aspnet\u002F02.api\u002F12.security-auth",{"title":784,"path":785,"stem":786},"Процес проєктування API та документування","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fapi-design-process","01.csharp\u002F11.aspnet\u002F02.api\u002F13.api-design-process",{"title":788,"path":789,"stem":790},"OpenAPI: контракт, специфікація та документація API","\u002Fcsharp\u002Faspnet\u002Fapi\u002Fopenapi","01.csharp\u002F11.aspnet\u002F02.api\u002F14.openapi",{"title":792,"icon":793,"path":794,"stem":795,"children":796,"page":59},"Auth","i-lucide-shield-check","\u002Fcsharp\u002Faspnet\u002Fauth","01.csharp\u002F11.aspnet\u002F03.auth",[797,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865],{"title":798,"path":799,"stem":800},"Основи аутентифікації та авторизації","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauth-fundamentals","01.csharp\u002F11.aspnet\u002F03.auth\u002F01.auth-fundamentals",{"title":802,"path":803,"stem":804},"JWT-аутентифікація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fjwt-authentication","01.csharp\u002F11.aspnet\u002F03.auth\u002F02.jwt-authentication",{"title":806,"path":807,"stem":808},"Авторизація: ролі, політики та resource-based доступ","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fauthorization-policies","01.csharp\u002F11.aspnet\u002F03.auth\u002F03.authorization-policies",{"title":810,"path":811,"stem":812},"Cookie-аутентифікація та ASP.NET Core Identity","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcookie-auth-identity","01.csharp\u002F11.aspnet\u002F03.auth\u002F04.cookie-auth-identity",{"title":814,"path":815,"stem":816},"JWT + Refresh Tokens (HttpOnly Cookie)","\u002Fcsharp\u002Faspnet\u002Fauth\u002F04b.identity-auth-jwt","01.csharp\u002F11.aspnet\u002F03.auth\u002F04b.identity-auth-jwt",{"title":818,"path":819,"stem":820},"Identity: Підтвердження Email та Скидання Пароля","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-email-confirmation","01.csharp\u002F11.aspnet\u002F03.auth\u002F05.identity-email-confirmation",{"title":822,"path":823,"stem":824},"Identity: Двофакторна Аутентифікація (2FA)","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-two-factor","01.csharp\u002F11.aspnet\u002F03.auth\u002F06.identity-two-factor",{"title":826,"path":827,"stem":828},"Identity: Внутрішня Архітектура та Кастомізація","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fidentity-internals","01.csharp\u002F11.aspnet\u002F03.auth\u002F07.identity-internals",{"title":830,"path":831,"stem":832},"OAuth 2.0 та зовнішні провайдери","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-external-providers","01.csharp\u002F11.aspnet\u002F03.auth\u002F08.oauth-external-providers",{"title":834,"path":835,"stem":836},"Безпека на практиці: CORS, HTTPS та захист від атак","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fsecurity-hardening","01.csharp\u002F11.aspnet\u002F03.auth\u002F09.security-hardening",{"title":838,"path":839,"stem":840},"Теорія OAuth 2.0: Поняття, Аналогії та Флоу","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foauth-theory","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oauth-theory",{"title":842,"path":843,"stem":844},"OIDC, OAuth 2.0 та Keycloak в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Foidc-keycloak","01.csharp\u002F11.aspnet\u002F03.auth\u002F10.oidc-keycloak",{"title":846,"path":847,"stem":848},"API Keys аутентифікація в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fapi-keys","01.csharp\u002F11.aspnet\u002F03.auth\u002F11.api-keys",{"title":850,"path":851,"stem":852},"Rate Limiting та Throttling в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frate-limiting","01.csharp\u002F11.aspnet\u002F03.auth\u002F12.rate-limiting",{"title":854,"path":855,"stem":856},"Refresh Token Rotation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frefresh-token-rotation","01.csharp\u002F11.aspnet\u002F03.auth\u002F13.refresh-token-rotation",{"title":858,"path":859,"stem":860},"Certificate Authentication та mTLS в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fcertificate-auth","01.csharp\u002F11.aspnet\u002F03.auth\u002F14.certificate-auth",{"title":862,"path":863,"stem":864},"RBAC, ABAC та ReBAC в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Frbac-abac-rebac","01.csharp\u002F11.aspnet\u002F03.auth\u002F15.rbac-abac-rebac",{"title":866,"path":867,"stem":868},"Multi-tenancy та ізоляція даних в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fauth\u002Fmulti-tenancy","01.csharp\u002F11.aspnet\u002F03.auth\u002F16.multi-tenancy",{"title":870,"icon":871,"path":872,"stem":873,"children":874,"page":59},"Нотифікації","i-lucide-bell","\u002Fcsharp\u002Faspnet\u002Fnotifications","01.csharp\u002F11.aspnet\u002F04.notifications",[875,879,883,887,891,895,899,903,907,911,915,919,923],{"title":876,"path":877,"stem":878},"In-App нотифікації через базу даних","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fin-app-database-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F01.in-app-database-notifications",{"title":880,"path":881,"stem":882},"Polling: Регулярний запит оновлень","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fpolling","01.csharp\u002F11.aspnet\u002F04.notifications\u002F02.polling",{"title":884,"path":885,"stem":886},"Server-Sent Events: Однострімовий push від сервера","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fserver-sent-events","01.csharp\u002F11.aspnet\u002F04.notifications\u002F03.server-sent-events",{"title":888,"path":889,"stem":890},"WebSockets: Двостороннє з'єднання в реальному часі","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fwebsockets","01.csharp\u002F11.aspnet\u002F04.notifications\u002F04.websockets",{"title":892,"path":893,"stem":894},"SignalR: Абстракція над транспортами реального часу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fsignalr","01.csharp\u002F11.aspnet\u002F04.notifications\u002F05.signalr",{"title":896,"path":897,"stem":898},"Background Services: Фонові задачі в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fbackground-services","01.csharp\u002F11.aspnet\u002F04.notifications\u002F06.background-services",{"title":900,"path":901,"stem":902},"Web Push нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fweb-push","01.csharp\u002F11.aspnet\u002F04.notifications\u002F07.web-push",{"title":904,"path":905,"stem":906},"Email нотифікації","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Femail-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F08.email-notifications",{"title":908,"path":909,"stem":910},"Порівняння підходів: Як вибрати правильну технологію нотифікацій","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fchoosing-the-right-approach","01.csharp\u002F11.aspnet\u002F04.notifications\u002F09.choosing-the-right-approach",{"title":912,"path":913,"stem":914},"Hangfire: Надійне планування фонових задач","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire","01.csharp\u002F11.aspnet\u002F04.notifications\u002F10.hangfire",{"title":916,"path":917,"stem":918},"Практика: Конвертація зображень у WebP через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-image-webp","01.csharp\u002F11.aspnet\u002F04.notifications\u002F11.hangfire-image-webp",{"title":920,"path":921,"stem":922},"Практика: Підготовка відео до HLS-стрімінгу через Hangfire","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Fhangfire-video-hls","01.csharp\u002F11.aspnet\u002F04.notifications\u002F12.hangfire-video-hls",{"title":924,"path":925,"stem":926},"Telegram-нотифікації: від одного повідомлення до масових розсилок і мульти-канального підходу","\u002Fcsharp\u002Faspnet\u002Fnotifications\u002Ftelegram-notifications","01.csharp\u002F11.aspnet\u002F04.notifications\u002F13.telegram-notifications",{"title":928,"icon":929,"path":930,"stem":931,"children":932,"page":59},"Інтернаціоналізація","i-lucide-languages","\u002Fcsharp\u002Faspnet\u002Fi18n","01.csharp\u002F11.aspnet\u002F05.i18n",[933,937],{"title":934,"path":935,"stem":936},"Інтернаціоналізація (i18n) у Minimal API: від A до Я","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Finternationalization","01.csharp\u002F11.aspnet\u002F05.i18n\u002F01.internationalization",{"title":938,"path":939,"stem":940},"Humanizer: людиномовні рядки у .NET","\u002Fcsharp\u002Faspnet\u002Fi18n\u002Fhumanizer","01.csharp\u002F11.aspnet\u002F05.i18n\u002F02.humanizer",{"title":942,"icon":943,"path":944,"stem":945,"children":946,"page":59},"Кешування","i-lucide-layers","\u002Fcsharp\u002Faspnet\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching",[947,951,955,959,963],{"title":948,"path":949,"stem":950},"Огляд кешування: чотири рівні і коли що обирати","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fcaching","01.csharp\u002F11.aspnet\u002F06.caching\u002F01.caching",{"title":952,"path":953,"stem":954},"IMemoryCache: кеш в оперативній пам'яті","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fmemory-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F02.memory-cache",{"title":956,"path":957,"stem":958},"IDistributedCache і Redis: розподілений кеш","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fdistributed-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F03.distributed-cache",{"title":960,"path":961,"stem":962},"Response Cache: HTTP-кешування через Cache-Control","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Fresponse-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F04.response-cache",{"title":964,"path":965,"stem":966},"Output Cache: серверний кеш HTTP-відповідей (.NET 7+)","\u002Fcsharp\u002Faspnet\u002Fcaching\u002Foutput-cache","01.csharp\u002F11.aspnet\u002F06.caching\u002F05.output-cache",{"title":968,"icon":969,"path":970,"stem":971,"children":972,"page":59},"Тестування","i-lucide-test-tube","\u002Fcsharp\u002Faspnet\u002Ftesting","01.csharp\u002F11.aspnet\u002F07.testing",[973,977,981,985,989,993,997,1001,1005,1009,1013,1017,1021,1025,1029,1033,1037,1041,1045,1049,1053],{"title":974,"path":975,"stem":976},"Що таке тестування? Від інтуїції до науки","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-is-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F01.what-is-testing",{"title":978,"path":979,"stem":980},"Піраміда тестування — Стратегія, а не Догма","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-pyramid","01.csharp\u002F11.aspnet\u002F07.testing\u002F02.testing-pyramid",{"title":982,"path":983,"stem":984},"Дві Школи Тестування — Лондон проти Детройту","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-schools","01.csharp\u002F11.aspnet\u002F07.testing\u002F03.testing-schools",{"title":986,"path":987,"stem":988},"TDD та BDD — Тести як Дизайн-інструмент","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftdd-and-bdd","01.csharp\u002F11.aspnet\u002F07.testing\u002F04.tdd-and-bdd",{"title":990,"path":991,"stem":992},"Що саме тестувати — Техніки аналізу та Циклomatична складність","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwhat-to-test","01.csharp\u002F11.aspnet\u002F07.testing\u002F05.what-to-test",{"title":994,"path":995,"stem":996},"Тестові Фреймворки — Навіщо вони і що всередині","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftest-frameworks","01.csharp\u002F11.aspnet\u002F07.testing\u002F06.test-frameworks",{"title":998,"path":999,"stem":1000},"xUnit — Факти, Теорії та Lifecycle тестів","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-basics","01.csharp\u002F11.aspnet\u002F07.testing\u002F07.xunit-basics",{"title":1002,"path":1003,"stem":1004},"xUnit Advanced — Fixtures, Кастомізація та Розширення","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fxunit-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F08.xunit-advanced",{"title":1006,"path":1007,"stem":1008},"Moq — Глибоке занурення в мокування","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fmocking-with-moq","01.csharp\u002F11.aspnet\u002F07.testing\u002F09.mocking-with-moq",{"title":1010,"path":1011,"stem":1012},"Тестування Баз Даних — EF Core, SQLite та Testcontainers","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fdatabase-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F10.database-testing",{"title":1014,"path":1015,"stem":1016},"Integration Testing — Частина 1 [Теорія та WebApplicationFactory]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F11.integration-testing",{"title":1018,"path":1019,"stem":1020},"Інтеграційне тестування — Практика","\u002Fcsharp\u002Faspnet\u002Ftesting\u002F11a.integration-testing-practice","01.csharp\u002F11.aspnet\u002F07.testing\u002F11a.integration-testing-practice",{"title":1022,"path":1023,"stem":1024},"Integration Testing — Частина 2 [Просунуті Сценарії та Testcontainers]","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fintegration-testing-advanced","01.csharp\u002F11.aspnet\u002F07.testing\u002F12.integration-testing-advanced",{"title":1026,"path":1027,"stem":1028},"Професійний Postman: Колекції, Змінні та GitHub Інтеграція","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fpostman-professional","01.csharp\u002F11.aspnet\u002F07.testing\u002F13.postman-professional",{"title":1030,"path":1031,"stem":1032},"HttpClient у Тестах Частина 1: Архітектура та MockHttpMessageHandler","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fhttpclient-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F14.httpclient-testing",{"title":1034,"path":1035,"stem":1036},"HttpClient у Тестах Частина 2: WireMock.Net та Resilience","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fwiremock-net","01.csharp\u002F11.aspnet\u002F07.testing\u002F15.wiremock-net",{"title":1038,"path":1039,"stem":1040},"Патерни та Анти-патерни Тестування: Test Smells","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Ftesting-patterns","01.csharp\u002F11.aspnet\u002F07.testing\u002F16.testing-patterns",{"title":1042,"path":1043,"stem":1044},"Просунуті інструменти: Time, Snapshots та Властивості","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fadvanced-testing-tools","01.csharp\u002F11.aspnet\u002F07.testing\u002F17.advanced-testing-tools",{"title":1046,"path":1047,"stem":1048},"Тестування Архітектури з NetArchTest","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Farchitecture-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F18.architecture-testing",{"title":1050,"path":1051,"stem":1052},"Тестування Продуктивності: BenchmarkDotNet, NBomber та k6","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fperformance-testing","01.csharp\u002F11.aspnet\u002F07.testing\u002F19.performance-testing",{"title":1054,"path":1055,"stem":1056},"Залишок плану для курсу \"Тестування ASP.NET Minimal API\"","\u002Fcsharp\u002Faspnet\u002Ftesting\u002Fremaining_plan","01.csharp\u002F11.aspnet\u002F07.testing\u002Fremaining_plan",{"title":1058,"icon":1059,"path":1060,"stem":1061,"children":1062,"page":59},"Платежі","i-lucide-credit-card","\u002Fcsharp\u002Faspnet\u002Fpayments","01.csharp\u002F11.aspnet\u002F08.payments",[1063,1067,1071,1075,1079,1083,1087,1091,1095,1099,1103,1107],{"title":1064,"path":1065,"stem":1066},"Основи платіжної інфраструктури","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-fundamentals","01.csharp\u002F11.aspnet\u002F08.payments\u002F01.payment-fundamentals",{"title":1068,"path":1069,"stem":1070},"Методи оплати в Україні","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-methods-ukraine","01.csharp\u002F11.aspnet\u002F08.payments\u002F02.payment-methods-ukraine",{"title":1072,"path":1073,"stem":1074},"PCI DSS та безпека платежів","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpci-dss-security","01.csharp\u002F11.aspnet\u002F08.payments\u002F03.pci-dss-security",{"title":1076,"path":1077,"stem":1078},"Архітектура платіжної підсистеми","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fpayment-architecture","01.csharp\u002F11.aspnet\u002F08.payments\u002F04.payment-architecture",{"title":1080,"path":1081,"stem":1082},"Інтеграція LiqPay (ПриватБанк)","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fliqpay-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F05.liqpay-integration",{"title":1084,"path":1085,"stem":1086},"Інтеграція Monobank Acquiring API","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fmonobank-acquiring","01.csharp\u002F11.aspnet\u002F08.payments\u002F06.monobank-acquiring",{"title":1088,"path":1089,"stem":1090},"Інтеграція Stripe","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fstripe-integration","01.csharp\u002F11.aspnet\u002F08.payments\u002F07.stripe-integration",{"title":1092,"path":1093,"stem":1094},"Webhooks — глибоке занурення","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fwebhooks-deep-dive","01.csharp\u002F11.aspnet\u002F08.payments\u002F08.webhooks-deep-dive",{"title":1096,"path":1097,"stem":1098},"Підписки та рекурентні платежі","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fsubscriptions-recurring","01.csharp\u002F11.aspnet\u002F08.payments\u002F09.subscriptions-recurring",{"title":1100,"path":1101,"stem":1102},"Повернення коштів та диспути","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Frefunds-disputes","01.csharp\u002F11.aspnet\u002F08.payments\u002F10.refunds-disputes",{"title":1104,"path":1105,"stem":1106},"Тестування платіжних інтеграцій","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Ftesting-payments","01.csharp\u002F11.aspnet\u002F08.payments\u002F11.testing-payments",{"title":1108,"path":1109,"stem":1110},"Чекліст виходу в Production","\u002Fcsharp\u002Faspnet\u002Fpayments\u002Fproduction-checklist","01.csharp\u002F11.aspnet\u002F08.payments\u002F12.production-checklist",{"title":1112,"icon":1113,"items":1114,"path":1127,"stem":1128,"children":1129,"page":59},"Популярні бібліотеки","lucide:box",[1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126],"01.fluent-validation","02.mapster","03.erroror-result-pattern","04.serilog","05.mediatr","06.polly","07.health-checks","08.feature-management","09.fluent-email","10.quest-pdf","11.bogus","12.humanizer-guard","\u002Fcsharp\u002Faspnet\u002Flibraries","01.csharp\u002F11.aspnet\u002F09.libraries",[1130,1134,1138,1142,1146,1150,1154,1158,1162,1166,1170,1174,1178],{"title":1131,"path":1132,"stem":1133},"Валідація з FluentValidation в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-validation","01.csharp\u002F11.aspnet\u002F09.libraries\u002F01.fluent-validation",{"title":1135,"path":1136,"stem":1137},"Маппінг об","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmapster","01.csharp\u002F11.aspnet\u002F09.libraries\u002F02.mapster",{"title":1139,"path":1140,"stem":1141},"Обробка помилок з ErrorOr та Result Pattern в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ferroror-result-pattern","01.csharp\u002F11.aspnet\u002F09.libraries\u002F03.erroror-result-pattern",{"title":1143,"path":1144,"stem":1145},"Структуроване логування з Serilog в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fserilog","01.csharp\u002F11.aspnet\u002F09.libraries\u002F04.serilog",{"title":1147,"path":1148,"stem":1149},"CQRS та Mediator з MediatR в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fmediatr","01.csharp\u002F11.aspnet\u002F09.libraries\u002F05.mediatr",{"title":1151,"path":1152,"stem":1153},"Відмовостійкість з Polly в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fpolly","01.csharp\u002F11.aspnet\u002F09.libraries\u002F06.polly",{"title":1155,"path":1156,"stem":1157},"Health Checks в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F09.libraries\u002F07.health-checks",{"title":1159,"path":1160,"stem":1161},"Feature Management та Feature Flags в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffeature-management","01.csharp\u002F11.aspnet\u002F09.libraries\u002F08.feature-management",{"title":1163,"path":1164,"stem":1165},"Відправка Email з FluentEmail в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Ffluent-email","01.csharp\u002F11.aspnet\u002F09.libraries\u002F09.fluent-email",{"title":1167,"path":1168,"stem":1169},"Генерація PDF з QuestPDF в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fquest-pdf","01.csharp\u002F11.aspnet\u002F09.libraries\u002F10.quest-pdf",{"title":1171,"path":1172,"stem":1173},"Генерація тестових даних з Bogus в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fbogus","01.csharp\u002F11.aspnet\u002F09.libraries\u002F11.bogus",{"title":1175,"path":1176,"stem":1177},"Humanizer та Guard Clauses в ASP.NET Core","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fhumanizer-guard","01.csharp\u002F11.aspnet\u002F09.libraries\u002F12.humanizer-guard",{"title":1179,"path":1180,"stem":1181},"План модуля 10.libraries — Популярні бібліотеки ASP.NET","\u002Fcsharp\u002Faspnet\u002Flibraries\u002Fplan","01.csharp\u002F11.aspnet\u002F09.libraries\u002Fplan",{"title":1183,"icon":1184,"path":1185,"stem":1186,"children":1187,"page":59},"Razor Pages","i-lucide-layout-template","\u002Fcsharp\u002Faspnet\u002Frazor-pages","01.csharp\u002F11.aspnet\u002F10.razor-pages",[1188,1192,1196,1200,1204,1208],{"title":1189,"path":1190,"stem":1191},"Від Minimal API до Razor Pages: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ffrom-minimal-api","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F01.from-minimal-api",{"title":1193,"path":1194,"stem":1195},"PageModel: логіка сторінки Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fpage-model","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F02.page-model",{"title":1197,"path":1198,"stem":1199},"Razor синтаксис: шаблонізатор у .cshtml","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Frazor-syntax","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F03.razor-syntax",{"title":1201,"path":1202,"stem":1203},"Tag Helpers: типізований HTML","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Ftag-helpers","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F04.tag-helpers",{"title":1205,"path":1206,"stem":1207},"Форми і валідація: повний цикл обробки даних","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fforms-validation","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F05.forms-validation",{"title":1209,"path":1210,"stem":1211},"Практичний проєкт: TaskManager на Razor Pages","\u002Fcsharp\u002Faspnet\u002Frazor-pages\u002Fproject-task-manager","01.csharp\u002F11.aspnet\u002F10.razor-pages\u002F06.project-task-manager",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":59},"ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc","01.csharp\u002F11.aspnet\u002F11.mvc",[1217,1221,1225,1229,1233,1237,1241,1245,1249,1253,1257,1261,1265,1269,1273,1277,1281,1285],{"title":1218,"path":1219,"stem":1220},"Патерн MVC: архітектура, що змінила веб","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-pattern","01.csharp\u002F11.aspnet\u002F11.mvc\u002F01.mvc-pattern",{"title":1222,"path":1223,"stem":1224},"Від Razor Pages до MVC: концептуальний перехід","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffrom-razor-pages","01.csharp\u002F11.aspnet\u002F11.mvc\u002F02.from-razor-pages",{"title":1226,"path":1227,"stem":1228},"Controllers та Actions: серце MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fcontrollers-actions","01.csharp\u002F11.aspnet\u002F11.mvc\u002F03.controllers-actions",{"title":1230,"path":1231,"stem":1232},"Маршрутизація в MVC: Convention vs Attribute Routing","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Frouting-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F04.routing-mvc",{"title":1234,"path":1235,"stem":1236},"Model Binding: від HTTP до C#","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmodel-binding","01.csharp\u002F11.aspnet\u002F11.mvc\u002F05.model-binding",{"title":1238,"path":1239,"stem":1240},"Views, ViewData, ViewBag, TempData і ViewModel","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fviews-viewdata-tempdata","01.csharp\u002F11.aspnet\u002F11.mvc\u002F06.views-viewdata-tempdata",{"title":1242,"path":1243,"stem":1244},"Filters: аспектно-орієнтоване програмування в MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffilters","01.csharp\u002F11.aspnet\u002F11.mvc\u002F07.filters",{"title":1246,"path":1247,"stem":1248},"Areas: структурування великих застосунків","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fareas","01.csharp\u002F11.aspnet\u002F11.mvc\u002F08.areas",{"title":1250,"path":1251,"stem":1252},"View Components: повторювані незалежні блоки UI","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fview-components","01.csharp\u002F11.aspnet\u002F11.mvc\u002F09.view-components",{"title":1254,"path":1255,"stem":1256},"Display та Editor Templates","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fdisplay-editor-templates","01.csharp\u002F11.aspnet\u002F11.mvc\u002F10.display-editor-templates",{"title":1258,"path":1259,"stem":1260},"Валідація: IValidatableObject та FluentValidation","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fvalidation-advanced","01.csharp\u002F11.aspnet\u002F11.mvc\u002F11.validation-advanced",{"title":1262,"path":1263,"stem":1264},"HTMX: інтерактивність через HTML-атрибути","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx","01.csharp\u002F11.aspnet\u002F11.mvc\u002F12.htmx",{"title":1266,"path":1267,"stem":1268},"HTMX у ASP.NET Core MVC: серверна інтеграція","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fajax-htmx-mvc","01.csharp\u002F11.aspnet\u002F11.mvc\u002F13.ajax-htmx-mvc",{"title":1270,"path":1271,"stem":1272},"Практичний проєкт: Каталог товарів з HTMX","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fhtmx-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F14.htmx-project",{"title":1274,"path":1275,"stem":1276},"Завантаження та обробка файлів","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Ffile-upload","01.csharp\u002F11.aspnet\u002F11.mvc\u002F15.file-upload",{"title":1278,"path":1279,"stem":1280},"Глобалізація та Локалізація MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fglobalization-localization","01.csharp\u002F11.aspnet\u002F11.mvc\u002F16.globalization-localization",{"title":1282,"path":1283,"stem":1284},"Підсумковий проєкт: Блог-платформа","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fmvc-project","01.csharp\u002F11.aspnet\u002F11.mvc\u002F17.mvc-project",{"title":1286,"path":1287,"stem":1288},"План курсу: ASP.NET Core MVC","\u002Fcsharp\u002Faspnet\u002Fmvc\u002Fplan","01.csharp\u002F11.aspnet\u002F11.mvc\u002Fplan",{"title":1290,"path":1291,"stem":1292,"children":1293,"page":59},"Web Api","\u002Fcsharp\u002Faspnet\u002Fweb-api","01.csharp\u002F11.aspnet\u002F12.web-api",[1294,1298,1302,1306,1310,1314,1318,1322,1326,1330,1334,1338,1342],{"title":1295,"path":1296,"stem":1297},"Від Minimal API до Controller-based API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffrom-minimal-api-to-controllers","01.csharp\u002F11.aspnet\u002F12.web-api\u002F01.from-minimal-api-to-controllers",{"title":1299,"path":1300,"stem":1301},"ControllerBase, ActionResult\u003CT> та Response Types","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontroller-base-actionresult","01.csharp\u002F11.aspnet\u002F12.web-api\u002F02.controller-base-actionresult",{"title":1303,"path":1304,"stem":1305},"Content Negotiation - JSON, XML та власні форматери","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fcontent-negotiation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F03.content-negotiation",{"title":1307,"path":1308,"stem":1309},"Версіонування API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-versioning","01.csharp\u002F11.aspnet\u002F12.web-api\u002F04.api-versioning",{"title":1311,"path":1312,"stem":1313},"ProblemDetails та структурована обробка помилок","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fproblemdetails-error-handling","01.csharp\u002F11.aspnet\u002F12.web-api\u002F05.problemdetails-error-handling",{"title":1315,"path":1316,"stem":1317},"Фільтри у Web API контексті","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Ffilters-for-api","01.csharp\u002F11.aspnet\u002F12.web-api\u002F06.filters-for-api",{"title":1319,"path":1320,"stem":1321},"Пагінація, фільтрація та сортування","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fpagination-filtering-sorting","01.csharp\u002F11.aspnet\u002F12.web-api\u002F07.pagination-filtering-sorting",{"title":1323,"path":1324,"stem":1325},"HATEOAS та Resource Expansion","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhateoas-resource-expansion","01.csharp\u002F11.aspnet\u002F12.web-api\u002F08.hateoas-resource-expansion",{"title":1327,"path":1328,"stem":1329},"Гібридна архітектура - Minimal API + Controllers","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fminimal-api-vs-controllers-hybrid","01.csharp\u002F11.aspnet\u002F12.web-api\u002F09.minimal-api-vs-controllers-hybrid",{"title":1331,"path":1332,"stem":1333},"Документація API - Swashbuckle, NSwag та генерація клієнтів","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fapi-documentation-generation","01.csharp\u002F11.aspnet\u002F12.web-api\u002F10.api-documentation-generation",{"title":1335,"path":1336,"stem":1337},"Health Checks та моніторинг API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fhealth-checks-monitoring","01.csharp\u002F11.aspnet\u002F12.web-api\u002F11.health-checks-monitoring",{"title":1339,"path":1340,"stem":1341},"Підсумковий проєкт - Production-Ready REST API","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fweb-api-project","01.csharp\u002F11.aspnet\u002F12.web-api\u002F12.web-api-project",{"title":1343,"path":1344,"stem":1345},"План курсу: ASP.NET Core Web API (Controllers)","\u002Fcsharp\u002Faspnet\u002Fweb-api\u002Fplan","01.csharp\u002F11.aspnet\u002F12.web-api\u002Fplan",{"title":1347,"icon":1348,"path":1349,"stem":1350,"children":1351,"page":59},"Моніторинг","i-lucide-activity","\u002Fcsharp\u002Faspnet\u002Fmonitoring","01.csharp\u002F11.aspnet\u002F13.monitoring",[1352,1356,1360],{"title":1353,"path":1354,"stem":1355},"Спостережуваність: від console.log до production-систем","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fobservability-intro","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F01.observability-intro",{"title":1357,"path":1358,"stem":1359},"Health Checks: перший рівень observability","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fhealth-checks","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F02.health-checks",{"title":1361,"path":1362,"stem":1363},"Вбудовані метрики .NET 10 та System.Diagnostics.Metrics","\u002Fcsharp\u002Faspnet\u002Fmonitoring\u002Fdotnet-metrics","01.csharp\u002F11.aspnet\u002F13.monitoring\u002F03.dotnet-metrics",{"title":1365,"icon":1366,"path":1367,"stem":1368,"children":1369,"page":59},"Desktop UI","i-lucide-app-window","\u002Fcsharp\u002Fdesktop-ui","01.csharp\u002F12.desktop-ui",[1370,1374,1378,1382,1386,1390,1394,1398,1402,1406,1410,1414,1418,1422,1426,1430,1434,1438,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482,1486,1490,1494,1498,1502,1506,1510,1514,1518,1522,1526,1530,1534,1538,1542,1546,1550,1554,1558,1562,1566,1570,1574,1578,1582,1586,1590,1594,1598,1602,1606,1610,1614,1618,1622,1626,1630,1634,1638,1642,1646,1650],{"title":1371,"path":1372,"stem":1373},"Що таке десктопна розробка?","\u002Fcsharp\u002Fdesktop-ui\u002Fwhat-is-desktop-dev","01.csharp\u002F12.desktop-ui\u002F01.what-is-desktop-dev",{"title":1375,"path":1376,"stem":1377},"Архітектура WPF — як влаштований графічний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-architecture","01.csharp\u002F12.desktop-ui\u002F02.wpf-architecture",{"title":1379,"path":1380,"stem":1381},"Перший WPF-проєкт — від нуля до вікна","\u002Fcsharp\u002Fdesktop-ui\u002Ffirst-wpf-app","01.csharp\u002F12.desktop-ui\u002F03.first-wpf-app",{"title":1383,"path":1384,"stem":1385},"Перший Avalonia-проєкт: WPF для всіх платформ","\u002Fcsharp\u002Fdesktop-ui\u002F03a.first-avalonia-app","01.csharp\u002F12.desktop-ui\u002F03a.first-avalonia-app",{"title":1387,"path":1388,"stem":1389},"XAML: декларативний інтерфейс","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-basics","01.csharp\u002F12.desktop-ui\u002F04.xaml-basics",{"title":1391,"path":1392,"stem":1393},"Fluent UI у WPF — сучасний дизайн Windows 11","\u002Fcsharp\u002Fdesktop-ui\u002F04a.wpf-fluent-ui","01.csharp\u002F12.desktop-ui\u002F04a.wpf-fluent-ui",{"title":1395,"path":1396,"stem":1397},"WPF UI — сучасна бібліотека Fluent контролів","\u002Fcsharp\u002Fdesktop-ui\u002F04b.wpf-ui-library","01.csharp\u002F12.desktop-ui\u002F04b.wpf-ui-library",{"title":1399,"path":1400,"stem":1401},"HandyControl — велика бібліотека UI контролів для WPF","\u002Fcsharp\u002Fdesktop-ui\u002F04c.handycontrol-library","01.csharp\u002F12.desktop-ui\u002F04c.handycontrol-library",{"title":1403,"path":1404,"stem":1405},"Простори імен та ресурси XAML","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-namespaces-resources","01.csharp\u002F12.desktop-ui\u002F05.xaml-namespaces-resources",{"title":1407,"path":1408,"stem":1409},"XAML в Avalonia: ключові відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F05a.avalonia-xaml-differences","01.csharp\u002F12.desktop-ui\u002F05a.avalonia-xaml-differences",{"title":1411,"path":1412,"stem":1413},"Розширення розмітки XAML (Markup Extensions)","\u002Fcsharp\u002Fdesktop-ui\u002Fxaml-markup-extensions","01.csharp\u002F12.desktop-ui\u002F06.xaml-markup-extensions",{"title":1415,"path":1416,"stem":1417},"Панелі Layout: StackPanel, WrapPanel, DockPanel","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part1","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part1",{"title":1419,"path":1420,"stem":1421},"Grid, Canvas, UniformGrid","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-panels-part2","01.csharp\u002F12.desktop-ui\u002F07.layout-panels-part2",{"title":1423,"path":1424,"stem":1425},"Просунуті техніки Layout","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-advanced","01.csharp\u002F12.desktop-ui\u002F08.layout-advanced",{"title":1427,"path":1428,"stem":1429},"Адаптивний Layout та найкращі практики","\u002Fcsharp\u002Fdesktop-ui\u002Flayout-responsive","01.csharp\u002F12.desktop-ui\u002F09.layout-responsive",{"title":1431,"path":1432,"stem":1433},"Layout в Avalonia: відмінності та нові можливості","\u002Fcsharp\u002Fdesktop-ui\u002F09a.layout-avalonia","01.csharp\u002F12.desktop-ui\u002F09a.layout-avalonia",{"title":1435,"path":1436,"stem":1437},"Button, Image, ProgressBar та інші базові контроли","\u002Fcsharp\u002Fdesktop-ui\u002Fbasic-controls","01.csharp\u002F12.desktop-ui\u002F10.basic-controls",{"title":1439,"path":1440,"stem":1441},"Контроли в Avalonia: відмінності від WPF","\u002Fcsharp\u002Fdesktop-ui\u002F10a.controls-avalonia","01.csharp\u002F12.desktop-ui\u002F10a.controls-avalonia",{"title":1443,"path":1444,"stem":1445},"Текстові контроли — TextBlock, TextBox, RichTextBox","\u002Fcsharp\u002Fdesktop-ui\u002Ftext-controls","01.csharp\u002F12.desktop-ui\u002F11.text-controls",{"title":1447,"path":1448,"stem":1449},"Контроли вибору — CheckBox, RadioButton, ComboBox, ListBox, DatePicker","\u002Fcsharp\u002Fdesktop-ui\u002Fselection-controls","01.csharp\u002F12.desktop-ui\u002F12.selection-controls",{"title":1451,"path":1452,"stem":1453},"Content Model — GroupBox, Expander, TabControl, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fcontent-controls","01.csharp\u002F12.desktop-ui\u002F13.content-controls",{"title":1455,"path":1456,"stem":1457},"UI\u002FUX принципи десктопних застосунків","\u002Fcsharp\u002Fdesktop-ui\u002F13a.ui-ux-principles","01.csharp\u002F12.desktop-ui\u002F13a.ui-ux-principles",{"title":1459,"path":1460,"stem":1461},"Dependency Properties — Концепція та Value Resolution","\u002Fcsharp\u002Fdesktop-ui\u002Fdependency-properties-part1","01.csharp\u002F12.desktop-ui\u002F14.dependency-properties-part1",{"title":1463,"path":1464,"stem":1465},"Avalonia Property System — StyledProperty та DirectProperty","\u002Fcsharp\u002Fdesktop-ui\u002F14a.avalonia-property-system","01.csharp\u002F12.desktop-ui\u002F14a.avalonia-property-system",{"title":1467,"path":1468,"stem":1469},"Attached Properties — Властивості без меж","\u002Fcsharp\u002Fdesktop-ui\u002Fattached-properties","01.csharp\u002F12.desktop-ui\u002F15.attached-properties",{"title":1471,"path":1472,"stem":1473},"Routed Events — Маршрутизація подій у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Frouted-events","01.csharp\u002F12.desktop-ui\u002F16.routed-events",{"title":1475,"path":1476,"stem":1477},"Data Binding — Від Code-Behind до Декларативності","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part1","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part1",{"title":1479,"path":1480,"stem":1481},"INotifyPropertyChanged — Живе оновлення UI","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-basics-part2","01.csharp\u002F12.desktop-ui\u002F17.data-binding-basics-part2",{"title":1483,"path":1484,"stem":1485},"Compiled Bindings в Avalonia — Безпека на етапі компіляції","\u002Fcsharp\u002Fdesktop-ui\u002F17a.avalonia-compiled-bindings","01.csharp\u002F12.desktop-ui\u002F17a.avalonia-compiled-bindings",{"title":1487,"path":1488,"stem":1489},"Просунутий Data Binding — ElementName, RelativeSource, MultiBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-binding-advanced","01.csharp\u002F12.desktop-ui\u002F18.data-binding-advanced",{"title":1491,"path":1492,"stem":1493},"Value Converters — Перетворення типів даних у Data Binding","\u002Fcsharp\u002Fdesktop-ui\u002Fvalue-converters","01.csharp\u002F12.desktop-ui\u002F19.value-converters",{"title":1495,"path":1496,"stem":1497},"Data Templates — Візуалізація об'єктів у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-templates","01.csharp\u002F12.desktop-ui\u002F20.data-templates",{"title":1499,"path":1500,"stem":1501},"Collections Binding Part 1 — ObservableCollection та ItemsControl","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part1","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part1",{"title":1503,"path":1504,"stem":1505},"Collections Binding Part 2 — ICollectionView, Filtering, Sorting та Virtualization","\u002Fcsharp\u002Fdesktop-ui\u002Fcollections-binding-part2","01.csharp\u002F12.desktop-ui\u002F21.collections-binding-part2",{"title":1507,"path":1508,"stem":1509},"MVVM Pattern — Від Spaghetti Code до архітектури","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-pattern","01.csharp\u002F12.desktop-ui\u002F22.mvvm-pattern",{"title":1511,"path":1512,"stem":1513},"ViewModel Implementation — Від BaseViewModel до валідації","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-implementation","01.csharp\u002F12.desktop-ui\u002F23.viewmodel-implementation",{"title":1515,"path":1516,"stem":1517},"Commands — Від event handlers до декларативних команд","\u002Fcsharp\u002Fdesktop-ui\u002Fcommands","01.csharp\u002F12.desktop-ui\u002F24.commands",{"title":1519,"path":1520,"stem":1521},"MVVM Toolkit — MVVM без boilerplate через Source Generators","\u002Fcsharp\u002Fdesktop-ui\u002Fmvvm-toolkit","01.csharp\u002F12.desktop-ui\u002F25.mvvm-toolkit",{"title":1523,"path":1524,"stem":1525},"Messenger Pattern — Комунікація між ViewModel без прямих посилань","\u002Fcsharp\u002Fdesktop-ui\u002Fmessenger-pattern","01.csharp\u002F12.desktop-ui\u002F26.messenger-pattern",{"title":1527,"path":1528,"stem":1529},"Стилі WPF — CSS для десктопу","\u002Fcsharp\u002Fdesktop-ui\u002Fstyles-basics","01.csharp\u002F12.desktop-ui\u002F27.styles-basics",{"title":1531,"path":1532,"stem":1533},"CSS-like стилі Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F27a.avalonia-css-styling","01.csharp\u002F12.desktop-ui\u002F27a.avalonia-css-styling",{"title":1535,"path":1536,"stem":1537},"Control Templates — Частина 1. Концепція та TemplateBinding","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part1","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part1",{"title":1539,"path":1540,"stem":1541},"Control Templates — Частина 2. Named Parts та ContentPresenter","\u002Fcsharp\u002Fdesktop-ui\u002Fcontrol-templates-part2","01.csharp\u002F12.desktop-ui\u002F28.control-templates-part2",{"title":1543,"path":1544,"stem":1545},"Control Themes в Avalonia — нова ера стилізації","\u002Fcsharp\u002Fdesktop-ui\u002F28a.avalonia-control-themes","01.csharp\u002F12.desktop-ui\u002F28a.avalonia-control-themes",{"title":1547,"path":1548,"stem":1549},"Triggers та Visual State Manager у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Ftriggers-visual-states","01.csharp\u002F12.desktop-ui\u002F29.triggers-visual-states",{"title":1551,"path":1552,"stem":1553},"Pseudo-classes в Avalonia — замість WPF Triggers","\u002Fcsharp\u002Fdesktop-ui\u002F29a.avalonia-pseudo-classes","01.csharp\u002F12.desktop-ui\u002F29a.avalonia-pseudo-classes",{"title":1555,"path":1556,"stem":1557},"Теми та ресурсні словники у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fresources-themes","01.csharp\u002F12.desktop-ui\u002F30.resources-themes",{"title":1559,"path":1560,"stem":1561},"Avalonia Themes — Fluent Design та система тематизації","\u002Fcsharp\u002Fdesktop-ui\u002F30a.avalonia-themes-fluent","01.csharp\u002F12.desktop-ui\u002F30a.avalonia-themes-fluent",{"title":1563,"path":1564,"stem":1565},"Контроли колекцій — глибоке занурення","\u002Fcsharp\u002Fdesktop-ui\u002Fcollection-controls","01.csharp\u002F12.desktop-ui\u002F31.collection-controls",{"title":1567,"path":1568,"stem":1569},"DataGrid — колонки та базове відображення","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part1","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part1",{"title":1571,"path":1572,"stem":1573},"DataGrid — сортування, фільтрація, редагування","\u002Fcsharp\u002Fdesktop-ui\u002Fdatagrid-part2","01.csharp\u002F12.desktop-ui\u002F32.datagrid-part2",{"title":1575,"path":1576,"stem":1577},"TreeView та GridView","\u002Fcsharp\u002Fdesktop-ui\u002Ftreeview-listview","01.csharp\u002F12.desktop-ui\u002F33.treeview-listview",{"title":1579,"path":1580,"stem":1581},"Меню, Toolbar, ContextMenu, StatusBar","\u002Fcsharp\u002Fdesktop-ui\u002Fmenus-toolbars","01.csharp\u002F12.desktop-ui\u002F34.menus-toolbars",{"title":1583,"path":1584,"stem":1585},"Навігація та керування вікнами. Частина 1: вікна та сторінки","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part1","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part1",{"title":1587,"path":1588,"stem":1589},"Навігація та керування вікнами. Частина 2: MVVM-навігація","\u002Fcsharp\u002Fdesktop-ui\u002Fnavigation-windows-part2","01.csharp\u002F12.desktop-ui\u002F35.navigation-windows-part2",{"title":1591,"path":1592,"stem":1593},"Avalonia — Навігація та діалоги","\u002Fcsharp\u002Fdesktop-ui\u002F35a.avalonia-navigation-dialogs","01.csharp\u002F12.desktop-ui\u002F35a.avalonia-navigation-dialogs",{"title":1595,"path":1596,"stem":1597},"Діалоги та File Pickers у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fdialogs-file-pickers","01.csharp\u002F12.desktop-ui\u002F36.dialogs-file-pickers",{"title":1599,"path":1600,"stem":1601},"UserControl: компонентний підхід у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fuser-controls","01.csharp\u002F12.desktop-ui\u002F37.user-controls",{"title":1603,"path":1604,"stem":1605},"Custom Controls: Lookless Controls у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fcustom-controls","01.csharp\u002F12.desktop-ui\u002F38.custom-controls",{"title":1607,"path":1608,"stem":1609},"Avalonia TemplatedControl — Lookless Controls","\u002Fcsharp\u002Fdesktop-ui\u002F38a.avalonia-templated-controls","01.csharp\u002F12.desktop-ui\u002F38a.avalonia-templated-controls",{"title":1611,"path":1612,"stem":1613},"Анімації у WPF: Storyboard та Easing Functions","\u002Fcsharp\u002Fdesktop-ui\u002Fanimations-transitions","01.csharp\u002F12.desktop-ui\u002F39.animations-transitions",{"title":1615,"path":1616,"stem":1617},"Анімації в Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002F39a.avalonia-animations","01.csharp\u002F12.desktop-ui\u002F39a.avalonia-animations",{"title":1619,"path":1620,"stem":1621},"2D Графіка та Мультимедіа у WPF","\u002Fcsharp\u002Fdesktop-ui\u002Fmedia-graphics","01.csharp\u002F12.desktop-ui\u002F40.media-graphics",{"title":1623,"path":1624,"stem":1625},"Dependency Injection у WPF та Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Fdi-integration","01.csharp\u002F12.desktop-ui\u002F41.di-integration",{"title":1627,"path":1628,"stem":1629},"SQLite та EF Core у десктопних додатках","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part1","01.csharp\u002F12.desktop-ui\u002F42.data-persistence-part1",{"title":1631,"path":1632,"stem":1633},"Repository Pattern та Unit of Work","\u002Fcsharp\u002Fdesktop-ui\u002Fdata-persistence-part2","01.csharp\u002F12.desktop-ui\u002F43.data-persistence-part2",{"title":1635,"path":1636,"stem":1637},"Тестування ViewModels","\u002Fcsharp\u002Fdesktop-ui\u002Fviewmodel-testing","01.csharp\u002F12.desktop-ui\u002F44.viewmodel-testing",{"title":1639,"path":1640,"stem":1641},"Avalonia Headless Testing — тестування UI без вікон","\u002Fcsharp\u002Fdesktop-ui\u002F44a.avalonia-headless-testing","01.csharp\u002F12.desktop-ui\u002F44a.avalonia-headless-testing",{"title":1643,"path":1644,"stem":1645},"Кросплатформна розробка з Avalonia","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-cross-platform","01.csharp\u002F12.desktop-ui\u002F45.avalonia-cross-platform",{"title":1647,"path":1648,"stem":1649},"Пакування та розгортання Avalonia додатків","\u002Fcsharp\u002Fdesktop-ui\u002Favalonia-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F46.avalonia-packaging-deployment",{"title":1651,"path":1652,"stem":1653},"Розгортання WPF застосунків","\u002Fcsharp\u002Fdesktop-ui\u002Fwpf-packaging-deployment","01.csharp\u002F12.desktop-ui\u002F47.wpf-packaging-deployment",{"title":1655,"icon":658,"path":1656,"stem":1657,"children":1658,"page":59},"Network Programming","\u002Fcsharp\u002Fnetwork-programming","01.csharp\u002F13.network-programming",[1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699],{"title":1660,"path":1661,"stem":1662},"Основи комп'ютерних мереж","\u002Fcsharp\u002Fnetwork-programming\u002Ffoundations","01.csharp\u002F13.network-programming\u002F01.foundations",{"title":1664,"path":1665,"stem":1666},"Модель OSI та стек TCP\u002FIP","\u002Fcsharp\u002Fnetwork-programming\u002Fosi-model","01.csharp\u002F13.network-programming\u002F02.osi-model",{"title":1668,"path":1669,"stem":1670},"IP-протокол та адресація","\u002Fcsharp\u002Fnetwork-programming\u002Fip-addressing","01.csharp\u002F13.network-programming\u002F03.ip-addressing",{"title":1672,"path":1673,"stem":1674},"UDP — протокол без з'єднання","\u002Fcsharp\u002Fnetwork-programming\u002Fudp","01.csharp\u002F13.network-programming\u002F05.udp",{"title":1676,"path":1677,"stem":1678},"UDP Broadcast та Multicast","\u002Fcsharp\u002Fnetwork-programming\u002Fudp-broadcast-multicast","01.csharp\u002F13.network-programming\u002F06.udp-broadcast-multicast",{"title":1680,"path":1681,"stem":1682},"HTTP — протокол вебу","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-fundamentals","01.csharp\u002F13.network-programming\u002F07.http-fundamentals",{"title":1684,"path":1685,"stem":1686},"HttpListener — вбудований HTTP-сервер .NET","\u002Fcsharp\u002Fnetwork-programming\u002F07a.http-listener","01.csharp\u002F13.network-programming\u002F07a.http-listener",{"title":1688,"path":1689,"stem":1690},"HTTP Advanced — cookies, аутентифікація та HTTPS","\u002Fcsharp\u002Fnetwork-programming\u002Fhttp-advanced","01.csharp\u002F13.network-programming\u002F08.http-advanced",{"title":1692,"path":1693,"stem":1694},"SMTP та протоколи електронної пошти","\u002Fcsharp\u002Fnetwork-programming\u002Fsmtp","01.csharp\u002F13.network-programming\u002F09.smtp",{"title":1696,"path":1697,"stem":1698},"WebSocket — повнодуплексний протокол реального часу","\u002Fcsharp\u002Fnetwork-programming\u002Fwebsockets","01.csharp\u002F13.network-programming\u002F10.websockets",{"title":1700,"path":1701,"stem":1702},"TLS\u002FSSL — криптографічний захист мережевих з'єднань","\u002Fcsharp\u002Fnetwork-programming\u002Ftls-ssl","01.csharp\u002F13.network-programming\u002F11.tls-ssl",{"title":1704,"path":1705,"stem":1706},"C# & .NET: The Ultimate Roadmap","\u002Fcsharp\u002Froadmap","01.csharp\u002Froadmap",{"title":1708,"icon":1709,"path":1710,"stem":1711,"children":1712,"page":59},"C++","i-devicon-cplusplus","\u002Fcpp","02.cpp",[1713,1717,1721,1725,1729,1733,1737,1741,1745,1748,1752,1756,1760,1764,1768,1772,1776,1780,1784,1788,1792,1796,1800,1804,1808,1812,1816,1820,1824,1828,1832,1836,1840,1844,1848,1852,1856,1860,1864,1868,1872,1876,1880,1884,1888,1892,1896,1900,1904,1908],{"title":1714,"path":1715,"stem":1716},"Вступ у програмування та алгоритми","\u002Fcpp\u002Fintro-algorithms","02.cpp\u002F01.intro-algorithms",{"title":1718,"path":1719,"stem":1720},"Code Style: угоди про оформлення коду","\u002Fcpp\u002Fcode-style","02.cpp\u002F02.code-style",{"title":1722,"path":1723,"stem":1724},"Середовище розробки та перший проєкт","\u002Fcpp\u002Fide-setup","02.cpp\u002F03.ide-setup",{"title":1726,"path":1727,"stem":1728},"Вивід даних на екран","\u002Fcpp\u002Fdata-output","02.cpp\u002F04.data-output",{"title":1730,"path":1731,"stem":1732},"Типи даних, змінні та константи","\u002Fcpp\u002Fdata-types-variables","02.cpp\u002F05.data-types-variables",{"title":1734,"path":1735,"stem":1736},"Ввід даних з клавіатури","\u002Fcpp\u002Fdata-input","02.cpp\u002F06.data-input",{"title":1738,"path":1739,"stem":1740},"Оператори, перетворення типів та логічні операції","\u002Fcpp\u002Foperators-type-conversion","02.cpp\u002F07.operators-type-conversion",{"title":1742,"path":1743,"stem":1744},"Цикли","\u002Fcpp\u002Floops","02.cpp\u002F08.loops",{"title":32,"path":1746,"stem":1747},"\u002Fcpp\u002Farrays","02.cpp\u002F09.arrays",{"title":1749,"path":1750,"stem":1751},"Алгоритми сортування та аналіз складності","\u002Fcpp\u002Fsorting","02.cpp\u002F10.sorting",{"title":1753,"path":1754,"stem":1755},"Алгоритми пошуку","\u002Fcpp\u002Fsearching","02.cpp\u002F11.searching",{"title":1757,"path":1758,"stem":1759},"Функції: основи","\u002Fcpp\u002Ffunctions-basics","02.cpp\u002F12.functions-basics",{"title":1761,"path":1762,"stem":1763},"Функції: прототипи, область видимості та додаткові можливості","\u002Fcpp\u002Ffunctions-scope","02.cpp\u002F13.functions-scope",{"title":1765,"path":1766,"stem":1767},"Функції: перевантаження та шаблони","\u002Fcpp\u002Ffunctions-overloading-templates","02.cpp\u002F14.functions-overloading-templates",{"title":1769,"path":1770,"stem":1771},"Вказівники: основи","\u002Fcpp\u002Fpointers-basics","02.cpp\u002F15.pointers-basics",{"title":1773,"path":1774,"stem":1775},"Посилання (References)","\u002Fcpp\u002Freferences","02.cpp\u002F16.references",{"title":1777,"path":1778,"stem":1779},"Вказівники, const і масиви","\u002Fcpp\u002Fpointers-const-arrays","02.cpp\u002F17.pointers-const-arrays",{"title":1781,"path":1782,"stem":1783},"Адресна арифметика","\u002Fcpp\u002Fpointer-arithmetic","02.cpp\u002F18.pointer-arithmetic",{"title":1785,"path":1786,"stem":1787},"Динамічна пам'ять","\u002Fcpp\u002Fdynamic-memory","02.cpp\u002F19.dynamic-memory",{"title":1789,"path":1790,"stem":1791},"Вказівники типу void","\u002Fcpp\u002Fvoid-pointers","02.cpp\u002F20.void-pointers",{"title":1793,"path":1794,"stem":1795},"Вказівники на вказівники","\u002Fcpp\u002Fpointers-to-pointers","02.cpp\u002F21.pointers-to-pointers",{"title":1797,"path":1798,"stem":1799},"Оператор доступу до членів через вказівник (->)","\u002Fcpp\u002Fmember-access-operator","02.cpp\u002F22.member-access-operator",{"title":1801,"path":1802,"stem":1803},"Цикл for-each (Range-based for)","\u002Fcpp\u002Fforeach-loop","02.cpp\u002F23.foreach-loop",{"title":1805,"path":1806,"stem":1807},"Вказівники на функції","\u002Fcpp\u002Ffunction-pointers","02.cpp\u002F24.function-pointers",{"title":1809,"path":1810,"stem":1811},"Лямбда-вирази","\u002Fcpp\u002Flambdas","02.cpp\u002F25.lambdas",{"title":1813,"path":1814,"stem":1815},"Лямбда-захоплення","\u002Fcpp\u002Flambda-captures","02.cpp\u002F26.lambda-captures",{"title":1817,"path":1818,"stem":1819},"Еліпсис","\u002Fcpp\u002Fellipsis","02.cpp\u002F27.ellipsis",{"title":1821,"path":1822,"stem":1823},"Безпечні альтернативи еліпсису","\u002Fcpp\u002F27a.ellipsis","02.cpp\u002F27a.ellipsis",{"title":1825,"path":1826,"stem":1827},"Аргументи командного рядка","\u002Fcpp\u002Fcommand-line-arguments","02.cpp\u002F28.command-line-arguments",{"title":1829,"path":1830,"stem":1831},"Перерахування (enum)","\u002Fcpp\u002Fenum","02.cpp\u002F29.enum",{"title":1833,"path":1834,"stem":1835},"Класи-перерахування (enum class)","\u002Fcpp\u002Fenum-class","02.cpp\u002F30.enum-class",{"title":1837,"path":1838,"stem":1839},"Псевдоніми типів (typedef і using)","\u002Fcpp\u002Ftype-aliases","02.cpp\u002F31.type-aliases",{"title":1841,"path":1842,"stem":1843},"Системи числення та двійкова арифметика","\u002Fcpp\u002Fnumber-systems","02.cpp\u002F32.number-systems",{"title":1845,"path":1846,"stem":1847},"Структури (struct): агрегування даних","\u002Fcpp\u002Fstruct","02.cpp\u002F33.struct",{"title":1849,"path":1850,"stem":1851},"Структури у функціях","\u002Fcpp\u002Fstruct-functions","02.cpp\u002F34.struct-functions",{"title":1853,"path":1854,"stem":1855},"Масиви структур і вкладені структури","\u002Fcpp\u002Fstruct-arrays","02.cpp\u002F35.struct-arrays",{"title":1857,"path":1858,"stem":1859},"Патерни struct та межі застосування","\u002Fcpp\u002Fstruct-patterns","02.cpp\u002F36.struct-patterns",{"title":1861,"path":1862,"stem":1863},"Символи та таблиця ASCII","\u002Fcpp\u002Fascii-characters","02.cpp\u002F37.ascii-characters",{"title":1865,"path":1866,"stem":1867},"Unicode та кодування UTF","\u002Fcpp\u002Funicode-utf","02.cpp\u002F38.unicode-utf",{"title":1869,"path":1870,"stem":1871},"C-style рядки","\u002Fcpp\u002Fc-strings","02.cpp\u002F39.c-strings",{"title":1873,"path":1874,"stem":1875},"Вступ до std::string","\u002Fcpp\u002Fstd-string-intro","02.cpp\u002F40.std-string-intro",{"title":1877,"path":1878,"stem":1879},"Довжина, ємність та доступ до символів std::string","\u002Fcpp\u002Fstd-string-capacity-access","02.cpp\u002F41.std-string-capacity-access",{"title":1881,"path":1882,"stem":1883},"Модифікація std::string: присвоювання, додавання, вставка, видалення та заміна","\u002Fcpp\u002Fstd-string-modification","02.cpp\u002F42.std-string-modification",{"title":1885,"path":1886,"stem":1887},"Пошук у std::string: find, npos та практичні патерни","\u002Fcpp\u002Fstd-string-search","02.cpp\u002F43.std-string-search",{"title":1889,"path":1890,"stem":1891},"std::string_view: невласницький погляд на рядок без копіювання","\u002Fcpp\u002Fstd-string-view","02.cpp\u002F44.std-string-view",{"title":1893,"path":1894,"stem":1895},"Об'єднання (union): один блок пам'яті, кілька інтерпретацій","\u002Fcpp\u002Funion","02.cpp\u002F45.union",{"title":1897,"path":1898,"stem":1899},"Організація коду: файли, препроцесор, простори імен","\u002Fcpp\u002Fmultifile-programs","02.cpp\u002F46.multifile-programs",{"title":1901,"path":1902,"stem":1903},"Робота з файлами: C-стиль (stdio.h)","\u002Fcpp\u002Fc-style-files","02.cpp\u002F47.c-style-files",{"title":1905,"path":1906,"stem":1907},"Робота з файлами: C++-стиль (fstream)","\u002Fcpp\u002Fcpp-style-files","02.cpp\u002F48.cpp-style-files",{"title":1909,"path":1910,"stem":1911},"План навчання: Курс C++ — Продовження (Статті 29–60+)","\u002Fcpp\u002Fcurriculum-plan","02.cpp\u002Fcurriculum-plan",{"title":1913,"icon":1914,"path":1915,"stem":1916,"children":1917,"page":59},"JavaScript","i-devicon-javascript","\u002Fjavascript","03.javascript",[1918,1944,1998,2020,2324,2362],{"title":1919,"icon":1920,"path":1921,"stem":1922,"children":1923,"page":59},"Events","i-lucide-mouse-pointer-click","\u002Fjavascript\u002Fevents","03.javascript\u002F01.events",[1924,1928,1932,1936,1940],{"title":1925,"path":1926,"stem":1927},"Вступ до подій браузера","\u002Fjavascript\u002Fevents\u002Fintro","03.javascript\u002F01.events\u002F01.intro",{"title":1929,"path":1930,"stem":1931},"Бульбашковий механізм (Bubbling) та занурення (Capturing)","\u002Fjavascript\u002Fevents\u002Fbubbling-capturing","03.javascript\u002F01.events\u002F02.bubbling-capturing",{"title":1933,"path":1934,"stem":1935},"Делегування подій (Event Delegation)","\u002Fjavascript\u002Fevents\u002Fdelegate-events","03.javascript\u002F01.events\u002F03.delegate-events",{"title":1937,"path":1938,"stem":1939},"Типові дії браузера та preventDefault()","\u002Fjavascript\u002Fevents\u002Fprevent-default","03.javascript\u002F01.events\u002F04.prevent-default",{"title":1941,"path":1942,"stem":1943},"Запуск користувацьких подій (Custom Events)","\u002Fjavascript\u002Fevents\u002Fcustom-events","03.javascript\u002F01.events\u002F05.custom-events",{"title":1945,"icon":1946,"path":1947,"stem":1948,"children":1949,"page":59},"Network","i-lucide-globe","\u002Fjavascript\u002Fnetwork","03.javascript\u002F02.network",[1950,1954,1958,1962,1966,1970,1974,1978,1982,1986,1990,1994],{"title":1951,"path":1952,"stem":1953},"Fetch API - Сучасний підхід до HTTP-запитів","\u002Fjavascript\u002Fnetwork\u002F01-fetch-api","03.javascript\u002F02.network\u002F01-fetch-api",{"title":1955,"path":1956,"stem":1957},"FormData - Робота з формами та файлами","\u002Fjavascript\u002Fnetwork\u002F02-formdata","03.javascript\u002F02.network\u002F02-formdata",{"title":1959,"path":1960,"stem":1961},"Відстеження прогресу завантаження","\u002Fjavascript\u002Fnetwork\u002F03-download-progress","03.javascript\u002F02.network\u002F03-download-progress",{"title":1963,"path":1964,"stem":1965},"Переривання fetch-запитів","\u002Fjavascript\u002Fnetwork\u002F04-abort-requests","03.javascript\u002F02.network\u002F04-abort-requests",{"title":1967,"path":1968,"stem":1969},"CORS - Запити між різними джерелами","\u002Fjavascript\u002Fnetwork\u002F05-cors","03.javascript\u002F02.network\u002F05-cors",{"title":1971,"path":1972,"stem":1973},"Fetch API - Повний довідник опцій","\u002Fjavascript\u002Fnetwork\u002F06-fetch-options","03.javascript\u002F02.network\u002F06-fetch-options",{"title":1975,"path":1976,"stem":1977},"URL Objects - Робота з посиланнями","\u002Fjavascript\u002Fnetwork\u002F07-url-objects","03.javascript\u002F02.network\u002F07-url-objects",{"title":1979,"path":1980,"stem":1981},"XMLHttpRequest - AJAX та низькорівневі запити","\u002Fjavascript\u002Fnetwork\u002F08-xmlhttprequest","03.javascript\u002F02.network\u002F08-xmlhttprequest",{"title":1983,"path":1984,"stem":1985},"Відновлюване завантаження файлів","\u002Fjavascript\u002Fnetwork\u002F09-resumable-upload","03.javascript\u002F02.network\u002F09-resumable-upload",{"title":1987,"path":1988,"stem":1989},"Cookies, document.cookie та світ після \"Cookiepocalypse\"","\u002Fjavascript\u002Fnetwork\u002F10-cookies","03.javascript\u002F02.network\u002F10-cookies",{"title":1991,"path":1992,"stem":1993},"js-cookie: Керування Cookies без Болю","\u002Fjavascript\u002Fnetwork\u002F11-js-cookie","03.javascript\u002F02.network\u002F11-js-cookie",{"title":1995,"path":1996,"stem":1997},"Axios: Потужний HTTP-клієнт для JavaScript","\u002Fjavascript\u002Fnetwork\u002F12-axios","03.javascript\u002F02.network\u002F12-axios",{"title":1999,"icon":2000,"path":2001,"stem":2002,"children":2003,"page":59},"Bom","i-lucide-monitor","\u002Fjavascript\u002Fbom","03.javascript\u002F03.bom",[2004,2008,2012,2016],{"title":2005,"path":2006,"stem":2007},"LocalStorage, SessionStorage та patterns збереження даних","\u002Fjavascript\u002Fbom\u002F01-localstorage","03.javascript\u002F03.bom\u002F01-localstorage",{"title":2009,"path":2010,"stem":2011},"Location Object - Керування адресою сторінки","\u002Fjavascript\u002Fbom\u002F02-location-object","03.javascript\u002F03.bom\u002F02-location-object",{"title":2013,"path":2014,"stem":2015},"History API - Керування історією браузера","\u002Fjavascript\u002Fbom\u002F03-history-api","03.javascript\u002F03.bom\u002F03-history-api",{"title":2017,"path":2018,"stem":2019},"Navigator Object - Ідентифікація та Можливості Пристрою","\u002Fjavascript\u002Fbom\u002F04-navigator-object","03.javascript\u002F03.bom\u002F04-navigator-object",{"title":2021,"icon":2022,"path":2023,"stem":2024,"children":2025},"React","i-devicon-react","\u002Fjavascript\u002Freact","03.javascript\u002F04.react\u002Findex",[2026,2027,2031,2035,2039,2043,2106,2141,2293],{"title":2021,"path":2023,"stem":2024},{"title":2028,"path":2029,"stem":2030},"Робота з Формами в React","\u002Fjavascript\u002Freact\u002Freact-forms","03.javascript\u002F04.react\u002F01.react-forms",{"title":2032,"path":2033,"stem":2034},"React Hook Form: Професійна Робота з Формами","\u002Fjavascript\u002Freact\u002Freact-hook-form","03.javascript\u002F04.react\u002F02.react-hook-form",{"title":2036,"path":2037,"stem":2038},"React Hook Form: Глибоке Розуміння Архітектури та Оптимізації","\u002Fjavascript\u002Freact\u002Freact-hook-form-new","03.javascript\u002F04.react\u002F02.react-hook-form-new",{"title":2040,"path":2041,"stem":2042},"Axios та React: Професійна Архітектура Запитів","\u002Fjavascript\u002Freact\u002Fdata-fetching-axios","03.javascript\u002F04.react\u002F03.data-fetching-axios",{"title":2044,"icon":132,"path":2045,"stem":2046,"children":2047},"Tanstack Query","\u002Fjavascript\u002Freact\u002Ftanstack-query","03.javascript\u002F04.react\u002F04.tanstack-query\u002Findex",[2048,2050,2054,2058,2062,2066,2070,2074,2078,2082,2086,2090,2094,2098,2102],{"title":2049,"path":2045,"stem":2046},"TanStack Query: Майстерність Керування Станом Сервера",{"title":2051,"path":2052,"stem":2053},"Парадигма Server State: Чому useEffect недостатньо","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-state-paradigm","03.javascript\u002F04.react\u002F04.tanstack-query\u002F01.server-state-paradigm",{"title":2055,"path":2056,"stem":2057},"Встановлення та Налаштування: Фундамент","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Finstallation-and-devtools","03.javascript\u002F04.react\u002F04.tanstack-query\u002F02.installation-and-devtools",{"title":2059,"path":2060,"stem":2061},"Основи Запитів та Магія Ключів","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fquery-basics-and-keys","03.javascript\u002F04.react\u002F04.tanstack-query\u002F03.query-basics-and-keys",{"title":2063,"path":2064,"stem":2065},"Синхронізація Даних: Життєвий Цикл Запиту","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fdata-synchronization","03.javascript\u002F04.react\u002F04.tanstack-query\u002F04.data-synchronization",{"title":2067,"path":2068,"stem":2069},"Мутації та Інвалідація: Зміна Даних","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fmutations-and-invalidation","03.javascript\u002F04.react\u002F04.tanstack-query\u002F05.mutations-and-invalidation",{"title":2071,"path":2072,"stem":2073},"Оптимістичні Оновлення: Швидше за Світло","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Foptimistic-updates","03.javascript\u002F04.react\u002F04.tanstack-query\u002F06.optimistic-updates",{"title":2075,"path":2076,"stem":2077},"Пагінація та Infinite Scroll","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fpagination-and-load-more","03.javascript\u002F04.react\u002F04.tanstack-query\u002F07.pagination-and-load-more",{"title":2079,"path":2080,"stem":2081},"Просунуті Патерни та Оптимізація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F04.tanstack-query\u002F08.advanced-patterns",{"title":2083,"path":2084,"stem":2085},"Архітектура та Best Practices","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Farchitecture-and-best-practices","03.javascript\u002F04.react\u002F04.tanstack-query\u002F09.architecture-and-best-practices",{"title":2087,"path":2088,"stem":2089},"Server-Side Rendering (SSR) та Гідратація","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fserver-side-rendering","03.javascript\u002F04.react\u002F04.tanstack-query\u002F10.server-side-rendering",{"title":2091,"path":2092,"stem":2093},"Стратегії Тестування","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Ftesting-strategies","03.javascript\u002F04.react\u002F04.tanstack-query\u002F11.testing-strategies",{"title":2095,"path":2096,"stem":2097},"Аутентифікація та Обробка Помилок","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fauthentication-and-errors","03.javascript\u002F04.react\u002F04.tanstack-query\u002F12.authentication-and-errors",{"title":2099,"path":2100,"stem":2101},"React Suspense та Майбутнє","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Freact-suspense","03.javascript\u002F04.react\u002F04.tanstack-query\u002F13.react-suspense",{"title":2103,"path":2104,"stem":2105},"Глибоке Занурення в Продуктивність","\u002Fjavascript\u002Freact\u002Ftanstack-query\u002Fperformance-deep-dive","03.javascript\u002F04.react\u002F04.tanstack-query\u002F14.performance-deep-dive",{"title":2107,"icon":2022,"path":2108,"stem":2109,"children":2110},"React Router","\u002Fjavascript\u002Freact\u002Freact-router","03.javascript\u002F04.react\u002F05.react-router\u002Findex",[2111,2113,2117,2121,2125,2129,2133,2137],{"title":2112,"path":2108,"stem":2109},"React Router: Навігаційна система сучасного вебу",{"title":2114,"path":2115,"stem":2116},"Налаштування та Базовий Роутинг","\u002Fjavascript\u002Freact\u002Freact-router\u002Fsetup-and-basic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F01.setup-and-basic-routing",{"title":2118,"path":2119,"stem":2120},"Динамічна Навігація","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnavigation-and-links","03.javascript\u002F04.react\u002F05.react-router\u002F02.navigation-and-links",{"title":2122,"path":2123,"stem":2124},"Вкладені Маршрути та Макети","\u002Fjavascript\u002Freact\u002Freact-router\u002Fnested-routes-and-layouts","03.javascript\u002F04.react\u002F05.react-router\u002F03.nested-routes-and-layouts",{"title":2126,"path":2127,"stem":2128},"Динамічні Маршрути та Параметри","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdynamic-routing","03.javascript\u002F04.react\u002F05.react-router\u002F04.dynamic-routing",{"title":2130,"path":2131,"stem":2132},"Data APIs: Loaders та Actions","\u002Fjavascript\u002Freact\u002Freact-router\u002Fdata-loading","03.javascript\u002F04.react\u002F05.react-router\u002F05.data-loading",{"title":2134,"path":2135,"stem":2136},"Просунуті Патерни","\u002Fjavascript\u002Freact\u002Freact-router\u002Fadvanced-patterns","03.javascript\u002F04.react\u002F05.react-router\u002F06.advanced-patterns",{"title":2138,"path":2139,"stem":2140},"Legacy Routing: Компонентний підхід","\u002Fjavascript\u002Freact\u002Freact-router\u002Flegacy-routing","03.javascript\u002F04.react\u002F05.react-router\u002F07.legacy-routing",{"title":2142,"icon":132,"path":2143,"stem":2144,"children":2145},"Redux","\u002Fjavascript\u002Freact\u002Fredux","03.javascript\u002F04.react\u002F06.redux\u002Findex",[2146,2148,2164,2193,2202,2223,2239,2268],{"title":2147,"path":2143,"stem":2144},"Redux: Еволюція управління станом",{"title":14,"icon":15,"path":2149,"stem":2150,"children":2151,"page":59},"\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals",[2152,2156,2160],{"title":2153,"path":2154,"stem":2155},"Вступ до State Management","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fintro-state-management","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F01.intro-state-management",{"title":2157,"path":2158,"stem":2159},"Філософія Redux та Три Принципи","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fredux-philosophy","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F02.redux-philosophy",{"title":2161,"path":2162,"stem":2163},"Чисті функції та Іммутабельність","\u002Fjavascript\u002Freact\u002Fredux\u002Ffundamentals\u002Fpure-functions-immutability","03.javascript\u002F04.react\u002F06.redux\u002F01.fundamentals\u002F03.pure-functions-immutability",{"title":2165,"icon":132,"path":2166,"stem":2167,"children":2168,"page":59},"Classic Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux",[2169,2173,2177,2181,2185,2189],{"title":2170,"path":2171,"stem":2172},"Створення Store (Classic Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fstore-setup","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F01.store-setup",{"title":2174,"path":2175,"stem":2176},"Actions, Constants та Action Creators","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Factions-constants","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F02.actions-constants",{"title":2178,"path":2179,"stem":2180},"Логіка Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freducers","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F03.reducers",{"title":2182,"path":2183,"stem":2184},"Комбінування Reducers (Root Reducer)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fdata-flow","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F04.data-flow",{"title":2186,"path":2187,"stem":2188},"Підключення до React (React-Redux)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Freact-redux-connection","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F05.react-redux-connection",{"title":2190,"path":2191,"stem":2192},"Middleware та Асинхронність (Redux Thunk)","\u002Fjavascript\u002Freact\u002Fredux\u002Fclassic-redux\u002Fmiddleware-thunk","03.javascript\u002F04.react\u002F06.redux\u002F02.classic-redux\u002F06.middleware-thunk",{"title":2194,"icon":132,"path":2195,"stem":2196,"children":2197,"page":59},"Transition To Rtk","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk",[2198],{"title":2199,"path":2200,"stem":2201},"Проблеми класичного Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftransition-to-rtk\u002Fproblems-with-classic","03.javascript\u002F04.react\u002F06.redux\u002F03.transition-to-rtk\u002F01.problems-with-classic",{"title":2203,"icon":132,"path":2204,"stem":2205,"children":2206,"page":59},"Redux Toolkit","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit",[2207,2211,2215,2219],{"title":2208,"path":2209,"stem":2210},"Налаштування Store з configureStore","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fconfigure-store","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F01.configure-store",{"title":2212,"path":2213,"stem":2214},"createSlice: Революція в Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fcreate-slice","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F02.create-slice",{"title":2216,"path":2217,"stem":2218},"Асинхронність з createAsyncThunk","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fasync-thunks","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F03.async-thunks",{"title":2220,"path":2221,"stem":2222},"04. Entity Adapter: Керування нормалізованим станом","\u002Fjavascript\u002Freact\u002Fredux\u002Fredux-toolkit\u002Fentity-adapter","03.javascript\u002F04.react\u002F06.redux\u002F04.redux-toolkit\u002F04.entity-adapter",{"title":2224,"icon":92,"path":2225,"stem":2226,"children":2227,"page":59},"Advanced","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced",[2228,2232,2236],{"title":2229,"path":2230,"stem":2231},"Мемоізація та Селектори: Повний Гайд по Reselect","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Fselectors-reselect","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F01.selectors-reselect",{"title":2233,"path":2234,"stem":2235},"RTK Query: Архітектура Серверного Кешу","\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Frtk-query-intro","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F02.rtk-query-intro",{"title":2083,"path":2237,"stem":2238},"\u002Fjavascript\u002Freact\u002Fredux\u002Fadvanced\u002Farchitecture-best-practices","03.javascript\u002F04.react\u002F06.redux\u002F05.advanced\u002F03.architecture-best-practices",{"title":2240,"icon":132,"path":2241,"stem":2242,"children":2243,"page":59},"Project Kanban","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban",[2244,2248,2252,2256,2260,2264],{"title":2245,"path":2246,"stem":2247},"Проєкт: Kanban Board (Trello Clone)","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fproject-overview","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F01.project-overview",{"title":2249,"path":2250,"stem":2251},"Налаштування та Типізація","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fsetup-and-types","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F02.setup-and-types",{"title":2253,"path":2254,"stem":2255},"Board Slice: Серце Дошки","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fboard-slice","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F03.board-slice",{"title":2257,"path":2258,"stem":2259},"Логіка Drag & Drop","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Fdrag-and-drop-logic","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F04.drag-and-drop-logic",{"title":2261,"path":2262,"stem":2263},"Інтеграція з RTK Query","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Frtk-query-integration","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F05.rtk-query-integration",{"title":2265,"path":2266,"stem":2267},"Optimistic Updates","\u002Fjavascript\u002Freact\u002Fredux\u002Fproject-kanban\u002Foptimistic-updates","03.javascript\u002F04.react\u002F06.redux\u002F06.project-kanban\u002F06.optimistic-updates",{"title":2269,"icon":132,"path":2270,"stem":2271,"children":2272,"page":59},"Testing","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting","03.javascript\u002F04.react\u002F06.redux\u002F07.testing",[2273,2277,2281,2285,2289],{"title":2274,"path":2275,"stem":2276},"Тестування Redux","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Fintro-testing","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F01.intro-testing",{"title":2278,"path":2279,"stem":2280},"Тестування Reducers","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-reducers","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F02.testing-reducers",{"title":2282,"path":2283,"stem":2284},"Тестування Селекторів","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-selectors","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F03.testing-selectors",{"title":2286,"path":2287,"stem":2288},"Тестування Компонентів (Integration)","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-components","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F04.testing-components",{"title":2290,"path":2291,"stem":2292},"Тестування Async Thunks","\u002Fjavascript\u002Freact\u002Fredux\u002Ftesting\u002Ftesting-thunks","03.javascript\u002F04.react\u002F06.redux\u002F07.testing\u002F05.testing-thunks",{"title":2294,"icon":132,"path":2295,"stem":2296,"children":2297},"Ui Libraries","\u002Fjavascript\u002Freact\u002Fui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002Findex",[2298,2300,2304,2308,2312,2316,2320],{"title":2299,"path":2295,"stem":2296},"UI Бібліотеки в React",{"title":2301,"path":2302,"stem":2303},"Вступ до UI Бібліотек: Навіщо Винаходити Велосипед Двічі?","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fintroduction-to-ui-libraries","03.javascript\u002F04.react\u002F07.ui-libraries\u002F01.introduction-to-ui-libraries",{"title":2305,"path":2306,"stem":2307},"Філософія shadcn\u002Fui: \"Not a Component Library\"","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-philosophy","03.javascript\u002F04.react\u002F07.ui-libraries\u002F02.shadcn-philosophy",{"title":2309,"path":2310,"stem":2311},"Установка та Налаштування shadcn\u002Fui","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-installation","03.javascript\u002F04.react\u002F07.ui-libraries\u002F03.shadcn-installation",{"title":2313,"path":2314,"stem":2315},"Базові Компоненти shadcn\u002Fui: Фундамент Інтерфейсу","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-basics","03.javascript\u002F04.react\u002F07.ui-libraries\u002F04.shadcn-components-basics",{"title":2317,"path":2318,"stem":2319},"Компоненти Форм: Побудова Інтерактивних Form","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-forms","03.javascript\u002F04.react\u002F07.ui-libraries\u002F05.shadcn-components-forms",{"title":2321,"path":2322,"stem":2323},"Складні Компоненти: Dialog, Dropdown, Table та Command","\u002Fjavascript\u002Freact\u002Fui-libraries\u002Fshadcn-components-advanced","03.javascript\u002F04.react\u002F07.ui-libraries\u002F06.shadcn-components-advanced",{"title":2325,"icon":2326,"path":2327,"stem":2328,"children":2329,"page":59},"TypeScript","i-devicon-typescript","\u002Fjavascript\u002Ftypescript","03.javascript\u002F05.typescript",[2330,2334,2338,2342,2346,2350,2354,2358],{"title":2331,"path":2332,"stem":2333},"TypeScript: Броня для вашого коду","\u002Fjavascript\u002Ftypescript\u002Fintro-and-basic-types","03.javascript\u002F05.typescript\u002F01.intro-and-basic-types",{"title":2335,"path":2336,"stem":2337},"Майстерність Моделювання Даних: Інтерфейси та Просунуті Типи","\u002Fjavascript\u002Ftypescript\u002Finterfaces-and-advanced-types","03.javascript\u002F05.typescript\u002F02.interfaces-and-advanced-types",{"title":2339,"path":2340,"stem":2341},"Алхімія Типів: Generics та Utility Types","\u002Fjavascript\u002Ftypescript\u002Fgenerics-and-utilities","03.javascript\u002F05.typescript\u002F03.generics-and-utilities",{"title":2343,"path":2344,"stem":2345},"Архітектура та Шаблони: Класи в TypeScript","\u002Fjavascript\u002Ftypescript\u002Fclasses-and-oop","03.javascript\u002F05.typescript\u002F04.classes-and-oop",{"title":2347,"path":2348,"stem":2349},"Продакшн та Екосистема: Advanced Config & Workflow","\u002Fjavascript\u002Ftypescript\u002Fadvanced-patterns-and-config","03.javascript\u002F05.typescript\u002F05.advanced-patterns-and-config",{"title":2351,"path":2352,"stem":2353},"TypeScript у світі React","\u002Fjavascript\u002Ftypescript\u002Freact-basics","03.javascript\u002F05.typescript\u002F06.react-basics",{"title":2355,"path":2356,"stem":2357},"React + TypeScript: Продвинуті патерни","\u002Fjavascript\u002Ftypescript\u002Freact-advanced","03.javascript\u002F05.typescript\u002F07.react-advanced",{"title":2359,"path":2360,"stem":2361},"React + TypeScript: Екосистема та бібліотеки","\u002Fjavascript\u002Ftypescript\u002Freact-ecosystem","03.javascript\u002F05.typescript\u002F08.react-ecosystem",{"title":2363,"path":2364,"stem":2365},"Atomic Design","\u002Fjavascript\u002Fatomic-design","03.javascript\u002F2.atomic-design",{"title":2367,"icon":2368,"path":2369,"stem":2370,"children":2371,"page":59},"Java","i-devicon-java","\u002Fjava","04.java",[2372,2375,2378,2382,2386,2390,2394],{"title":162,"path":2373,"stem":2374},"\u002Fjava\u002Fdata-mapper-part1","04.java\u002F01.data-mapper-part1",{"title":166,"path":2376,"stem":2377},"\u002Fjava\u002Fdata-mapper-part2","04.java\u002F02.data-mapper-part2",{"title":2379,"path":2380,"stem":2381},"Service Layer: Організація бізнес-логіки","\u002Fjava\u002Fservice-layer","04.java\u002F03.service-layer",{"title":2383,"path":2384,"stem":2385},"Rich Domain Model та State Pattern","\u002Fjava\u002Frich-domain-model","04.java\u002F04.rich-domain-model",{"title":2387,"path":2388,"stem":2389},"Патерни для складної бізнес-логіки","\u002Fjava\u002Fbusiness-logic-patterns","04.java\u002F05.business-logic-patterns",{"title":2391,"path":2392,"stem":2393},"Обробка помилок та валідація","\u002Fjava\u002Ferror-handling-validation","04.java\u002F06.error-handling-validation",{"title":2395,"path":2396,"stem":2397,"children":2398,"page":59},"Проектування баз даних","\u002Fjava\u002Fpr2","04.java\u002Fpr2",[2399,2403,2407,2411,2415,2419,2423,2427,2431,2435,2439,2443,2447,2451,2455,2459,2463,2467,2471,2475,2479,2483,2487,2491,2495,2499,2503,2507,2511,2515,2519,2523,2527,2531,2535,2539,2543],{"title":2400,"path":2401,"stem":2402},"Концептуальне моделювання: Мистецтво розуміння предметної області","\u002Fjava\u002Fpr2\u002Fconceptual-modeling","04.java\u002Fpr2\u002F01.conceptual-modeling",{"title":2404,"path":2405,"stem":2406},"Логічне моделювання: Від бізнес-ідей до структур даних","\u002Fjava\u002Fpr2\u002Flogical-modeling","04.java\u002Fpr2\u002F02.logical-modeling",{"title":2408,"path":2409,"stem":2410},"Нормалізація: Гігієна даних та боротьба з аномаліями","\u002Fjava\u002Fpr2\u002Fnormalization","04.java\u002Fpr2\u002F03.normalization",{"title":2412,"path":2413,"stem":2414},"Фізична схема: Від абстракції до DDL","\u002Fjava\u002Fpr2\u002Fphysical-schema","04.java\u002Fpr2\u002F04.physical-schema",{"title":2416,"path":2417,"stem":2418},"Архітектурна класифікація таблиць","\u002Fjava\u002Fpr2\u002Ftable-classification","04.java\u002Fpr2\u002F05.table-classification",{"title":2420,"path":2421,"stem":2422},"Database Migrations: Версіонування схеми з Flyway","\u002Fjava\u002Fpr2\u002Fdatabase-migrations","04.java\u002Fpr2\u002F06.database-migrations",{"title":2424,"path":2425,"stem":2426},"А що, якби це була не реляційна БД?","\u002Fjava\u002Fpr2\u002Fbeyond-relational","04.java\u002Fpr2\u002F07.beyond-relational",{"title":2428,"path":2429,"stem":2430},"Object-Relational Impedance Mismatch: Два світи, що не хочуть дружити","\u002Fjava\u002Fpr2\u002Fimpedance-mismatch","04.java\u002Fpr2\u002F09.impedance-mismatch",{"title":2432,"path":2433,"stem":2434},"JDBC: Перший контакт із базою даних","\u002Fjava\u002Fpr2\u002Fjdbc-fundamentals","04.java\u002Fpr2\u002F10.jdbc-fundamentals",{"title":2436,"path":2437,"stem":2438},"Якість коду: Spotless, SpotBugs та SonarQube","\u002Fjava\u002Fpr2\u002F10a.code-quality","04.java\u002Fpr2\u002F10a.code-quality",{"title":2440,"path":2441,"stem":2442},"Connection Pool: Патерн Object Pool для JDBC-з'єднань","\u002Fjava\u002Fpr2\u002Fconnection-pool","04.java\u002Fpr2\u002F11.connection-pool",{"title":2444,"path":2445,"stem":2446},"Row Data Gateway: Об'єкт як обгортка рядка таблиці","\u002Fjava\u002Fpr2\u002Frow-data-gateway","04.java\u002Fpr2\u002F12.row-data-gateway",{"title":2448,"path":2449,"stem":2450},"Table Data Gateway: Фасад таблиці як архітектурний відступ","\u002Fjava\u002Fpr2\u002Ftable-data-gateway","04.java\u002Fpr2\u002F13.table-data-gateway",{"title":2452,"path":2453,"stem":2454},"Repository + Data Mapper: Правильна шарова архітектура з JDBC","\u002Fjava\u002Fpr2\u002Frepository-data-mapper","04.java\u002Fpr2\u002F14.repository-data-mapper",{"title":2456,"path":2457,"stem":2458},"Identity Map: Кешування сутностей у рамках сесії","\u002Fjava\u002Fpr2\u002Fidentity-map","04.java\u002Fpr2\u002F15.identity-map",{"title":2460,"path":2461,"stem":2462},"Unit of Work: Відстеження змін і координація JDBC-транзакцій","\u002Fjava\u002Fpr2\u002Funit-of-work","04.java\u002Fpr2\u002F16.unit-of-work",{"title":2464,"path":2465,"stem":2466},"Strategy: Замінювані SQL-стратегії для підтримки різних СУБД","\u002Fjava\u002Fpr2\u002Fstrategy-sql","04.java\u002Fpr2\u002F17.strategy-sql",{"title":2468,"path":2469,"stem":2470},"Proxy: Lazy Loading для One-To-Many колекцій","\u002Fjava\u002Fpr2\u002Fproxy-lazy-loading","04.java\u002Fpr2\u002F18.proxy-lazy-loading",{"title":2472,"path":2473,"stem":2474},"Generic Repository через Java Reflection: анотації та динамічний SQL","\u002Fjava\u002Fpr2\u002Fgeneric-repository-reflection","04.java\u002Fpr2\u002F19.generic-repository-reflection",{"title":2476,"path":2477,"stem":2478},"Specification Pattern: Композиція бізнес-правил для складних запитів","\u002Fjava\u002Fpr2\u002Fspecification-pattern","04.java\u002Fpr2\u002F20.specification-pattern",{"title":2480,"path":2481,"stem":2482},"Розширені можливості Specification Pattern: підзапити, агрегації та гібридний підхід","\u002Fjava\u002Fpr2\u002F20a.advanced-specifications","04.java\u002Fpr2\u002F20a.advanced-specifications",{"title":2484,"path":2485,"stem":2486},"Асинхронність у JDBC: Від блокуючих викликів до CompletableFuture","\u002Fjava\u002Fpr2\u002Fasynchronous-jdbc","04.java\u002Fpr2\u002F21.asynchronous-jdbc",{"title":2488,"path":2489,"stem":2490},"Інтеграційне тестування JDBC-репозиторіїв: Embedded H2 та патерн AAA","\u002Fjava\u002Fpr2\u002Fintegration-testing-h2","04.java\u002Fpr2\u002F22.integration-testing-h2",{"title":2492,"path":2493,"stem":2494},"Testcontainers: Тестування з реальною PostgreSQL у Docker-контейнерах","\u002Fjava\u002Fpr2\u002Fintegration-testing-testcontainers","04.java\u002Fpr2\u002F23.integration-testing-testcontainers",{"title":2496,"path":2497,"stem":2498},"Google Guice: Впровадження залежностей у JavaFX-проєкті","\u002Fjava\u002Fpr2\u002Fdependency-injection-guice","04.java\u002Fpr2\u002F24.dependency-injection-guice",{"title":2500,"path":2501,"stem":2502},"JavaFX: Основи побудови графічних інтерфейсів","\u002Fjava\u002Fpr2\u002Fjavafx-fundamentals","04.java\u002Fpr2\u002F25.javafx-fundamentals",{"title":2504,"path":2505,"stem":2506},"Properties та Bindings: Реактивність у JavaFX","\u002Fjava\u002Fpr2\u002Fjavafx-properties-bindings","04.java\u002Fpr2\u002F26.javafx-properties-bindings",{"title":2508,"path":2509,"stem":2510},"MVC vs MVP vs MVVM: Еволюція архітектурних патернів UI","\u002Fjava\u002Fpr2\u002Fui-architecture-patterns","04.java\u002Fpr2\u002F27.ui-architecture-patterns",{"title":2512,"path":2513,"stem":2514},"MVVM на практиці: Побудова ViewModel","\u002Fjava\u002Fpr2\u002Fmvvm-viewmodel-implementation","04.java\u002Fpr2\u002F28.mvvm-viewmodel-implementation",{"title":2516,"path":2517,"stem":2518},"View та Controller: Зв'язування з ViewModel через FXML","\u002Fjava\u002Fpr2\u002Fmvvm-view-controller","04.java\u002Fpr2\u002F29.mvvm-view-controller",{"title":2520,"path":2521,"stem":2522},"Інтеграція MVVM з Guice: Автоматична ін'єкція залежностей","\u002Fjava\u002Fpr2\u002Fmvvm-guice-integration","04.java\u002Fpr2\u002F30.mvvm-guice-integration",{"title":2524,"path":2525,"stem":2526},"Валідація та обробка помилок у MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-validation-error-handling","04.java\u002Fpr2\u002F31.mvvm-validation-error-handling",{"title":2528,"path":2529,"stem":2530},"Навігація та управління екранами у JavaFX MVVM","\u002Fjava\u002Fpr2\u002Fmvvm-navigation-screen-management","04.java\u002Fpr2\u002F32.mvvm-navigation-screen-management",{"title":2532,"path":2533,"stem":2534},"Тестування JavaFX MVVM-додатків","\u002Fjava\u002Fpr2\u002Fmvvm-testing","04.java\u002Fpr2\u002F33.mvvm-testing",{"title":2536,"path":2537,"stem":2538},"Стилізація та теми у JavaFX: CSS та User Experience","\u002Fjava\u002Fpr2\u002Fjavafx-styling-themes","04.java\u002Fpr2\u002F34.javafx-styling-themes",{"title":2540,"path":2541,"stem":2542},"AtlantaFX: Сучасні теми для JavaFX додатків","\u002Fjava\u002Fpr2\u002Fatlantafx-modern-themes","04.java\u002Fpr2\u002F35.atlantafx-modern-themes",{"title":2544,"path":2545,"stem":2546},"Пакування та розповсюдження JavaFX-додатків","\u002Fjava\u002Fpr2\u002Fjar-packaging-distribution","04.java\u002Fpr2\u002F36.jar-packaging-distribution",{"title":2548,"icon":2549,"path":2550,"stem":2551,"children":2552,"page":59},"Python","i-devicon-python","\u002Fpython","05.python",[2553,2557,2560,2564,2568,2572,2576,2580,2584,2588,2592,2596,2600,2604,2608,2669],{"title":2554,"path":2555,"stem":2556},"Модулі, Пакети та Віртуальні Середовища","\u002Fpython\u002Fmodules-packages-venv","05.python\u002F00.modules-packages-venv",{"title":71,"path":2558,"stem":2559},"\u002Fpython\u002Fclasses-objects","05.python\u002F01.classes-objects",{"title":2561,"path":2562,"stem":2563},"Інкапсуляція, Керування Доступом та Властивості","\u002Fpython\u002Fencapsulation","05.python\u002F02.encapsulation",{"title":2565,"path":2566,"stem":2567},"Наслідування, MRO та суперсила super()","\u002Fpython\u002Finheritance-mro","05.python\u002F03.inheritance-mro",{"title":2569,"path":2570,"stem":2571},"Абстракція — ABC проти Статичних Протоколів (PEP 544)","\u002Fpython\u002Fabstraction-protocols","05.python\u002F04.abstraction-protocols",{"title":2573,"path":2574,"stem":2575},"Магічні методи (Dunder) та Емуляція протоколів","\u002Fpython\u002Fdunder-methods","05.python\u002F05.dunder-methods",{"title":2577,"path":2578,"stem":2579},"Декоратори та Керування життєвим циклом методів","\u002Fpython\u002Fdecorators-static-class","05.python\u002F06.decorators-static-class",{"title":2581,"path":2582,"stem":2583},"Дескриптори — Магія доступу до атрибутів","\u002Fpython\u002Fdescriptors","05.python\u002F07.descriptors",{"title":2585,"path":2586,"stem":2587},"Метакласи — Динамічне створення класів під капотом CPython","\u002Fpython\u002Fmetaclasses","05.python\u002F08.metaclasses",{"title":2589,"path":2590,"stem":2591},"Dataclasses, NamedTuple та сучасні контейнери Python","\u002Fpython\u002Fmodern-containers","05.python\u002F09.modern-containers",{"title":2593,"path":2594,"stem":2595},"GIL та модель конкурентності CPython — фундамент перед потоками і процесами","\u002Fpython\u002Fgil-concurrency-intro","05.python\u002F11.gil-concurrency-intro",{"title":2597,"path":2598,"stem":2599},"Threading — конкурентність для I\u002FO-bound задач","\u002Fpython\u002Fthreading","05.python\u002F12.threading",{"title":2601,"path":2602,"stem":2603},"Multiprocessing — справжній паралелізм для CPU-bound задач","\u002Fpython\u002Fmultiprocessing","05.python\u002F13.multiprocessing",{"title":2605,"path":2606,"stem":2607},"asyncio — кооперативна конкурентність та event loop","\u002Fpython\u002Fasyncio","05.python\u002F14.asyncio",{"title":2609,"icon":92,"path":2610,"stem":2611,"children":2612,"page":59},"FastAPI","\u002Fpython\u002Ffastapi","05.python\u002Ffastapi",[2613,2617,2621,2625,2629,2633,2637,2641,2645,2649,2653,2657,2661,2665],{"title":2614,"path":2615,"stem":2616},"Глибокий Typing та Pydantic v2 — від анотацій до валідації","\u002Fpython\u002Ffastapi\u002Ftyping-pydantic","05.python\u002Ffastapi\u002F15.typing-pydantic",{"title":2618,"path":2619,"stem":2620},"WSGI, ASGI та Python Web-екосистема","\u002Fpython\u002Ffastapi\u002Fwsgi-asgi-ecosystem","05.python\u002Ffastapi\u002F16.wsgi-asgi-ecosystem",{"title":2622,"path":2623,"stem":2624},"FastAPI: Перший додаток, Uvicorn та OpenAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-intro","05.python\u002Ffastapi\u002F17.fastapi-intro",{"title":2626,"path":2627,"stem":2628},"Маршрутизація, параметри запитів та APIRouter","\u002Fpython\u002Ffastapi\u002Ffastapi-routing-params","05.python\u002Ffastapi\u002F18.fastapi-routing-params",{"title":2630,"path":2631,"stem":2632},"Pydantic v2 у FastAPI — схеми, валідація та серіалізація","\u002Fpython\u002Ffastapi\u002Ffastapi-pydantic-schemas","05.python\u002Ffastapi\u002F19.fastapi-pydantic-schemas",{"title":2634,"path":2635,"stem":2636},"Dependency Injection — серце архітектури FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-dependency-injection","05.python\u002Ffastapi\u002F20.fastapi-dependency-injection",{"title":2638,"path":2639,"stem":2640},"Обробка помилок, Middleware та CORS у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-errors-middleware","05.python\u002Ffastapi\u002F21.fastapi-errors-middleware",{"title":2642,"path":2643,"stem":2644},"SQLAlchemy 2.0 — ORM, Core та Async Engine","\u002Fpython\u002Ffastapi\u002Fsqlalchemy-orm","05.python\u002Ffastapi\u002F22.sqlalchemy-orm",{"title":2646,"path":2647,"stem":2648},"Alembic — міграції бази даних","\u002Fpython\u002Ffastapi\u002Falembic-migrations","05.python\u002Ffastapi\u002F23.alembic-migrations",{"title":2650,"path":2651,"stem":2652},"Repository Pattern та Clean Architecture у FastAPI","\u002Fpython\u002Ffastapi\u002Ffastapi-repository-clean-arch","05.python\u002Ffastapi\u002F24.fastapi-repository-clean-arch",{"title":2654,"path":2655,"stem":2656},"Автентифікація та авторизація — JWT, OAuth2, RBAC","\u002Fpython\u002Ffastapi\u002Ffastapi-auth-security","05.python\u002Ffastapi\u002F25.fastapi-auth-security",{"title":2658,"path":2659,"stem":2660},"Тестування FastAPI — pytest, httpx, fixtures","\u002Fpython\u002Ffastapi\u002Ffastapi-testing","05.python\u002Ffastapi\u002F26.fastapi-testing",{"title":2662,"path":2663,"stem":2664},"Async на повну — Background Tasks, WebSockets, SSE та Celery","\u002Fpython\u002Ffastapi\u002Ffastapi-async-advanced","05.python\u002Ffastapi\u002F27.fastapi-async-advanced",{"title":2666,"path":2667,"stem":2668},"Deployment — Docker, CI\u002FCD, Monitoring","\u002Fpython\u002Ffastapi\u002Ffastapi-deployment","05.python\u002Ffastapi\u002F28.fastapi-deployment",{"title":2670,"path":2671,"stem":2672},"[object Object]","\u002Fpython\u002Foop-plan","05.python\u002Foop-plan",{"title":2674,"icon":2675,"path":2676,"stem":2677,"children":2678,"page":59},"Бази даних","i-lucide-database","\u002Fdatabases","06.databases",[2679,2709,2732,2769,2798,2816,2850,2862,2871],{"title":2680,"icon":2681,"path":2682,"stem":2683,"children":2684,"page":59},"Intro","i-lucide-play","\u002Fdatabases\u002Fintro","06.databases\u002F01.intro",[2685,2689,2693,2697,2701,2705],{"title":2686,"path":2687,"stem":2688},"Введення в теорію баз даних","\u002Fdatabases\u002Fintro\u002Fintroduction-to-databases","06.databases\u002F01.intro\u002F01.introduction-to-databases",{"title":2690,"path":2691,"stem":2692},"Реляційна модель даних","\u002Fdatabases\u002Fintro\u002Frelational-model-theory","06.databases\u002F01.intro\u002F02.relational-model-theory",{"title":2694,"path":2695,"stem":2696},"ER-моделювання","\u002Fdatabases\u002Fintro\u002Fer-modeling","06.databases\u002F01.intro\u002F03.er-modeling",{"title":2698,"path":2699,"stem":2700},"Логічне проектування БД","\u002Fdatabases\u002Fintro\u002Flogical-schema","06.databases\u002F01.intro\u002F04.logical-schema",{"title":2702,"path":2703,"stem":2704},"Класифікація таблиць","\u002Fdatabases\u002Fintro\u002Ftable-classification","06.databases\u002F01.intro\u002F05.table-classification",{"title":2706,"path":2707,"stem":2708},"PlantUML для баз даних","\u002Fdatabases\u002Fintro\u002Fplantuml-diagrams","06.databases\u002F01.intro\u002F06.plantuml-diagrams",{"title":2710,"icon":2675,"path":2711,"stem":2712,"children":2713,"page":59},"MS SQL Server Start","\u002Fdatabases\u002Fms-sql-server-start","06.databases\u002F02.ms-sql-server-start",[2714,2718,2724,2728],{"title":2715,"path":2716,"stem":2717},"Типи даних у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fdata-types","06.databases\u002F02.ms-sql-server-start\u002F01.data-types",{"title":2719,"path":2720,"stem":2721,"children":2722},"Індекси у MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-indexes","06.databases\u002F02.ms-sql-server-start\u002F02.sql-indexes",[2723],{"title":2719,"path":2720,"stem":2721},{"title":2725,"path":2726,"stem":2727},"Системні бази даних MS SQL Server","\u002Fdatabases\u002Fms-sql-server-start\u002Fsystem-databases","06.databases\u002F02.ms-sql-server-start\u002F03.system-databases",{"title":2729,"path":2730,"stem":2731},"Огляд мови SQL та запитів","\u002Fdatabases\u002Fms-sql-server-start\u002Fsql-queries-overview","06.databases\u002F02.ms-sql-server-start\u002F04.sql-queries-overview",{"title":2733,"icon":2675,"path":2734,"stem":2735,"children":2736,"page":59},"SQL","\u002Fdatabases\u002Fsql","06.databases\u002F03.sql",[2737,2741,2745,2749,2753,2757,2761,2765],{"title":2738,"path":2739,"stem":2740},"Налаштування демонстраційної бази даних","\u002Fdatabases\u002Fsql\u002Fsample-database-setup","06.databases\u002F03.sql\u002F00.sample-database-setup",{"title":2742,"path":2743,"stem":2744},"DDL - Створення таблиць (CREATE TABLE)","\u002Fdatabases\u002Fsql\u002Fddl-create-table","06.databases\u002F03.sql\u002F01.ddl-create-table",{"title":2746,"path":2747,"stem":2748},"DDL - Зміна та видалення таблиць (ALTER, DROP)","\u002Fdatabases\u002Fsql\u002Fddl-alter-drop-table","06.databases\u002F03.sql\u002F02.ddl-alter-drop-table",{"title":2750,"path":2751,"stem":2752},"SELECT запити - Основи","\u002Fdatabases\u002Fsql\u002Fselect-queries-fundamentals","06.databases\u002F03.sql\u002F03.select-queries-fundamentals",{"title":2754,"path":2755,"stem":2756},"SELECT запити - Розширені можливості","\u002Fdatabases\u002Fsql\u002Fselect-queries-advanced","06.databases\u002F03.sql\u002F04.select-queries-advanced",{"title":2758,"path":2759,"stem":2760},"INSERT запити - Додавання даних","\u002Fdatabases\u002Fsql\u002Finsert-queries","06.databases\u002F03.sql\u002F05.insert-queries",{"title":2762,"path":2763,"stem":2764},"UPDATE та DELETE запити","\u002Fdatabases\u002Fsql\u002Fupdate-delete-queries","06.databases\u002F03.sql\u002F06.update-delete-queries",{"title":2766,"path":2767,"stem":2768},"Транзакції в SQL","\u002Fdatabases\u002Fsql\u002Ftransactions","06.databases\u002F03.sql\u002F07.transactions",{"title":2770,"icon":2675,"path":2771,"stem":2772,"children":2773,"page":59},"Multi Table Databases","\u002Fdatabases\u002Fmulti-table-databases","06.databases\u002F04.multi-table-databases",[2774,2778,2782,2786,2790,2794],{"title":2775,"path":2776,"stem":2777},"Зв'язки та нормалізація БД","\u002Fdatabases\u002Fmulti-table-databases\u002Frelationships-and-normalization","06.databases\u002F04.multi-table-databases\u002F00.relationships-and-normalization",{"title":2779,"path":2780,"stem":2781},"INNER JOIN - З'єднання таблиць","\u002Fdatabases\u002Fmulti-table-databases\u002Finner-join","06.databases\u002F04.multi-table-databases\u002F01.inner-join",{"title":2783,"path":2784,"stem":2785},"OUTER JOINs - LEFT, RIGHT, FULL","\u002Fdatabases\u002Fmulti-table-databases\u002Fouter-joins","06.databases\u002F04.multi-table-databases\u002F02.outer-joins",{"title":2787,"path":2788,"stem":2789},"CROSS та SELF JOINs","\u002Fdatabases\u002Fmulti-table-databases\u002Fcross-self-joins","06.databases\u002F04.multi-table-databases\u002F03.cross-self-joins",{"title":2791,"path":2792,"stem":2793},"Підзапити (Subqueries)","\u002Fdatabases\u002Fmulti-table-databases\u002Fsubqueries","06.databases\u002F04.multi-table-databases\u002F04.subqueries",{"title":2795,"path":2796,"stem":2797},"Агрегації з JOIN","\u002Fdatabases\u002Fmulti-table-databases\u002Faggregations-with-joins","06.databases\u002F04.multi-table-databases\u002F05.aggregations-with-joins",{"title":2799,"icon":2800,"path":2801,"stem":2802,"children":2803,"page":59},"Aggregate Functions","i-lucide-calculator","\u002Fdatabases\u002Faggregate-functions","06.databases\u002F05.aggregate-functions",[2804,2808,2812],{"title":2805,"path":2806,"stem":2807},"Функції агрегування в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fintroduction-aggregate-functions","06.databases\u002F05.aggregate-functions\u002F01.introduction-aggregate-functions",{"title":2809,"path":2810,"stem":2811},"Групування даних в MS SQL Server","\u002Fdatabases\u002Faggregate-functions\u002Fgrouping-data","06.databases\u002F05.aggregate-functions\u002F02.grouping-data",{"title":2813,"path":2814,"stem":2815},"Підзапити з агрегатними функціями","\u002Fdatabases\u002Faggregate-functions\u002Fsubqueries-aggregates","06.databases\u002F05.aggregate-functions\u002F03.subqueries-aggregates",{"title":2817,"icon":2818,"path":2819,"stem":2820,"children":2821,"page":59},"Тригери та зберігаємі процедури","i-lucide-database-zap","\u002Fdatabases\u002Ftriggers-stored-procedures","06.databases\u002F07.triggers-stored-procedures",[2822,2826,2830,2834,2838,2842,2846],{"title":2823,"path":2824,"stem":2825},"DML-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fdml-triggers","06.databases\u002F07.triggers-stored-procedures\u002F01.dml-triggers",{"title":2827,"path":2828,"stem":2829},"DDL-тригери","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fddl-triggers","06.databases\u002F07.triggers-stored-procedures\u002F02.ddl-triggers",{"title":2831,"path":2832,"stem":2833},"Transact-SQL розширення","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransact-sql-extensions","06.databases\u002F07.triggers-stored-procedures\u002F03.transact-sql-extensions",{"title":2835,"path":2836,"stem":2837},"Транзакції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Ftransactions","06.databases\u002F07.triggers-stored-procedures\u002F04.transactions",{"title":2839,"path":2840,"stem":2841},"Зберігаємі процедури","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fstored-procedures","06.databases\u002F07.triggers-stored-procedures\u002F05.stored-procedures",{"title":2843,"path":2844,"stem":2845},"Користувацькі функції","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fuser-defined-functions","06.databases\u002F07.triggers-stored-procedures\u002F06.user-defined-functions",{"title":2847,"path":2848,"stem":2849},"Безпека баз даних","\u002Fdatabases\u002Ftriggers-stored-procedures\u002Fsecurity","06.databases\u002F07.triggers-stored-procedures\u002F08.security",{"title":2847,"icon":793,"path":2851,"stem":2852,"children":2853,"page":59},"\u002Fdatabases\u002Fsecurity","06.databases\u002F08.security",[2854,2858],{"title":2855,"path":2856,"stem":2857},"Вступ до безпеки баз даних","\u002Fdatabases\u002Fsecurity\u002Fintroduction","06.databases\u002F08.security\u002F01.introduction",{"title":2859,"path":2860,"stem":2861},"Системні представлення та метадані","\u002Fdatabases\u002Fsecurity\u002Fsystem-views","06.databases\u002F08.security\u002F02.system-views",{"title":2863,"icon":2864,"path":2865,"stem":2866,"children":2867,"page":59},"Резервне копіювання та відновлення","i-lucide-database-backup","\u002Fdatabases\u002Fbackup-recovery","06.databases\u002F09.backup-recovery",[2868],{"title":2863,"path":2869,"stem":2870},"\u002Fdatabases\u002Fbackup-recovery\u002Fbackup-restore","06.databases\u002F09.backup-recovery\u002F01.backup-restore",{"title":2872,"icon":2873,"path":2874,"stem":2875,"children":2876,"page":59},"Повнотекстовий пошук","i-lucide-search","\u002Fdatabases\u002Ffull-text-search","06.databases\u002F10.full-text-search",[2877],{"title":2872,"path":2878,"stem":2879},"\u002Fdatabases\u002Ffull-text-search\u002Ffull-text-search","06.databases\u002F10.full-text-search\u002F01.full-text-search",{"title":2881,"icon":2882,"path":2883,"stem":2884,"children":2885,"page":59},"Tools","i-lucide-wrench","\u002Ftools","07.tools",[2886,2962],{"title":2887,"icon":2888,"path":2889,"stem":2890,"children":2891},"Docker","i-simple-icons-docker","\u002Ftools\u002Fdocker","07.tools\u002F01.docker\u002Findex",[2892,2894,2898,2902,2906,2910,2914,2918,2922,2926,2930,2934,2938,2942,2946,2950,2954,2958],{"title":2893,"path":2889,"stem":2890},"Docker: від нуля до production",{"title":2895,"path":2896,"stem":2897},"Контейнеризація — від проблеми до рішення","\u002Ftools\u002Fdocker\u002Fcontainerization-concept","07.tools\u002F01.docker\u002F01.containerization-concept",{"title":2899,"path":2900,"stem":2901},"Docker — що це і навіщо?","\u002Ftools\u002Fdocker\u002Fdocker-what-and-why","07.tools\u002F01.docker\u002F02.docker-what-and-why",{"title":2903,"path":2904,"stem":2905},"Архітектура Docker Engine","\u002Ftools\u002Fdocker\u002Fdocker-architecture","07.tools\u002F01.docker\u002F03.docker-architecture",{"title":2907,"path":2908,"stem":2909},"Встановлення Docker","\u002Ftools\u002Fdocker\u002Finstallation","07.tools\u002F01.docker\u002F04.installation",{"title":2911,"path":2912,"stem":2913},"Перший контейнер — docker run","\u002Ftools\u002Fdocker\u002Ffirst-container","07.tools\u002F01.docker\u002F05.first-container",{"title":2915,"path":2916,"stem":2917},"Життєвий цикл контейнера","\u002Ftools\u002Fdocker\u002Fcontainer-lifecycle","07.tools\u002F01.docker\u002F06.container-lifecycle",{"title":2919,"path":2920,"stem":2921},"Docker Images — фундаментальні концепції","\u002Ftools\u002Fdocker\u002Fdocker-images-fundamentals","07.tools\u002F01.docker\u002F07.docker-images-fundamentals",{"title":2923,"path":2924,"stem":2925},"Dockerfile — основи","\u002Ftools\u002Fdocker\u002Fdockerfile-basics","07.tools\u002F01.docker\u002F08.dockerfile-basics",{"title":2927,"path":2928,"stem":2929},"Dockerfile — просунуті техніки","\u002Ftools\u002Fdocker\u002Fdockerfile-advanced","07.tools\u002F01.docker\u002F09.dockerfile-advanced",{"title":2931,"path":2932,"stem":2933},"Build Context та кешування шарів","\u002Ftools\u002Fdocker\u002Fbuild-context-and-cache","07.tools\u002F01.docker\u002F10.build-context-and-cache",{"title":2935,"path":2936,"stem":2937},"Реєстри Docker-образів","\u002Ftools\u002Fdocker\u002Fimage-registries","07.tools\u002F01.docker\u002F11.image-registries",{"title":2939,"path":2940,"stem":2941},"Контейнеризація .NET додатків","\u002Ftools\u002Fdocker\u002Fdotnet-containerization","07.tools\u002F01.docker\u002F12.dotnet-containerization",{"title":2943,"path":2944,"stem":2945},"Томи та збереження даних","\u002Ftools\u002Fdocker\u002Fvolumes-and-data","07.tools\u002F01.docker\u002F13.volumes-and-data",{"title":2947,"path":2948,"stem":2949},"Основи мережі в Docker","\u002Ftools\u002Fdocker\u002Fnetworking-basics","07.tools\u002F01.docker\u002F14.networking-basics",{"title":2951,"path":2952,"stem":2953},"Змінні оточення та конфігурація","\u002Ftools\u002Fdocker\u002Fenvironment-and-configuration","07.tools\u002F01.docker\u002F15.environment-and-configuration",{"title":2955,"path":2956,"stem":2957},"Docker Compose — оркестрація контейнерів","\u002Ftools\u002Fdocker\u002Fdocker-compose-basics","07.tools\u002F01.docker\u002F16.docker-compose-basics",{"title":2959,"path":2960,"stem":2961},"Docker Compose — Multi-Service застосунки","\u002Ftools\u002Fdocker\u002Fcompose-multi-service","07.tools\u002F01.docker\u002F17.compose-multi-service",{"title":2963,"icon":2964,"path":2965,"stem":2966,"children":2967},"Kubernetes","simple-icons:kubernetes","\u002Ftools\u002Fkubernetes","07.tools\u002F02.kubernetes\u002Findex",[2968,2970,2974,2978,2982,2986,2990,2994,2998],{"title":2969,"path":2965,"stem":2966},"Kubernetes: від розробки до production",{"title":2971,"path":2972,"stem":2973},"Kubernetes — коли Docker Compose більше не вистачає","\u002Ftools\u002Fkubernetes\u002Fwhy-kubernetes","07.tools\u002F02.kubernetes\u002F01.why-kubernetes",{"title":2975,"path":2976,"stem":2977},"Архітектура Kubernetes — анатомія кластера","\u002Ftools\u002Fkubernetes\u002Fkubernetes-architecture","07.tools\u002F02.kubernetes\u002F02.kubernetes-architecture",{"title":2979,"path":2980,"stem":2981},"Локальне середовище — minikube, kind та k3s","\u002Ftools\u002Fkubernetes\u002Flocal-environment","07.tools\u002F02.kubernetes\u002F03.local-environment",{"title":2983,"path":2984,"stem":2985},"Pod — атомарна одиниця Kubernetes","\u002Ftools\u002Fkubernetes\u002Fpods-and-containers","07.tools\u002F02.kubernetes\u002F04.pods-and-containers",{"title":2987,"path":2988,"stem":2989},"Патерни використання Pod","\u002Ftools\u002Fkubernetes\u002Fpod-patterns","07.tools\u002F02.kubernetes\u002F05.pod-patterns",{"title":2991,"path":2992,"stem":2993},"Deployment — декларативне управління Pod","\u002Ftools\u002Fkubernetes\u002Fdeployment-basics","07.tools\u002F02.kubernetes\u002F06.deployment-basics",{"title":2995,"path":2996,"stem":2997},"Rolling Updates та управління життєвим циклом Deployment","\u002Ftools\u002Fkubernetes\u002Fdeployment-rolling-updates","07.tools\u002F02.kubernetes\u002F07.deployment-rolling-updates",{"title":2999,"path":3000,"stem":3001},"Service — мережева абстракція для Pod","\u002Ftools\u002Fkubernetes\u002Fservices-networking","07.tools\u002F02.kubernetes\u002F08.services-networking",{"title":3003,"icon":3004,"path":3005,"stem":3006,"children":3007,"page":59},"Software Engineering","i-lucide-code-2","\u002Fsoftware-engineering","09.software-engineering",[3008,3012,3016,3020,3024,3028,3032,3036,3040,3044,3048],{"title":3009,"path":3010,"stem":3011},"1. Аналіз предметної області. Експертні знання та складність","\u002Fsoftware-engineering\u002Fintro-subdomains","09.software-engineering\u002F01.intro-subdomains",{"title":3013,"path":3014,"stem":3015},"2. Обмежені контексти. Інтеграція обмежених контекстів","\u002Fsoftware-engineering\u002Fintegrating-limited-contexts","09.software-engineering\u002F02.integrating-limited-contexts",{"title":3017,"path":3018,"stem":3019},"3. Реалізація простої бізнес-логіки","\u002Fsoftware-engineering\u002Fsimple","09.software-engineering\u002F03.simple",{"title":3021,"path":3022,"stem":3023},"4. Опрацювання складної бізнес-логіки","\u002Fsoftware-engineering\u002Fcomplex-business-logic","09.software-engineering\u002F04.complex-business-logic",{"title":3025,"path":3026,"stem":3027},"5. Моделювання фактора часу. Подієво-орієнтована архітектура.","\u002Fsoftware-engineering\u002Fmodelling-the-time-factor","09.software-engineering\u002F05.modelling-the-time-factor",{"title":3029,"path":3030,"stem":3031},"6. Архітектурні патерни","\u002Fsoftware-engineering\u002Farchitectural-patterns","09.software-engineering\u002F06.architectural-patterns",{"title":3033,"path":3034,"stem":3035},"Паттерни взаємодії","\u002Fsoftware-engineering\u002Fpatterns-of-interaction","09.software-engineering\u002F07.patterns-of-interaction",{"title":3037,"path":3038,"stem":3039},"Евристика проєктування","\u002Fsoftware-engineering\u002Fdesign-heuristics","09.software-engineering\u002F08.design-heuristics",{"title":3041,"path":3042,"stem":3043},"Еволюція проєктних рішень","\u002Fsoftware-engineering\u002Fevolution-of-design-solutions","09.software-engineering\u002F09.evolution-of-design-solutions",{"title":3045,"path":3046,"stem":3047},"EventStorming","\u002Fsoftware-engineering\u002Feventstorming","09.software-engineering\u002F10.eventstorming",{"title":3049,"path":3050,"stem":3051},"DDD на практиці","\u002Fsoftware-engineering\u002Fddd-in-practice","09.software-engineering\u002F11.ddd-in-practice",{"title":3053,"icon":943,"path":3054,"stem":3055,"children":3056,"page":59},"DDD","\u002Fddd","10.ddd",[3057,3061,3065,3069,3073,3077,3081,3085,3089,3093,3097,3101,3105],{"title":3058,"path":3059,"stem":3060},"Аналіз предметної області","\u002Fddd\u002Fdomain-analysis","10.ddd\u002F01.domain-analysis",{"title":3062,"path":3063,"stem":3064},"Експертні знання про предметну область","\u002Fddd\u002Fdomain-expert-knowledge","10.ddd\u002F02.domain-expert-knowledge",{"title":3066,"path":3067,"stem":3068},"Як осмислити складність предметної області","\u002Fddd\u002Fmanaging-domain-complexity","10.ddd\u002F03.managing-domain-complexity",{"title":3070,"path":3071,"stem":3072},"Інтеграція обмежених контекстів","\u002Fddd\u002Fbounded-context-integration","10.ddd\u002F04.bounded-context-integration",{"title":3074,"path":3075,"stem":3076},"Реалізація простої бізнес-логіки","\u002Fddd\u002Fsimple-business-logic","10.ddd\u002F05.simple-business-logic",{"title":3078,"path":3079,"stem":3080},"Обробка складної бізнес-логіки","\u002Fddd\u002Fcomplex-business-logic","10.ddd\u002F06.complex-business-logic",{"title":3082,"path":3083,"stem":3084},"Моделювання фактора часу","\u002Fddd\u002Ftime-modeling","10.ddd\u002F07.time-modeling",{"title":3086,"path":3087,"stem":3088},"Глава 8. Архітектурні Патерни","\u002Fddd\u002Farchitectural-patterns","10.ddd\u002F08.architectural-patterns",{"title":3090,"path":3091,"stem":3092},"Глава 9. Патерни Взаємодії","\u002Fddd\u002Finteraction-patterns","10.ddd\u002F09.interaction-patterns",{"title":3094,"path":3095,"stem":3096},"Глава 10. Проектні Евристики","\u002Fddd\u002Fdesign-heuristics","10.ddd\u002F10.design-heuristics",{"title":3098,"path":3099,"stem":3100},"Глава 11. Еволюція Проектних Рішень","\u002Fddd\u002Fevolution-of-design-decisions","10.ddd\u002F11.evolution-of-design-decisions",{"title":3102,"path":3103,"stem":3104},"Глава 12. EventStorming","\u002Fddd\u002Fevent-storming","10.ddd\u002F12.event-storming",{"title":3106,"path":3107,"stem":3108},"Глава 13. DDD на Практиці","\u002Fddd\u002Fddd-in-practice","10.ddd\u002F13.ddd-in-practice",{"title":3110,"icon":3111,"path":3112,"stem":3113,"children":3114,"page":59},"Media Streaming","i-lucide-video","\u002Fmedia-streaming","11.media-streaming",[3115,3119,3123,3127,3131,3135,3139],{"title":3116,"path":3117,"stem":3118},"01. Магія Стрімінгу: Що відбувається, коли ви натискаєте \"Play\"","\u002Fmedia-streaming\u002Fintroduction","11.media-streaming\u002F01.introduction",{"title":3120,"path":3121,"stem":3122},"02. Анатомія Медіа: Кодеки, Контейнери та Стиснення","\u002Fmedia-streaming\u002Faudio-video-anatomy","11.media-streaming\u002F02.audio-video-anatomy",{"title":3124,"path":3125,"stem":3126},"03. The Gym: FFmpeg Deep Dive","\u002Fmedia-streaming\u002Fffmpeg-gym","11.media-streaming\u002F03.ffmpeg-gym",{"title":3128,"path":3129,"stem":3130},"04. HLS Protocol: HTTP Live Streaming у Деталях","\u002Fmedia-streaming\u002Fhls-protocol","11.media-streaming\u002F04.hls-protocol",{"title":3132,"path":3133,"stem":3134},"05. DASH Protocol: Відкритий Стандарт","\u002Fmedia-streaming\u002Fdash-protocol","11.media-streaming\u002F05.dash-protocol",{"title":3136,"path":3137,"stem":3138},"06. Масштабування: CDN та Adaptive Bitrate","\u002Fmedia-streaming\u002Fcdn-and-adaptive-bitrate","11.media-streaming\u002F06.cdn-and-adaptive-bitrate",{"title":3140,"path":3141,"stem":3142},"07. Війна із Затримкою (Latency)","\u002Fmedia-streaming\u002Frealtime-latency","11.media-streaming\u002F07.realtime-latency",{"title":3144,"icon":3145,"path":3146,"stem":3147,"children":3148,"page":59},"HTML & CSS","i-devicon-html5","\u002Fhtml-css","12.html-css",[3149,3153,3157,3161,3165,3169,3173,3177,3181,3185,3189,3193,3197,3201,3205,3209,3213,3217,3221,3225,3229,3233,3237,3241,3245,3249,3253,3257,3261,3265],{"title":3150,"path":3151,"stem":3152},"Вступ до HTML. Структура документа","\u002Fhtml-css\u002Fintro-html-structure","12.html-css\u002F01.intro-html-structure",{"title":3154,"path":3155,"stem":3156},"Форматування тексту в HTML","\u002Fhtml-css\u002Fhtml-text-formatting","12.html-css\u002F02.html-text-formatting",{"title":3158,"path":3159,"stem":3160},"Посилання та зображення в HTML","\u002Fhtml-css\u002Fhtml-links-images","12.html-css\u002F03.html-links-images",{"title":3162,"path":3163,"stem":3164},"Списки та таблиці в HTML","\u002Fhtml-css\u002Fhtml-lists-tables","12.html-css\u002F04.html-lists-tables",{"title":3166,"path":3167,"stem":3168},"Форми в HTML","\u002Fhtml-css\u002Fhtml-forms","12.html-css\u002F05.html-forms",{"title":3170,"path":3171,"stem":3172},"Семантичні елементи HTML5","\u002Fhtml-css\u002Fhtml-semantic-elements","12.html-css\u002F06.html-semantic-elements",{"title":3174,"path":3175,"stem":3176},"Мультимедіа та розширені елементи HTML","\u002Fhtml-css\u002Fhtml-multimedia-advanced","12.html-css\u002F07.html-multimedia-advanced",{"title":3178,"path":3179,"stem":3180},"Мікророзмітка та SEO в HTML","\u002Fhtml-css\u002Fhtml-microdata-seo","12.html-css\u002F08.html-microdata-seo",{"title":3182,"path":3183,"stem":3184},"Вступ до CSS. Селектори та специфічність","\u002Fhtml-css\u002Fcss-intro-selectors","12.html-css\u002F09.css-intro-selectors",{"title":3186,"path":3187,"stem":3188},"Блокова модель CSS. Відступи. Box Sizing","\u002Fhtml-css\u002Fcss-box-model","12.html-css\u002F10.css-box-model",{"title":3190,"path":3191,"stem":3192},"Розміри у CSS: повний довідник одиниць і ключових слів","\u002Fhtml-css\u002F10a.css-sizing","12.html-css\u002F10a.css-sizing",{"title":3194,"path":3195,"stem":3196},"Типографіка в CSS. Шрифти та текст","\u002Fhtml-css\u002Fcss-typography","12.html-css\u002F11.css-typography",{"title":3198,"path":3199,"stem":3200},"Кольори та фони в CSS","\u002Fhtml-css\u002Fcss-colors-backgrounds","12.html-css\u002F12.css-colors-backgrounds",{"title":3202,"path":3203,"stem":3204},"Тіні та фільтри в CSS","\u002Fhtml-css\u002F12b.css-shadows-filters","12.html-css\u002F12b.css-shadows-filters",{"title":3206,"path":3207,"stem":3208},"CSS Flexbox: Фундамент гнучких макетів","\u002Fhtml-css\u002Fcss-flexbox-fundamentals","12.html-css\u002F13.css-flexbox-fundamentals",{"title":3210,"path":3211,"stem":3212},"CSS Flexbox: Вирівнювання та Позиціонування","\u002Fhtml-css\u002Fcss-flexbox-alignment-sizing-and-patterns","12.html-css\u002F14.css-flexbox-alignment-sizing-and-patterns",{"title":3214,"path":3215,"stem":3216},"CSS Grid. Двовимірний макет. Частина 1","\u002Fhtml-css\u002Fcss-layout-grid","12.html-css\u002F15.css-layout-grid",{"title":3218,"path":3219,"stem":3220},"CSS Grid. Двовимірний макет. Частина 2","\u002Fhtml-css\u002Fcss-layout-grid-advanced","12.html-css\u002F16.css-layout-grid-advanced",{"title":3222,"path":3223,"stem":3224},"Позиціонування в CSS. Z-index. Stacking Context","\u002Fhtml-css\u002Fcss-positioning","12.html-css\u002F17.css-positioning",{"title":3226,"path":3227,"stem":3228},"CSS Анімації та Переходи","\u002Fhtml-css\u002Fcss-animations-transitions","12.html-css\u002F18.css-animations-transitions",{"title":3230,"path":3231,"stem":3232},"Адаптивний дизайн. Media Queries. Частина 1","\u002Fhtml-css\u002Fcss-responsive-media-queries","12.html-css\u002F19.css-responsive-media-queries",{"title":3234,"path":3235,"stem":3236},"Адаптивний дизайн. Частина 2: clamp(), Container Queries, @layer","\u002Fhtml-css\u002Fcss-responsive-advanced","12.html-css\u002F20.css-responsive-advanced",{"title":3238,"path":3239,"stem":3240},"CSS Custom Properties. Методології. Сучасний CSS","\u002Fhtml-css\u002Fcss-variables-methodologies","12.html-css\u002F21.css-variables-methodologies",{"title":3242,"path":3243,"stem":3244},"Сучасний CSS 2023–2025: Нові можливості","\u002Fhtml-css\u002Fcss-modern-features","12.html-css\u002F22.css-modern-features",{"title":3246,"path":3247,"stem":3248},"CSS Nesting, @layer, @scope та @property: нативний препроцесор","\u002Fhtml-css\u002F22a.css-nesting-modern-syntax","12.html-css\u002F22a.css-nesting-modern-syntax",{"title":3250,"path":3251,"stem":3252},"CSS для форм та інтерактивних станів","\u002Fhtml-css\u002Fcss-forms-interactive-states","12.html-css\u002F23.css-forms-interactive-states",{"title":3254,"path":3255,"stem":3256},"Доступність у CSS (CSS Accessibility)","\u002Fhtml-css\u002Fcss-accessibility","12.html-css\u002F24.css-accessibility",{"title":3258,"path":3259,"stem":3260},"CSS-функції та сучасні sizing primitives","\u002Fhtml-css\u002Fcss-functions-sizing","12.html-css\u002F25.css-functions-sizing",{"title":3262,"path":3263,"stem":3264},"Rendering Pipeline і CSS Performance","\u002Fhtml-css\u002Fcss-rendering-performance","12.html-css\u002F26.css-rendering-performance",{"title":3266,"path":3267,"stem":3268},"CSS Best Practices: типові ситуації та правильні рішення","\u002Fhtml-css\u002Fcss-best-practices","12.html-css\u002F27.css-best-practices",{"title":3270,"path":3271,"stem":3272,"children":3273,"page":59},"AWS","\u002Faws","13.aws",[3274,3278,3282,3286,3290,3294,3298,3302,3306,3310,3314,3318,3322,3326,3330,3334,3338,3342],{"title":3275,"path":3276,"stem":3277},"Реєстрація AWS акаунту та студентські програми","\u002Faws\u002Faccount-registration","13.aws\u002F00.account-registration",{"title":3279,"path":3280,"stem":3281},"Вступ до хмарних обчислень та AWS","\u002Faws\u002Fintroduction-to-cloud","13.aws\u002F01.introduction-to-cloud",{"title":3283,"path":3284,"stem":3285},"AWS IAM — Identity and Access Management","\u002Faws\u002Fiam","13.aws\u002F02.iam",{"title":3287,"path":3288,"stem":3289},"AWS IAM CLI — Довідник команд","\u002Faws\u002F02a.iam-doc","13.aws\u002F02a.iam-doc",{"title":3291,"path":3292,"stem":3293},"Docker та контейнеризація в AWS — ECR, ECS та Fargate","\u002Faws\u002Fdocker-ecs","13.aws\u002F03.docker-ecs",{"title":3295,"path":3296,"stem":3297},"AWS ECR \u002F ECS CLI — Довідник команд","\u002Faws\u002F03a.docker-ecs-doc","13.aws\u002F03a.docker-ecs-doc",{"title":3299,"path":3300,"stem":3301},"Amazon EC2 — Elastic Compute Cloud","\u002Faws\u002Fec2","13.aws\u002F04.ec2",{"title":3303,"path":3304,"stem":3305},"AWS EC2 CLI — Довідник команд","\u002Faws\u002F04a.ec2-doc","13.aws\u002F04a.ec2-doc",{"title":3307,"path":3308,"stem":3309},"Elastic Load Balancing та Auto Scaling","\u002Faws\u002Falb-asg","13.aws\u002F05.alb-asg",{"title":3311,"path":3312,"stem":3313},"Amazon S3 — Simple Storage Service","\u002Faws\u002Fs3","13.aws\u002F06.s3",{"title":3315,"path":3316,"stem":3317},"Amazon CloudFront — Content Delivery Network","\u002Faws\u002Fcloudfront","13.aws\u002F07.cloudfront",{"title":3319,"path":3320,"stem":3321},"Amazon RDS — Relational Database Service","\u002Faws\u002Frds","13.aws\u002F08.rds",{"title":3323,"path":3324,"stem":3325},"Amazon DynamoDB — NoSQL Database","\u002Faws\u002Fdynamodb","13.aws\u002F09.dynamodb",{"title":3327,"path":3328,"stem":3329},"AWS Lambda та Serverless Compute","\u002Faws\u002Flambda","13.aws\u002F10.lambda",{"title":3331,"path":3332,"stem":3333},"Amazon Bedrock - Foundation Models, RAG та Agents","\u002Faws\u002Fbedrock","13.aws\u002F22.bedrock",{"title":3335,"path":3336,"stem":3337},"Amazon Rekognition - Комп'ютерний зір","\u002Faws\u002Frekognition","13.aws\u002F23.rekognition",{"title":3339,"path":3340,"stem":3341},"Amazon Textract - Інтелектуальний аналіз документів","\u002Faws\u002Ftextract","13.aws\u002F24.textract",{"title":3343,"path":3344,"stem":3345},"Amazon Polly, Transcribe, Comprehend та Translate","\u002Faws\u002Faudio-nlp-services","13.aws\u002F25.audio-nlp-services",{"title":3347,"path":3348,"stem":3349,"children":3350,"page":59},"Ai Development","\u002Fai-development","14.ai-development",[3351],{"title":3352,"path":3353,"stem":3354,"children":3355,"page":59},"Foundations","\u002Fai-development\u002Ffoundations","14.ai-development\u002F00.foundations",[3356],{"title":3357,"path":3358,"stem":3359},"Модуль 0.1. Що таке Large Language Model (LLM)","\u002Fai-development\u002Ffoundations\u002Fwhat-is-llm","14.ai-development\u002F00.foundations\u002F01.what-is-llm",{"title":3361,"path":3362,"stem":3363,"children":3364,"page":59},"React Native","\u002Freact-native","15.react-native",[3365,3386],{"title":3366,"path":3367,"stem":3368,"children":3369,"page":59},"Version1","\u002Freact-native\u002Fversion1","15.react-native\u002Fversion1",[3370,3374,3378,3382],{"title":3371,"path":3372,"stem":3373},"Що таке React Native","\u002Freact-native\u002Fversion1\u002Fwhat-is-react-native","15.react-native\u002Fversion1\u002F01.what-is-react-native",{"title":3375,"path":3376,"stem":3377},"Як влаштований React Native «під капотом»","\u002Freact-native\u002Fversion1\u002Freact-native-architecture","15.react-native\u002Fversion1\u002F02.react-native-architecture",{"title":3379,"path":3380,"stem":3381},"Від React до React Native: ключові відмінності","\u002Freact-native\u002Fversion1\u002Freact-native-vs-react","15.react-native\u002Fversion1\u002F03.react-native-vs-react",{"title":3383,"path":3384,"stem":3385},"View та Text — фундаментальні будівельні блоки","\u002Freact-native\u002Fversion1\u002Fview-and-text","15.react-native\u002Fversion1\u002F04.view-and-text",{"title":3387,"path":3388,"stem":3389,"children":3390,"page":59},"Version2","\u002Freact-native\u002Fversion2","15.react-native\u002Fversion2",[3391,3395,3399,3403,3407,3411,3415,3419,3423,3427,3431,3435,3439,3443,3447,3451,3455,3459,3463,3467,3471,3475,3479,3483,3487,3491],{"title":3392,"path":3393,"stem":3394},"React Native — навіщо він потрібен","\u002Freact-native\u002Fversion2\u002Fwhy-react-native","15.react-native\u002Fversion2\u002F01.why-react-native",{"title":3396,"path":3397,"stem":3398},"Налаштування середовища розробки","\u002Freact-native\u002Fversion2\u002Fenvironment-setup","15.react-native\u002Fversion2\u002F02.environment-setup",{"title":3400,"path":3401,"stem":3402},"Expo і класичний React Native — два шляхи одного фреймворку","\u002Freact-native\u002Fversion2\u002Fexpo-vs-cli-landscape","15.react-native\u002Fversion2\u002F03.expo-vs-cli-landscape",{"title":3404,"path":3405,"stem":3406},"Середовище Expo — перший запуск","\u002Freact-native\u002Fversion2\u002Fexpo-setup-and-tooling","15.react-native\u002Fversion2\u002F04.expo-setup-and-tooling",{"title":3408,"path":3409,"stem":3410},"Структура проєкту та перші UI-примітиви","\u002Freact-native\u002Fversion2\u002Fproject-structure-and-conventions","15.react-native\u002Fversion2\u002F05.project-structure-and-conventions",{"title":3412,"path":3413,"stem":3414},"Базові компоненти React Native","\u002Freact-native\u002Fversion2\u002Fcore-components","15.react-native\u002Fversion2\u002F06.core-components",{"title":3416,"path":3417,"stem":3418},"Flexbox і layout у React Native","\u002Freact-native\u002Fversion2\u002Fflexbox-and-layout","15.react-native\u002Fversion2\u002F07.flexbox-and-layout",{"title":3420,"path":3421,"stem":3422},"StyleSheet і теми (light \u002F dark)","\u002Freact-native\u002Fversion2\u002Fstylesheet-and-theming","15.react-native\u002Fversion2\u002F08.stylesheet-and-theming",{"title":3424,"path":3425,"stem":3426},"Списки та віртуалізація","\u002Freact-native\u002Fversion2\u002Flists-and-virtualization","15.react-native\u002Fversion2\u002F09.lists-and-virtualization",{"title":3428,"path":3429,"stem":3430},"Форми, ввід і валідація","\u002Freact-native\u002Fversion2\u002Fforms-input-validation","15.react-native\u002Fversion2\u002F10.forms-input-validation",{"title":3432,"path":3433,"stem":3434},"Основи Expo Router","\u002Freact-native\u002Fversion2\u002Fexpo-router-basics","15.react-native\u002Fversion2\u002F11.expo-router-basics",{"title":3436,"path":3437,"stem":3438},"Вкладені навігатори та модалки","\u002Freact-native\u002Fversion2\u002Fnested-navigators-and-modals","15.react-native\u002Fversion2\u002F12.nested-navigators-and-modals",{"title":3440,"path":3441,"stem":3442},"Deep linking і параметри маршрутів","\u002Freact-native\u002Fversion2\u002Fdeep-linking-and-params","15.react-native\u002Fversion2\u002F13.deep-linking-and-params",{"title":3444,"path":3445,"stem":3446},"Робота з мережею та життєвий цикл застосунку","\u002Freact-native\u002Fversion2\u002Fnetworking-and-app-lifecycle","15.react-native\u002Fversion2\u002F14.networking-and-app-lifecycle",{"title":3448,"path":3449,"stem":3450},"Redux Toolkit на мобільних платформах","\u002Freact-native\u002Fversion2\u002Fredux-toolkit-on-mobile","15.react-native\u002Fversion2\u002F15.redux-toolkit-on-mobile",{"title":3452,"path":3453,"stem":3454},"RTK Query на мобільних платформах","\u002Freact-native\u002Fversion2\u002Frtk-query-mobile","15.react-native\u002Fversion2\u002F16.rtk-query-mobile",{"title":3456,"path":3457,"stem":3458},"Автентифікація та Безпечне Зберігання","\u002Freact-native\u002Fversion2\u002Fauth-secure-storage","15.react-native\u002Fversion2\u002F18.auth-secure-storage",{"title":3460,"path":3461,"stem":3462},"Локальне сховище — AsyncStorage, MMKV, SQLite","\u002Freact-native\u002Fversion2\u002Flocal-storage-mmkv-sqlite","15.react-native\u002Fversion2\u002F19.local-storage-mmkv-sqlite",{"title":3464,"path":3465,"stem":3466},"Офлайн-First і синхронізація","\u002Freact-native\u002Fversion2\u002Foffline-first-sync","15.react-native\u002Fversion2\u002F20.offline-first-sync",{"title":3468,"path":3469,"stem":3470},"Камера, медіа та файлова система","\u002Freact-native\u002Fversion2\u002Fcamera-media-filesystem","15.react-native\u002Fversion2\u002F21.camera-media-filesystem",{"title":3472,"path":3473,"stem":3474},"Карти та геолокація","\u002Freact-native\u002Fversion2\u002Fmaps-and-location","15.react-native\u002Fversion2\u002F22.maps-and-location",{"title":3476,"path":3477,"stem":3478},"Жести та дотики","\u002Freact-native\u002Fversion2\u002Fgestures-and-touch","15.react-native\u002Fversion2\u002F23.gestures-and-touch",{"title":3480,"path":3481,"stem":3482},"Анімації з Reanimated","\u002Freact-native\u002Fversion2\u002Freanimated-animations","15.react-native\u002Fversion2\u002F24.reanimated-animations",{"title":3484,"path":3485,"stem":3486},"Push і локальні сповіщення","\u002Freact-native\u002Fversion2\u002Fpush-and-local-notifications","15.react-native\u002Fversion2\u002F25.push-and-local-notifications",{"title":3488,"path":3489,"stem":3490},"Доступність та інтернаціоналізація","\u002Freact-native\u002Fversion2\u002Faccessibility-and-i18n","15.react-native\u002Fversion2\u002F26.accessibility-and-i18n",{"title":3492,"path":3493,"stem":3494},"EAS Build та профілі збірки","\u002Freact-native\u002Fversion2\u002Feas-build-and-profiles","15.react-native\u002Fversion2\u002F29.eas-build-and-profiles",{"title":3496,"path":3497,"stem":3498,"children":3499,"page":59},"Ai Python","\u002Fai-python","16.ai-python",[3500,3504,3508],{"title":3501,"path":3502,"stem":3503},"Вступ до штучного інтелекту та машинного навчання","\u002Fai-python\u002Fintro-to-ai","16.ai-python\u002F01.intro-to-ai",{"title":3505,"path":3506,"stem":3507},"Знайомство з Jupyter Notebook та JupyterLab","\u002Fai-python\u002Fjupyter-notebook","16.ai-python\u002F02.jupyter-notebook",{"title":3509,"path":3510,"stem":3511},"Робота з даними з використанням NumPy і pandas","\u002Fai-python\u002Fnumpy-pandas","16.ai-python\u002F03.numpy-pandas",{"title":3513,"icon":658,"path":3514,"stem":3515,"children":3516,"page":59},"Клієнт-серверна архітектура","\u002Fclient-server-architecture","17.client-server-architecture",[3517,3521],{"title":3518,"path":3519,"stem":3520},"Архітектура клієнт-серверних систем та основи Go","\u002Fclient-server-architecture\u002Fclient-server-architecture-and-go","17.client-server-architecture\u002F01.client-server-architecture-and-go",{"title":3522,"path":3523,"stem":3524},"Система типів та модель пам’яті мови Go","\u002Fclient-server-architecture\u002Ftype-system-and-memory-model","17.client-server-architecture\u002F02.type-system-and-memory-model",{"title":3526,"icon":1946,"path":3527,"stem":3528,"children":3529,"page":59},"Розробка WEB-застосувань","\u002Fweb-development","18.web-development",[3530,3575,3613,3642],{"title":3531,"icon":658,"path":3532,"stem":3533,"children":3534,"page":59},"Архітектура комп'ютерних мереж та мережеві протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols","18.web-development\u002F01.network-architecture-and-protocols",[3535,3539,3543,3547,3551,3555,3559,3563,3567,3571],{"title":3536,"path":3537,"stem":3538},"Еволюція веброзробки та модель клієнт-сервер","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fweb-evolution-client-server","18.web-development\u002F01.network-architecture-and-protocols\u002F01.web-evolution-client-server",{"title":3540,"path":3541,"stem":3542},"Еталонна модель OSI","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fosi-model","18.web-development\u002F01.network-architecture-and-protocols\u002F02.osi-model",{"title":3544,"path":3545,"stem":3546},"Стек протоколів TCP\u002FIP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-ip-stack","18.web-development\u002F01.network-architecture-and-protocols\u002F03.tcp-ip-stack",{"title":3548,"path":3549,"stem":3550},"IP-адресація, порти та сокети","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fip-addressing-ports-sockets","18.web-development\u002F01.network-architecture-and-protocols\u002F04.ip-addressing-ports-sockets",{"title":3552,"path":3553,"stem":3554},"Протоколи TCP та UDP","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Ftcp-udp-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F05.tcp-udp-protocols",{"title":3556,"path":3557,"stem":3558},"Система доменних імен DNS","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fdns-system","18.web-development\u002F01.network-architecture-and-protocols\u002F06.dns-system",{"title":3560,"path":3561,"stem":3562},"Протокол SMTP та поштові протоколи","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fsmtp-email-protocols","18.web-development\u002F01.network-architecture-and-protocols\u002F07.smtp-email-protocols",{"title":3564,"path":3565,"stem":3566},"Протокол WebSocket","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fwebsocket-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F08.websocket-protocol",{"title":3568,"path":3569,"stem":3570},"Протокол SSH","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fssh-protocol","18.web-development\u002F01.network-architecture-and-protocols\u002F09.ssh-protocol",{"title":3572,"path":3573,"stem":3574},"Огляд сучасних серверних технологій","\u002Fweb-development\u002Fnetwork-architecture-and-protocols\u002Fmodern-backend-technologies","18.web-development\u002F01.network-architecture-and-protocols\u002F10.modern-backend-technologies",{"title":3576,"icon":3577,"path":3578,"stem":3579,"children":3580,"page":59},"Протокол HTTP та захищена передача даних HTTPS","i-lucide-lock","\u002Fweb-development\u002Fhttp-and-https","18.web-development\u002F02.http-and-https",[3581,3585,3589,3593,3597,3601,3605,3609],{"title":3582,"path":3583,"stem":3584},"Вступ до протоколу HTTP та еволюція веб-технологій","\u002Fweb-development\u002Fhttp-and-https\u002Fintroduction-and-evolution","18.web-development\u002F02.http-and-https\u002F01.introduction-and-evolution",{"title":3586,"path":3587,"stem":3588},"Анатомія HTTP-запиту","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-request-structure","18.web-development\u002F02.http-and-https\u002F02.http-request-structure",{"title":3590,"path":3591,"stem":3592},"Анатомія HTTP-відповіді","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-response-structure","18.web-development\u002F02.http-and-https\u002F03.http-response-structure",{"title":3594,"path":3595,"stem":3596},"Методи HTTP та їхня семантика","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-methods","18.web-development\u002F02.http-and-https\u002F04.http-methods",{"title":3598,"path":3599,"stem":3600},"Коди статусу HTTP та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-status-codes","18.web-development\u002F02.http-and-https\u002F05.http-status-codes",{"title":3602,"path":3603,"stem":3604},"HTTP-заголовки та їхнє призначення","\u002Fweb-development\u002Fhttp-and-https\u002Fhttp-headers","18.web-development\u002F02.http-and-https\u002F06.http-headers",{"title":3606,"path":3607,"stem":3608},"CORS та механізми безпеки HTTP","\u002Fweb-development\u002Fhttp-and-https\u002Fcors-and-security","18.web-development\u002F02.http-and-https\u002F07.cors-and-security",{"title":3610,"path":3611,"stem":3612},"HTTPS та криптографічні основи TLS","\u002Fweb-development\u002Fhttp-and-https\u002Fhttps-and-tls","18.web-development\u002F02.http-and-https\u002F08.https-and-tls",{"title":3614,"icon":2326,"path":3615,"stem":3616,"children":3617,"page":59},"Система типів мови TypeScript","\u002Fweb-development\u002Ftypescript-type-system","18.web-development\u002F03.typescript-type-system",[3618,3622,3626,3630,3634,3638],{"title":3619,"path":3620,"stem":3621},"Знайомство з TypeScript Compiler","\u002Fweb-development\u002Ftypescript-type-system\u002Fintroduction-compiler-config","18.web-development\u002F03.typescript-type-system\u002F01.introduction-compiler-config",{"title":3623,"path":3624,"stem":3625},"Примітивні типи даних: string, number, boolean","\u002Fweb-development\u002Ftypescript-type-system\u002Fprimitive-special-types","18.web-development\u002F03.typescript-type-system\u002F02.primitive-special-types",{"title":3627,"path":3628,"stem":3629},"Масиви, кортежі та об","\u002Fweb-development\u002Ftypescript-type-system\u002Farrays-tuples-objects","18.web-development\u002F03.typescript-type-system\u002F03.arrays-tuples-objects",{"title":3631,"path":3632,"stem":3633},"Union типи, Intersection типи та літеральні типи","\u002Fweb-development\u002Ftypescript-type-system\u002Funion-intersection-literals","18.web-development\u002F03.typescript-type-system\u002F04.union-intersection-literals",{"title":3635,"path":3636,"stem":3637},"Type Narrowing (звуження типів)","\u002Fweb-development\u002Ftypescript-type-system\u002Ftype-narrowing","18.web-development\u002F03.typescript-type-system\u002F05.type-narrowing",{"title":3639,"path":3640,"stem":3641},"Типізація функцій","\u002Fweb-development\u002Ftypescript-type-system\u002Ffunctions-typing","18.web-development\u002F03.typescript-type-system\u002F06.functions-typing",{"title":3643,"icon":2326,"path":3644,"stem":3645,"children":3646,"page":59},"Розширені засоби мови TypeScript","\u002Fweb-development\u002Ftypescript-advanced","18.web-development\u002F04.typescript-advanced",[3647,3651,3655,3659,3663,3667],{"title":3648,"path":3649,"stem":3650},"Interfaces та Classes","\u002Fweb-development\u002Ftypescript-advanced\u002Finterfaces-classes","18.web-development\u002F04.typescript-advanced\u002F01.interfaces-classes",{"title":3652,"path":3653,"stem":3654},"Основи Generic типів","\u002Fweb-development\u002Ftypescript-advanced\u002Fgenerics-fundamentals","18.web-development\u002F04.typescript-advanced\u002F02.generics-fundamentals",{"title":3656,"path":3657,"stem":3658},"Enums та Decorators","\u002Fweb-development\u002Ftypescript-advanced\u002Fenums-decorators","18.web-development\u002F04.typescript-advanced\u002F03.enums-decorators",{"title":3660,"path":3661,"stem":3662},"Utility Types","\u002Fweb-development\u002Ftypescript-advanced\u002Futility-types","18.web-development\u002F04.typescript-advanced\u002F04.utility-types",{"title":3664,"path":3665,"stem":3666},"Mapped та Conditional Types","\u002Fweb-development\u002Ftypescript-advanced\u002Fmapped-conditional-types","18.web-development\u002F04.typescript-advanced\u002F05.mapped-conditional-types",{"title":3668,"path":3669,"stem":3670},"Модулі та Strict Mode","\u002Fweb-development\u002Ftypescript-advanced\u002Fmodules-strict-mode","18.web-development\u002F04.typescript-advanced\u002F06.modules-strict-mode",{"title":3672,"path":3673,"stem":3674,"children":3675,"page":59},"Tailwind","\u002Ftailwind","21.tailwind",[3676,3680,3684,3688,3692,3696,3700,3704,3708,3712,3716,3720],{"title":3677,"path":3678,"stem":3679},"Що таке Tailwind CSS і навіщо він потрібен","\u002Ftailwind\u002Ftailwind-intro-philosophy","21.tailwind\u002F01.tailwind-intro-philosophy",{"title":3681,"path":3682,"stem":3683},"Встановлення та налаштування Tailwind CSS v4","\u002Ftailwind\u002Ftailwind-installation-setup","21.tailwind\u002F02.tailwind-installation-setup",{"title":3685,"path":3686,"stem":3687},"Utility-класи: основи та система Tailwind","\u002Ftailwind\u002Ftailwind-utility-classes-core","21.tailwind\u002F03.tailwind-utility-classes-core",{"title":3689,"path":3690,"stem":3691},"Layout: Flexbox та Grid через Tailwind","\u002Ftailwind\u002Ftailwind-flexbox-grid","21.tailwind\u002F04.tailwind-flexbox-grid",{"title":3693,"path":3694,"stem":3695},"Кастомізація теми через @theme у Tailwind v4","\u002Ftailwind\u002Ftailwind-theme-customization","21.tailwind\u002F05.tailwind-theme-customization",{"title":3697,"path":3698,"stem":3699},"Варіанти: hover, focus, responsive, dark mode та нові v4","\u002Ftailwind\u002Ftailwind-variants-states","21.tailwind\u002F06.tailwind-variants-states",{"title":3701,"path":3702,"stem":3703},"Типографіка та система кольорів у Tailwind v4","\u002Ftailwind\u002Ftailwind-typography-colors","21.tailwind\u002F07.tailwind-typography-colors",{"title":3705,"path":3706,"stem":3707},"Компоненти та повторюваність: @apply, @utility та патерни","\u002Ftailwind\u002Ftailwind-components-patterns","21.tailwind\u002F08.tailwind-components-patterns",{"title":3709,"path":3710,"stem":3711},"Темна тема та система дизайн-токенів у Tailwind v4","\u002Ftailwind\u002Ftailwind-dark-mode-theming","21.tailwind\u002F09.tailwind-dark-mode-theming",{"title":3713,"path":3714,"stem":3715},"Довільні значення та контейнерні запити у Tailwind v4","\u002Ftailwind\u002Ftailwind-arbitrary-container-queries","21.tailwind\u002F10.tailwind-arbitrary-container-queries",{"title":3717,"path":3718,"stem":3719},"Анімації, трансформації та 3D у Tailwind v4","\u002Ftailwind\u002Ftailwind-animations-transforms","21.tailwind\u002F11.tailwind-animations-transforms",{"title":3721,"path":3722,"stem":3723},"Tailwind CLI, PostCSS та інтеграція з фреймворками","\u002Ftailwind\u002Ftailwind-cli-tooling","21.tailwind\u002F12.tailwind-cli-tooling",{"title":3725,"path":3726,"stem":3727},"Тестування компонентів діаграм","\u002Ftest-components","98.test-components",{"id":3729,"title":3456,"body":3730,"description":50586,"extension":50587,"links":50588,"meta":50589,"navigation":4277,"path":3457,"seo":50590,"stem":3458,"__hash__":50591},"docs\u002F15.react-native\u002Fversion2\u002F18.auth-secure-storage.md",{"type":3731,"value":3732,"toc":50477},"minimark",[3733,3737,3742,3746,3749,3754,3757,3761,3764,3810,3813,3817,3821,3824,3830,3836,3839,3843,3846,3851,3856,3866,3872,3877,3889,3894,3905,3909,3913,3919,3924,3929,3935,3938,4041,4045,4062,4066,4077,4081,4085,4091,4096,4100,4114,4118,4129,4133,4140,4166,4169,4171,4175,4179,4184,4198,4204,4208,4213,4235,4240,4348,4353,4785,4789,4792,4874,4879,5071,5075,5080,5137,5142,5149,5307,5314,5427,5434,5572,5579,5872,5879,5971,5973,5977,5981,5984,5990,5994,5997,6771,6775,6778,8223,8228,8260,8264,8267,10115,10120,10171,10173,10177,10181,10184,10209,10214,10220,10224,12740,12745,12831,12833,12837,12841,12844,12858,12864,12870,12874,13277,13282,13310,13314,13703,13707,14710,14714,14717,15802,15807,15924,15928,15931,16282,16287,16454,16456,16460,16464,16470,16494,16500,16522,16528,16535,16539,16542,16546,17271,17276,17345,17349,17356,17836,17844,17848,18755,18757,18761,18765,18771,18776,18799,18804,18822,18826,18832,18836,18839,18843,18873,18881,19061,19070,19153,19158,19186,19191,21232,21236,21240,21849,21853,22669,22673,24696,24700,27129,27133,27946,27951,28121,28125,30732,30736,32650,32654,34423,34427,36766,36768,36772,36776,36780,36885,36889,37016,37020,37085,37089,37233,37237,37241,37301,37305,37439,37443,37782,37786,37790,37953,37957,38240,38244,38405,38409,38413,39049,39053,39617,39621,39625,39690,39694,39787,39791,39912,39914,39918,39922,40095,40099,40303,40307,40435,40437,40441,40445,40448,40455,40460,40466,40472,40477,40483,40488,40493,40497,40500,40535,40539,40568,40572,40575,40710,40712,40716,40720,40753,40757,40793,40797,40820,40822,40826,40832,40838,40844,40850,40856,40862,40868,40874,40880,40886,40892,40898,40903,40908,40910,40916,40924,40926,40930,40937,40941,40945,40950,40975,40985,40990,41016,41019,41034,41038,41041,41229,41233,41237,41240,41263,41268,41274,41278,41282,41285,41291,41415,41423,41429,41598,41605,41610,41624,41629,41974,41981,41985,41999,42005,42272,42279,42284,42290,42294,42298,42304,42548,42555,42561,42701,42708,42712,42717,43087,43094,43099,43102,43115,43122,43126,43130,43133,43642,43649,43654,43688,43693,43735,43740,43746,43750,43754,43759,44168,44176,44181,44187,44290,44294,44311,44316,44389,44393,44398,44716,44723,44728,44951,44958,44962,44966,44971,44990,44993,44999,45004,45015,45020,45057,45062,45067,45073,45078,45084,45089,45095,45100,45106,45111,45117,45122,45128,45132,45136,45139,45317,45321,45339,45343,45346,45529,45533,45537,45542,45548,45553,45579,45583,45614,45618,45621,45945,45950,46003,46007,46070,46074,46077,46081,46086,46118,46123,46224,46229,46292,46297,46417,46421,46426,46449,46454,46465,46470,46558,46563,46706,46710,46715,46813,46818,46911,46916,46930,46935,46949,46953,46956,46960,47015,47019,47058,47061,47094,47098,47125,47129,47132,47137,47151,47156,47170,47175,47189,47192,47194,47199,47215,47218,47220,47224,47228,47231,47335,47340,47345,47349,47353,47358,47364,47377,47383,47485,47490,47517,47521,47526,47577,47581,47590,47654,47659,47721,47725,47730,47772,47778,47896,47900,47911,47974,47978,47981,48154,48159,48203,48207,48246,48250,48254,48259,48298,48303,48336,48341,48374,48378,48383,48423,48428,48754,48758,48762,48958,48962,49061,49065,49181,49185,49189,49194,49221,49226,49247,49252,49279,49284,49305,49309,49353,49357,49361,49411,49416,49491,49495,49539,49543,49618,49622,49626,49640,49822,49826,49843,49951,49955,50127,50129,50133,50137,50194,50198,50237,50240,50273,50277,50328,50330,50334,50339,50342,50358,50361,50375,50378,50394,50399,50419,50424,50427,50432,50438,50441,50443,50467,50473],[3734,3735,3456],"h1",{"id":3736},"автентифікація-та-безпечне-зберігання",[3738,3739,3741],"h2",{"id":3740},"вступ","Вступ",[3743,3744,3745],"p",{},"Автентифікація та авторизація — критично важливі частини розробки будь-якого мобільного додатку. У світі, де користувачі довіряють додаткам свої особисті дані, фінансову інформацію та конфіденційну переписку, забезпечення належного рівня безпеки стає обов'язковою вимогою.",[3743,3747,3748],{},"У цьому розділі ми детально розглянемо, як правильно реалізувати систему автентифікації в React Native додатках, використовуючи сучасні підходи та найкращі практики індустрії. Ми зануримося в архітектуру безпечного зберігання даних, механізми управління сесіями, захист маршрутів та обробку критичних сценаріїв, таких як втрата токенів або несанкціонований доступ.",[3750,3751,3753],"h3",{"id":3752},"чому-безпека-має-значення","Чому безпека має значення",[3743,3755,3756],{},"Перш ніж перейти до технічних деталей, важливо усвідомити масштаб проблеми. За даними досліджень кібербезпеки, понад 40% мобільних додатків мають критичні вразливості, пов'язані з неправильним зберіганням чутливих даних або недостатнім захистом автентифікаційних токенів. Атаки типу man-in-the-middle, витік токенів доступу, або просте зчитування даних з незахищеного сховища можуть призвести до катастрофічних наслідків як для користувачів, так і для репутації компанії.",[3750,3758,3760],{"id":3759},"що-ми-будемо-вивчати","Що ми будемо вивчати",[3743,3762,3763],{},"У цьому розділі ми охопимо такі ключові теми:",[3765,3766,3767,3775,3786,3792,3798,3804],"ol",{},[3768,3769,3770,3774],"li",{},[3771,3772,3773],"strong",{},"Основи автентифікації"," — розуміння різниці між автентифікацією та авторизацією, вивчення типових патернів (JWT, OAuth, Session-based)",[3768,3776,3777,3780,3781,3785],{},[3771,3778,3779],{},"Secure Storage"," — використання ",[3782,3783,3784],"code",{},"expo-secure-store"," для криптографічно захищеного зберігання токенів",[3768,3787,3788,3791],{},[3771,3789,3790],{},"Управління сесіями"," — створення контексту автентифікації, відстеження стану користувача, автоматичне відновлення сесії",[3768,3793,3794,3797],{},[3771,3795,3796],{},"Захищені маршрути"," — реалізація navigation guards, редиректи, обробка несанкціонованого доступу",[3768,3799,3800,3803],{},[3771,3801,3802],{},"Обробка помилок"," — правильна реакція на 401\u002F403 статуси, refresh tokens, logout при невалідній сесії",[3768,3805,3806,3809],{},[3771,3807,3808],{},"Міні-проєкт \"Секретні нотатки\""," — повнофункціональний додаток з login-формою, захищеним списком нотаток та збереженням токенів",[3811,3812],"hr",{},[3738,3814,3816],{"id":3815},"розділ-1-теоретичні-основи-автентифікації","Розділ 1: Теоретичні Основи Автентифікації",[3750,3818,3820],{"id":3819},"_11-автентифікація-vs-авторизація","1.1. Автентифікація vs Авторизація",[3743,3822,3823],{},"Перш за все, важливо чітко розрізняти два поняття, які часто плутають:",[3743,3825,3826,3829],{},[3771,3827,3828],{},"Автентифікація (Authentication)"," — це процес підтвердження ідентичності користувача. Коли користувач вводить свій логін і пароль, система перевіряє, чи дійсно цей користувач є тим, за кого себе видає. Це відповідь на питання: \"Хто ви?\"",[3743,3831,3832,3835],{},[3771,3833,3834],{},"Авторизація (Authorization)"," — це процес визначення прав доступу автентифікованого користувача до конкретних ресурсів або функцій системи. Після того, як система підтвердила вашу особистість, вона перевіряє, що саме ви можете робити. Це відповідь на питання: \"Що вам дозволено робити?\"",[3743,3837,3838],{},"Приклад з реального життя: коли ви пред'являєте паспорт на вході до офісної будівлі — це автентифікація. Коли охоронець перевіряє, чи маєте ви доступ на певний поверх — це авторизація.",[3750,3840,3842],{"id":3841},"_12-основні-підходи-до-автентифікації","1.2. Основні Підходи до Автентифікації",[3743,3844,3845],{},"У мобільній розробці існує кілька усталених патернів автентифікації, кожен з яких має свої переваги та компроміси.",[3847,3848,3850],"h4",{"id":3849},"_121-session-based-authentication","1.2.1. Session-Based Authentication",[3743,3852,3853],{},[3771,3854,3855],{},"Архітектура:",[3857,3858,3863],"pre",{"className":3859,"code":3861,"language":3862},[3860],"language-text","[Client] --login--> [Server]\n[Server] creates session, stores in DB\u002FRedis\n[Server] --session_id cookie--> [Client]\n[Client] --requests with cookie--> [Server]\n[Server] validates session from storage\n","text",[3782,3864,3861],{"__ignoreMap":3865},"",[3743,3867,3868,3871],{},[3771,3869,3870],{},"Принцип роботи:","\nКористувач надсилає credentials (логін\u002Fпароль) на сервер. Сервер валідує їх, створює сесію в базі даних або в пам'яті (наприклад, Redis), і повертає клієнту ідентифікатор сесії, який зберігається у cookie. При кожному наступному запиті cookie автоматично додається до заголовків, сервер перевіряє валідність сесії в своєму сховищі.",[3743,3873,3874],{},[3771,3875,3876],{},"Переваги:",[3878,3879,3880,3883,3886],"ul",{},[3768,3881,3882],{},"Сервер має повний контроль над сесіями (може інвалідувати в будь-який момент)",[3768,3884,3885],{},"Можливість відстежувати активні сесії користувача",[3768,3887,3888],{},"Простота реалізації для традиційних веб-застосунків",[3743,3890,3891],{},[3771,3892,3893],{},"Недоліки:",[3878,3895,3896,3899,3902],{},[3768,3897,3898],{},"Потребує серверне сховище (stateful)",[3768,3900,3901],{},"Складність масштабування (потрібна синхронізація між серверами)",[3768,3903,3904],{},"У мобільних додатках cookies працюють не так природньо, як у браузерах",[3847,3906,3908],{"id":3907},"_122-token-based-authentication-jwt","1.2.2. Token-Based Authentication (JWT)",[3743,3910,3911],{},[3771,3912,3855],{},[3857,3914,3917],{"className":3915,"code":3916,"language":3862},[3860],"[Client] --login--> [Server]\n[Server] validates credentials\n[Server] generates JWT token (signed)\n[Server] --token--> [Client]\n[Client] stores token (SecureStore)\n[Client] --requests with \"Authorization: Bearer \u003Ctoken>\"--> [Server]\n[Server] validates token signature (stateless)\n",[3782,3918,3916],{"__ignoreMap":3865},[3743,3920,3921,3923],{},[3771,3922,3870],{},"\nJWT (JSON Web Token) — це самодостатній токен, який містить у собі всю необхідну інформацію про користувача у вигляді закодованого JSON payload. Токен складається з трьох частин: header (алгоритм підпису), payload (дані користувача, час видачі, час закінчення), signature (криптографічний підпис).",[3743,3925,3926],{},[3771,3927,3928],{},"Структура JWT:",[3857,3930,3933],{"className":3931,"code":3932,"language":3862},[3860],"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\n\n[Header].[Payload].[Signature]\n",[3782,3934,3932],{"__ignoreMap":3865},[3743,3936,3937],{},"Декодований payload:",[3857,3939,3943],{"className":3940,"code":3941,"language":3942,"meta":3865,"style":3865},"language-json shiki shiki-themes light-plus dark-plus dark-plus","{\n  \"sub\": \"1234567890\",\n  \"name\": \"John Doe\",\n  \"email\": \"john@example.com\",\n  \"role\": \"user\",\n  \"iat\": 1516239022,\n  \"exp\": 1516242622\n}\n","json",[3782,3944,3945,3954,3971,3984,3997,4010,4024,4035],{"__ignoreMap":3865},[3946,3947,3950],"span",{"class":3948,"line":3949},"line",1,[3946,3951,3953],{"class":3952},"sHH4Y","{\n",[3946,3955,3957,3961,3964,3968],{"class":3948,"line":3956},2,[3946,3958,3960],{"class":3959},"sLwNe","  \"sub\"",[3946,3962,3963],{"class":3952},": ",[3946,3965,3967],{"class":3966},"sbdoH","\"1234567890\"",[3946,3969,3970],{"class":3952},",\n",[3946,3972,3974,3977,3979,3982],{"class":3948,"line":3973},3,[3946,3975,3976],{"class":3959},"  \"name\"",[3946,3978,3963],{"class":3952},[3946,3980,3981],{"class":3966},"\"John Doe\"",[3946,3983,3970],{"class":3952},[3946,3985,3987,3990,3992,3995],{"class":3948,"line":3986},4,[3946,3988,3989],{"class":3959},"  \"email\"",[3946,3991,3963],{"class":3952},[3946,3993,3994],{"class":3966},"\"john@example.com\"",[3946,3996,3970],{"class":3952},[3946,3998,4000,4003,4005,4008],{"class":3948,"line":3999},5,[3946,4001,4002],{"class":3959},"  \"role\"",[3946,4004,3963],{"class":3952},[3946,4006,4007],{"class":3966},"\"user\"",[3946,4009,3970],{"class":3952},[3946,4011,4013,4016,4018,4022],{"class":3948,"line":4012},6,[3946,4014,4015],{"class":3959},"  \"iat\"",[3946,4017,3963],{"class":3952},[3946,4019,4021],{"class":4020},"sJj4R","1516239022",[3946,4023,3970],{"class":3952},[3946,4025,4027,4030,4032],{"class":3948,"line":4026},7,[3946,4028,4029],{"class":3959},"  \"exp\"",[3946,4031,3963],{"class":3952},[3946,4033,4034],{"class":4020},"1516242622\n",[3946,4036,4038],{"class":3948,"line":4037},8,[3946,4039,4040],{"class":3952},"}\n",[3743,4042,4043],{},[3771,4044,3876],{},[3878,4046,4047,4050,4053,4056,4059],{},[3768,4048,4049],{},"Stateless (сервер не потребує сховища сесій)",[3768,4051,4052],{},"Легко масштабується горизонтально",[3768,4054,4055],{},"Ідеально підходить для мобільних додатків та SPA",[3768,4057,4058],{},"Може містити користувацькі дані (зменшує кількість запитів до БД)",[3768,4060,4061],{},"Працює між доменами (CORS-friendly)",[3743,4063,4064],{},[3771,4065,3893],{},[3878,4067,4068,4071,4074],{},[3768,4069,4070],{},"Неможливо інвалідувати окремий токен до його закінчення (без додаткових механізмів)",[3768,4072,4073],{},"Більший розмір у порівнянні з session ID",[3768,4075,4076],{},"Потенційні проблеми безпеки при невірному зберіганні",[3847,4078,4080],{"id":4079},"_123-oauth-20-openid-connect","1.2.3. OAuth 2.0 \u002F OpenID Connect",[3743,4082,4083],{},[3771,4084,3855],{},[3857,4086,4089],{"className":4087,"code":4088,"language":3862},[3860],"[Client] --login request--> [Auth Provider (Google\u002FFB\u002FApple)]\n[Auth Provider] --shows login screen-->\n[User] --enters credentials-->\n[Auth Provider] --authorization code--> [Client]\n[Client] --exchange code for token--> [Auth Provider]\n[Auth Provider] --access_token + id_token--> [Client]\n[Client] --access_token--> [Resource Server\u002FAPI]\n",[3782,4090,4088],{"__ignoreMap":3865},[3743,4092,4093,4095],{},[3771,4094,3870],{},"\nOAuth 2.0 — це протокол авторизації, який дозволяє делегувати автентифікацію третій стороні (Google, Facebook, Apple ID). Користувач не вводить credentials безпосередньо у ваш додаток, а автентифікується через довірений провайдер, який після успішної перевірки видає вашому додатку токени доступу.",[3743,4097,4098],{},[3771,4099,3876],{},[3878,4101,4102,4105,4108,4111],{},[3768,4103,4104],{},"Користувачі не створюють нові паролі (зменшення \"password fatigue\")",[3768,4106,4107],{},"Висока безпека (credentials ніколи не проходять через ваш додаток)",[3768,4109,4110],{},"Швидка реєстрація\u002Fвхід",[3768,4112,4113],{},"Соціальні дані доступні через API провайдера",[3743,4115,4116],{},[3771,4117,3893],{},[3878,4119,4120,4123,4126],{},[3768,4121,4122],{},"Залежність від третіх сторін",[3768,4124,4125],{},"Складність налаштування та підтримки",[3768,4127,4128],{},"Різні провайдери мають різні API",[3750,4130,4132],{"id":4131},"_13-вибір-підходу-для-react-native","1.3. Вибір Підходу для React Native",[3743,4134,4135,4136,4139],{},"Для більшості React Native додатків ",[3771,4137,4138],{},"JWT-based authentication"," є найбільш збалансованим рішенням:",[3878,4141,4142,4148,4154,4160],{},[3768,4143,4144,4147],{},[3771,4145,4146],{},"Простота реалізації"," — не потрібно управляти складним серверним станом",[3768,4149,4150,4153],{},[3771,4151,4152],{},"Нативна сумісність"," — токени легко зберігати в SecureStore",[3768,4155,4156,4159],{},[3771,4157,4158],{},"Офлайн-потенціал"," — можна валідувати токен локально (перевіряючи exp)",[3768,4161,4162,4165],{},[3771,4163,4164],{},"Масштабованість"," — серверна частина залишається stateless",[3743,4167,4168],{},"Водночас, для соціальної автентифікації (Google, Apple Sign-In) варто інтегрувати OAuth поверх базової JWT системи.",[3811,4170],{},[3738,4172,4174],{"id":4173},"розділ-2-expo-securestore-криптографічне-сховище","Розділ 2: Expo SecureStore — Криптографічне Сховище",[3750,4176,4178],{"id":4177},"_21-що-таке-securestore","2.1. Що Таке SecureStore?",[3743,4180,4181,4183],{},[3782,4182,3784],{}," — це нативний модуль, що надає доступ до криптографічно захищених сховищ операційної системи:",[3878,4185,4186,4192],{},[3768,4187,4188,4191],{},[3771,4189,4190],{},"iOS:"," Keychain Services — системне сховище, яке використовує hardware encryption (Secure Enclave на пристроях з чіпами A7+)",[3768,4193,4194,4197],{},[3771,4195,4196],{},"Android:"," EncryptedSharedPreferences + Android Keystore System — дані шифруються AES-256, ключі зберігаються в hardware-backed keystore (якщо підтримується пристроєм)",[3743,4199,4200,4203],{},[3771,4201,4202],{},"Чому це важливо:","\nAsyncStorage та інші звичайні методи зберігання даних зберігають інформацію у відкритому вигляді або з мінімальним захистом. Доступ до файлової системи на jailbroken\u002Frooted пристроях або через backup дозволяє прочитати ці дані. SecureStore використовує системні можливості шифрування, які недоступні навіть з root-правами (за умови апаратної підтримки).",[3750,4205,4207],{"id":4206},"_22-встановлення-та-базове-використання","2.2. Встановлення та Базове Використання",[3743,4209,4210],{},[3771,4211,4212],{},"Встановлення:",[3857,4214,4218],{"className":4215,"code":4216,"language":4217,"meta":3865,"style":3865},"language-bash shiki shiki-themes light-plus dark-plus dark-plus","npx expo install expo-secure-store\n","bash",[3782,4219,4220],{"__ignoreMap":3865},[3946,4221,4222,4226,4229,4232],{"class":3948,"line":3949},[3946,4223,4225],{"class":4224},"s8Opu","npx",[3946,4227,4228],{"class":3966}," expo",[3946,4230,4231],{"class":3966}," install",[3946,4233,4234],{"class":3966}," expo-secure-store\n",[3743,4236,4237],{},[3771,4238,4239],{},"Перевірка сумісності:",[3857,4241,4245],{"className":4242,"code":4243,"language":4244,"meta":3865,"style":3865},"language-typescript shiki shiki-themes light-plus dark-plus dark-plus","import * as SecureStore from 'expo-secure-store';\n\nconst isAvailable = await SecureStore.isAvailableAsync();\nif (!isAvailable) {\n  console.warn('SecureStore не доступний на цьому пристрої');\n  \u002F\u002F Fallback стратегія\n}\n","typescript",[3782,4246,4247,4273,4279,4305,4319,4338,4344],{"__ignoreMap":3865},[3946,4248,4249,4253,4257,4260,4264,4267,4270],{"class":3948,"line":3949},[3946,4250,4252],{"class":4251},"s8xlr","import",[3946,4254,4256],{"class":4255},"su1O8"," *",[3946,4258,4259],{"class":4251}," as",[3946,4261,4263],{"class":4262},"siwwj"," SecureStore",[3946,4265,4266],{"class":4251}," from",[3946,4268,4269],{"class":3966}," 'expo-secure-store'",[3946,4271,4272],{"class":3952},";\n",[3946,4274,4275],{"class":3948,"line":3956},[3946,4276,4278],{"emptyLinePlaceholder":4277},true,"\n",[3946,4280,4281,4284,4288,4291,4294,4296,4299,4302],{"class":3948,"line":3973},[3946,4282,4283],{"class":4255},"const",[3946,4285,4287],{"class":4286},"s-QsJ"," isAvailable",[3946,4289,4290],{"class":3952}," = ",[3946,4292,4293],{"class":4251},"await",[3946,4295,4263],{"class":4262},[3946,4297,4298],{"class":3952},".",[3946,4300,4301],{"class":4224},"isAvailableAsync",[3946,4303,4304],{"class":3952},"();\n",[3946,4306,4307,4310,4313,4316],{"class":3948,"line":3986},[3946,4308,4309],{"class":4251},"if",[3946,4311,4312],{"class":3952}," (!",[3946,4314,4315],{"class":4262},"isAvailable",[3946,4317,4318],{"class":3952},") {\n",[3946,4320,4321,4324,4326,4329,4332,4335],{"class":3948,"line":3999},[3946,4322,4323],{"class":4262},"  console",[3946,4325,4298],{"class":3952},[3946,4327,4328],{"class":4224},"warn",[3946,4330,4331],{"class":3952},"(",[3946,4333,4334],{"class":3966},"'SecureStore не доступний на цьому пристрої'",[3946,4336,4337],{"class":3952},");\n",[3946,4339,4340],{"class":3948,"line":4012},[3946,4341,4343],{"class":4342},"spJ8K","  \u002F\u002F Fallback стратегія\n",[3946,4345,4346],{"class":3948,"line":4026},[3946,4347,4040],{"class":3952},[3743,4349,4350],{},[3771,4351,4352],{},"Базові операції:",[3857,4354,4356],{"className":4242,"code":4355,"language":4244,"meta":3865,"style":3865},"import * as SecureStore from 'expo-secure-store';\n\n\u002F\u002F Збереження даних\nasync function saveToken(token: string): Promise\u003Cvoid> {\n  try {\n    await SecureStore.setItemAsync('userToken', token);\n    console.log('Токен успішно збережено');\n  } catch (error) {\n    console.error('Помилка збереження токену:', error);\n    throw error;\n  }\n}\n\n\u002F\u002F Читання даних\nasync function getToken(): Promise\u003Cstring | null> {\n  try {\n    const token = await SecureStore.getItemAsync('userToken');\n    return token;\n  } catch (error) {\n    console.error('Помилка читання токену:', error);\n    return null;\n  }\n}\n\n\u002F\u002F Видалення даних\nasync function deleteToken(): Promise\u003Cvoid> {\n  try {\n    await SecureStore.deleteItemAsync('userToken');\n    console.log('Токен успішно видалено');\n  } catch (error) {\n    console.error('Помилка видалення токену:', error);\n    throw error;\n  }\n}\n",[3782,4357,4358,4374,4378,4383,4420,4428,4452,4469,4485,4505,4516,4522,4527,4532,4538,4565,4572,4598,4608,4621,4641,4651,4656,4661,4666,4672,4692,4699,4717,4733,4746,4766,4775,4780],{"__ignoreMap":3865},[3946,4359,4360,4362,4364,4366,4368,4370,4372],{"class":3948,"line":3949},[3946,4361,4252],{"class":4251},[3946,4363,4256],{"class":4255},[3946,4365,4259],{"class":4251},[3946,4367,4263],{"class":4262},[3946,4369,4266],{"class":4251},[3946,4371,4269],{"class":3966},[3946,4373,4272],{"class":3952},[3946,4375,4376],{"class":3948,"line":3956},[3946,4377,4278],{"emptyLinePlaceholder":4277},[3946,4379,4380],{"class":3948,"line":3973},[3946,4381,4382],{"class":4342},"\u002F\u002F Збереження даних\n",[3946,4384,4385,4388,4391,4394,4396,4399,4401,4405,4408,4411,4414,4417],{"class":3948,"line":3986},[3946,4386,4387],{"class":4255},"async",[3946,4389,4390],{"class":4255}," function",[3946,4392,4393],{"class":4224}," saveToken",[3946,4395,4331],{"class":3952},[3946,4397,4398],{"class":4262},"token",[3946,4400,3963],{"class":3952},[3946,4402,4404],{"class":4403},"sN1BT","string",[3946,4406,4407],{"class":3952},"): ",[3946,4409,4410],{"class":4403},"Promise",[3946,4412,4413],{"class":3952},"\u003C",[3946,4415,4416],{"class":4403},"void",[3946,4418,4419],{"class":3952},"> {\n",[3946,4421,4422,4425],{"class":3948,"line":3999},[3946,4423,4424],{"class":4251},"  try",[3946,4426,4427],{"class":3952}," {\n",[3946,4429,4430,4433,4435,4437,4440,4442,4445,4448,4450],{"class":3948,"line":4012},[3946,4431,4432],{"class":4251},"    await",[3946,4434,4263],{"class":4262},[3946,4436,4298],{"class":3952},[3946,4438,4439],{"class":4224},"setItemAsync",[3946,4441,4331],{"class":3952},[3946,4443,4444],{"class":3966},"'userToken'",[3946,4446,4447],{"class":3952},", ",[3946,4449,4398],{"class":4262},[3946,4451,4337],{"class":3952},[3946,4453,4454,4457,4459,4462,4464,4467],{"class":3948,"line":4026},[3946,4455,4456],{"class":4262},"    console",[3946,4458,4298],{"class":3952},[3946,4460,4461],{"class":4224},"log",[3946,4463,4331],{"class":3952},[3946,4465,4466],{"class":3966},"'Токен успішно збережено'",[3946,4468,4337],{"class":3952},[3946,4470,4471,4474,4477,4480,4483],{"class":3948,"line":4037},[3946,4472,4473],{"class":3952},"  } ",[3946,4475,4476],{"class":4251},"catch",[3946,4478,4479],{"class":3952}," (",[3946,4481,4482],{"class":4262},"error",[3946,4484,4318],{"class":3952},[3946,4486,4488,4490,4492,4494,4496,4499,4501,4503],{"class":3948,"line":4487},9,[3946,4489,4456],{"class":4262},[3946,4491,4298],{"class":3952},[3946,4493,4482],{"class":4224},[3946,4495,4331],{"class":3952},[3946,4497,4498],{"class":3966},"'Помилка збереження токену:'",[3946,4500,4447],{"class":3952},[3946,4502,4482],{"class":4262},[3946,4504,4337],{"class":3952},[3946,4506,4508,4511,4514],{"class":3948,"line":4507},10,[3946,4509,4510],{"class":4251},"    throw",[3946,4512,4513],{"class":4262}," error",[3946,4515,4272],{"class":3952},[3946,4517,4519],{"class":3948,"line":4518},11,[3946,4520,4521],{"class":3952},"  }\n",[3946,4523,4525],{"class":3948,"line":4524},12,[3946,4526,4040],{"class":3952},[3946,4528,4530],{"class":3948,"line":4529},13,[3946,4531,4278],{"emptyLinePlaceholder":4277},[3946,4533,4535],{"class":3948,"line":4534},14,[3946,4536,4537],{"class":4342},"\u002F\u002F Читання даних\n",[3946,4539,4541,4543,4545,4548,4551,4553,4555,4557,4560,4563],{"class":3948,"line":4540},15,[3946,4542,4387],{"class":4255},[3946,4544,4390],{"class":4255},[3946,4546,4547],{"class":4224}," getToken",[3946,4549,4550],{"class":3952},"(): ",[3946,4552,4410],{"class":4403},[3946,4554,4413],{"class":3952},[3946,4556,4404],{"class":4403},[3946,4558,4559],{"class":3952}," | ",[3946,4561,4562],{"class":4403},"null",[3946,4564,4419],{"class":3952},[3946,4566,4568,4570],{"class":3948,"line":4567},16,[3946,4569,4424],{"class":4251},[3946,4571,4427],{"class":3952},[3946,4573,4575,4578,4581,4583,4585,4587,4589,4592,4594,4596],{"class":3948,"line":4574},17,[3946,4576,4577],{"class":4255},"    const",[3946,4579,4580],{"class":4286}," token",[3946,4582,4290],{"class":3952},[3946,4584,4293],{"class":4251},[3946,4586,4263],{"class":4262},[3946,4588,4298],{"class":3952},[3946,4590,4591],{"class":4224},"getItemAsync",[3946,4593,4331],{"class":3952},[3946,4595,4444],{"class":3966},[3946,4597,4337],{"class":3952},[3946,4599,4601,4604,4606],{"class":3948,"line":4600},18,[3946,4602,4603],{"class":4251},"    return",[3946,4605,4580],{"class":4262},[3946,4607,4272],{"class":3952},[3946,4609,4611,4613,4615,4617,4619],{"class":3948,"line":4610},19,[3946,4612,4473],{"class":3952},[3946,4614,4476],{"class":4251},[3946,4616,4479],{"class":3952},[3946,4618,4482],{"class":4262},[3946,4620,4318],{"class":3952},[3946,4622,4624,4626,4628,4630,4632,4635,4637,4639],{"class":3948,"line":4623},20,[3946,4625,4456],{"class":4262},[3946,4627,4298],{"class":3952},[3946,4629,4482],{"class":4224},[3946,4631,4331],{"class":3952},[3946,4633,4634],{"class":3966},"'Помилка читання токену:'",[3946,4636,4447],{"class":3952},[3946,4638,4482],{"class":4262},[3946,4640,4337],{"class":3952},[3946,4642,4644,4646,4649],{"class":3948,"line":4643},21,[3946,4645,4603],{"class":4251},[3946,4647,4648],{"class":4255}," null",[3946,4650,4272],{"class":3952},[3946,4652,4654],{"class":3948,"line":4653},22,[3946,4655,4521],{"class":3952},[3946,4657,4659],{"class":3948,"line":4658},23,[3946,4660,4040],{"class":3952},[3946,4662,4664],{"class":3948,"line":4663},24,[3946,4665,4278],{"emptyLinePlaceholder":4277},[3946,4667,4669],{"class":3948,"line":4668},25,[3946,4670,4671],{"class":4342},"\u002F\u002F Видалення даних\n",[3946,4673,4675,4677,4679,4682,4684,4686,4688,4690],{"class":3948,"line":4674},26,[3946,4676,4387],{"class":4255},[3946,4678,4390],{"class":4255},[3946,4680,4681],{"class":4224}," deleteToken",[3946,4683,4550],{"class":3952},[3946,4685,4410],{"class":4403},[3946,4687,4413],{"class":3952},[3946,4689,4416],{"class":4403},[3946,4691,4419],{"class":3952},[3946,4693,4695,4697],{"class":3948,"line":4694},27,[3946,4696,4424],{"class":4251},[3946,4698,4427],{"class":3952},[3946,4700,4702,4704,4706,4708,4711,4713,4715],{"class":3948,"line":4701},28,[3946,4703,4432],{"class":4251},[3946,4705,4263],{"class":4262},[3946,4707,4298],{"class":3952},[3946,4709,4710],{"class":4224},"deleteItemAsync",[3946,4712,4331],{"class":3952},[3946,4714,4444],{"class":3966},[3946,4716,4337],{"class":3952},[3946,4718,4720,4722,4724,4726,4728,4731],{"class":3948,"line":4719},29,[3946,4721,4456],{"class":4262},[3946,4723,4298],{"class":3952},[3946,4725,4461],{"class":4224},[3946,4727,4331],{"class":3952},[3946,4729,4730],{"class":3966},"'Токен успішно видалено'",[3946,4732,4337],{"class":3952},[3946,4734,4736,4738,4740,4742,4744],{"class":3948,"line":4735},30,[3946,4737,4473],{"class":3952},[3946,4739,4476],{"class":4251},[3946,4741,4479],{"class":3952},[3946,4743,4482],{"class":4262},[3946,4745,4318],{"class":3952},[3946,4747,4749,4751,4753,4755,4757,4760,4762,4764],{"class":3948,"line":4748},31,[3946,4750,4456],{"class":4262},[3946,4752,4298],{"class":3952},[3946,4754,4482],{"class":4224},[3946,4756,4331],{"class":3952},[3946,4758,4759],{"class":3966},"'Помилка видалення токену:'",[3946,4761,4447],{"class":3952},[3946,4763,4482],{"class":4262},[3946,4765,4337],{"class":3952},[3946,4767,4769,4771,4773],{"class":3948,"line":4768},32,[3946,4770,4510],{"class":4251},[3946,4772,4513],{"class":4262},[3946,4774,4272],{"class":3952},[3946,4776,4778],{"class":3948,"line":4777},33,[3946,4779,4521],{"class":3952},[3946,4781,4783],{"class":3948,"line":4782},34,[3946,4784,4040],{"class":3952},[3750,4786,4788],{"id":4787},"_23-опції-конфігурації","2.3. Опції Конфігурації",[3743,4790,4791],{},"SecureStore надає додаткові опції для контролю поведінки зберігання:",[3857,4793,4795],{"className":4242,"code":4794,"language":4244,"meta":3865,"style":3865},"interface SecureStoreOptions {\n  keychainService?: string;      \u002F\u002F iOS: custom keychain service name\n  keychainAccessible?: number;   \u002F\u002F iOS: коли дані доступні\n  requireAuthentication?: boolean; \u002F\u002F Вимагати біометрію для доступу\n  authenticationPrompt?: string;  \u002F\u002F Текст промпту біометрії\n}\n",[3782,4796,4797,4807,4823,4839,4855,4870],{"__ignoreMap":3865},[3946,4798,4799,4802,4805],{"class":3948,"line":3949},[3946,4800,4801],{"class":4255},"interface",[3946,4803,4804],{"class":4403}," SecureStoreOptions",[3946,4806,4427],{"class":3952},[3946,4808,4809,4812,4815,4817,4820],{"class":3948,"line":3956},[3946,4810,4811],{"class":4262},"  keychainService",[3946,4813,4814],{"class":3952},"?: ",[3946,4816,4404],{"class":4403},[3946,4818,4819],{"class":3952},";      ",[3946,4821,4822],{"class":4342},"\u002F\u002F iOS: custom keychain service name\n",[3946,4824,4825,4828,4830,4833,4836],{"class":3948,"line":3973},[3946,4826,4827],{"class":4262},"  keychainAccessible",[3946,4829,4814],{"class":3952},[3946,4831,4832],{"class":4403},"number",[3946,4834,4835],{"class":3952},";   ",[3946,4837,4838],{"class":4342},"\u002F\u002F iOS: коли дані доступні\n",[3946,4840,4841,4844,4846,4849,4852],{"class":3948,"line":3986},[3946,4842,4843],{"class":4262},"  requireAuthentication",[3946,4845,4814],{"class":3952},[3946,4847,4848],{"class":4403},"boolean",[3946,4850,4851],{"class":3952},"; ",[3946,4853,4854],{"class":4342},"\u002F\u002F Вимагати біометрію для доступу\n",[3946,4856,4857,4860,4862,4864,4867],{"class":3948,"line":3999},[3946,4858,4859],{"class":4262},"  authenticationPrompt",[3946,4861,4814],{"class":3952},[3946,4863,4404],{"class":4403},[3946,4865,4866],{"class":3952},";  ",[3946,4868,4869],{"class":4342},"\u002F\u002F Текст промпту біометрії\n",[3946,4871,4872],{"class":3948,"line":4012},[3946,4873,4040],{"class":3952},[3743,4875,4876],{},[3771,4877,4878],{},"Приклад з біометричною аутентифікацією:",[3857,4880,4882],{"className":4242,"code":4881,"language":4244,"meta":3865,"style":3865},"import * as SecureStore from 'expo-secure-store';\n\nasync function saveSecureToken(token: string): Promise\u003Cvoid> {\n  await SecureStore.setItemAsync('userToken', token, {\n    requireAuthentication: true,\n    authenticationPrompt: 'Автентифікуйтесь для збереження токену',\n  });\n}\n\nasync function getSecureToken(): Promise\u003Cstring | null> {\n  \u002F\u002F Користувач побачить промпт з Face ID \u002F Touch ID \u002F PIN\n  const token = await SecureStore.getItemAsync('userToken', {\n    requireAuthentication: true,\n    authenticationPrompt: 'Автентифікуйтесь для доступу до додатку',\n  });\n  return token;\n}\n",[3782,4883,4884,4900,4904,4931,4953,4963,4973,4978,4982,4986,5009,5014,5037,5045,5054,5058,5067],{"__ignoreMap":3865},[3946,4885,4886,4888,4890,4892,4894,4896,4898],{"class":3948,"line":3949},[3946,4887,4252],{"class":4251},[3946,4889,4256],{"class":4255},[3946,4891,4259],{"class":4251},[3946,4893,4263],{"class":4262},[3946,4895,4266],{"class":4251},[3946,4897,4269],{"class":3966},[3946,4899,4272],{"class":3952},[3946,4901,4902],{"class":3948,"line":3956},[3946,4903,4278],{"emptyLinePlaceholder":4277},[3946,4905,4906,4908,4910,4913,4915,4917,4919,4921,4923,4925,4927,4929],{"class":3948,"line":3973},[3946,4907,4387],{"class":4255},[3946,4909,4390],{"class":4255},[3946,4911,4912],{"class":4224}," saveSecureToken",[3946,4914,4331],{"class":3952},[3946,4916,4398],{"class":4262},[3946,4918,3963],{"class":3952},[3946,4920,4404],{"class":4403},[3946,4922,4407],{"class":3952},[3946,4924,4410],{"class":4403},[3946,4926,4413],{"class":3952},[3946,4928,4416],{"class":4403},[3946,4930,4419],{"class":3952},[3946,4932,4933,4936,4938,4940,4942,4944,4946,4948,4950],{"class":3948,"line":3986},[3946,4934,4935],{"class":4251},"  await",[3946,4937,4263],{"class":4262},[3946,4939,4298],{"class":3952},[3946,4941,4439],{"class":4224},[3946,4943,4331],{"class":3952},[3946,4945,4444],{"class":3966},[3946,4947,4447],{"class":3952},[3946,4949,4398],{"class":4262},[3946,4951,4952],{"class":3952},", {\n",[3946,4954,4955,4958,4961],{"class":3948,"line":3999},[3946,4956,4957],{"class":4262},"    requireAuthentication:",[3946,4959,4960],{"class":4255}," true",[3946,4962,3970],{"class":3952},[3946,4964,4965,4968,4971],{"class":3948,"line":4012},[3946,4966,4967],{"class":4262},"    authenticationPrompt:",[3946,4969,4970],{"class":3966}," 'Автентифікуйтесь для збереження токену'",[3946,4972,3970],{"class":3952},[3946,4974,4975],{"class":3948,"line":4026},[3946,4976,4977],{"class":3952},"  });\n",[3946,4979,4980],{"class":3948,"line":4037},[3946,4981,4040],{"class":3952},[3946,4983,4984],{"class":3948,"line":4487},[3946,4985,4278],{"emptyLinePlaceholder":4277},[3946,4987,4988,4990,4992,4995,4997,4999,5001,5003,5005,5007],{"class":3948,"line":4507},[3946,4989,4387],{"class":4255},[3946,4991,4390],{"class":4255},[3946,4993,4994],{"class":4224}," getSecureToken",[3946,4996,4550],{"class":3952},[3946,4998,4410],{"class":4403},[3946,5000,4413],{"class":3952},[3946,5002,4404],{"class":4403},[3946,5004,4559],{"class":3952},[3946,5006,4562],{"class":4403},[3946,5008,4419],{"class":3952},[3946,5010,5011],{"class":3948,"line":4518},[3946,5012,5013],{"class":4342},"  \u002F\u002F Користувач побачить промпт з Face ID \u002F Touch ID \u002F PIN\n",[3946,5015,5016,5019,5021,5023,5025,5027,5029,5031,5033,5035],{"class":3948,"line":4524},[3946,5017,5018],{"class":4255},"  const",[3946,5020,4580],{"class":4286},[3946,5022,4290],{"class":3952},[3946,5024,4293],{"class":4251},[3946,5026,4263],{"class":4262},[3946,5028,4298],{"class":3952},[3946,5030,4591],{"class":4224},[3946,5032,4331],{"class":3952},[3946,5034,4444],{"class":3966},[3946,5036,4952],{"class":3952},[3946,5038,5039,5041,5043],{"class":3948,"line":4529},[3946,5040,4957],{"class":4262},[3946,5042,4960],{"class":4255},[3946,5044,3970],{"class":3952},[3946,5046,5047,5049,5052],{"class":3948,"line":4534},[3946,5048,4967],{"class":4262},[3946,5050,5051],{"class":3966}," 'Автентифікуйтесь для доступу до додатку'",[3946,5053,3970],{"class":3952},[3946,5055,5056],{"class":3948,"line":4540},[3946,5057,4977],{"class":3952},[3946,5059,5060,5063,5065],{"class":3948,"line":4567},[3946,5061,5062],{"class":4251},"  return",[3946,5064,4580],{"class":4262},[3946,5066,4272],{"class":3952},[3946,5068,5069],{"class":3948,"line":4574},[3946,5070,4040],{"class":3952},[3750,5072,5074],{"id":5073},"_24-обмеження-та-найкращі-практики","2.4. Обмеження та Найкращі Практики",[3743,5076,5077],{},[3771,5078,5079],{},"Обмеження:",[3878,5081,5082,5088,5094,5100,5106],{},[3768,5083,5084,5087],{},[3771,5085,5086],{},"Розмір:"," Максимум 2048 байт на ключ (iOS), Android має більший ліміт, але рекомендується зберігати мінімум",[3768,5089,5090,5093],{},[3771,5091,5092],{},"Тип даних:"," Лише string (для об'єктів потрібна серіалізація)",[3768,5095,5096,5099],{},[3771,5097,5098],{},"Синхронність:"," Всі операції асинхронні",[3768,5101,5102,5105],{},[3771,5103,5104],{},"Доступність:"," Не працює в Expo Go на Android (потрібен development build)",[3768,5107,5108,5111,5112,5115,5116,5118,5119,5122,5123,5126,5127,4447,5130,4447,5133,5136],{},[3771,5109,5110],{},"Ключі:"," ⚠️ ",[3771,5113,5114],{},"ВАЖЛИВО!"," Ключі можуть містити лише alphanumeric символи, крапку ",[3782,5117,4298],{},", дефіс ",[3782,5120,5121],{},"-",", підкреслення ",[3782,5124,5125],{},"_",". Символи ",[3782,5128,5129],{},"\u002F",[3782,5131,5132],{},"@",[3782,5134,5135],{},"#"," та інші заборонені!",[3743,5138,5139],{},[3771,5140,5141],{},"Найкращі практики:",[3765,5143,5144],{},[3768,5145,5146],{},[3771,5147,5148],{},"Використовуйте валідні ключі:",[3857,5150,5152],{"className":4242,"code":5151,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ✅ Добре\nawait SecureStore.setItemAsync('nomad.auth.tokens', data);\nawait SecureStore.setItemAsync('user-profile', data);\nawait SecureStore.setItemAsync('access_token', data);\n\n\u002F\u002F ❌ Погано (невалідні символи)\nawait SecureStore.setItemAsync('@nomad\u002Fauth\u002Ftokens', data);  \u002F\u002F Error: \"\u002F\"\nawait SecureStore.setItemAsync('user@data', data);           \u002F\u002F Error: \"@\"\nawait SecureStore.setItemAsync('cache#tokens', data);        \u002F\u002F Error: \"#\"\n",[3782,5153,5154,5159,5181,5202,5223,5227,5232,5257,5282],{"__ignoreMap":3865},[3946,5155,5156],{"class":3948,"line":3949},[3946,5157,5158],{"class":4342},"\u002F\u002F ✅ Добре\n",[3946,5160,5161,5163,5165,5167,5169,5171,5174,5176,5179],{"class":3948,"line":3956},[3946,5162,4293],{"class":4251},[3946,5164,4263],{"class":4262},[3946,5166,4298],{"class":3952},[3946,5168,4439],{"class":4224},[3946,5170,4331],{"class":3952},[3946,5172,5173],{"class":3966},"'nomad.auth.tokens'",[3946,5175,4447],{"class":3952},[3946,5177,5178],{"class":4262},"data",[3946,5180,4337],{"class":3952},[3946,5182,5183,5185,5187,5189,5191,5193,5196,5198,5200],{"class":3948,"line":3973},[3946,5184,4293],{"class":4251},[3946,5186,4263],{"class":4262},[3946,5188,4298],{"class":3952},[3946,5190,4439],{"class":4224},[3946,5192,4331],{"class":3952},[3946,5194,5195],{"class":3966},"'user-profile'",[3946,5197,4447],{"class":3952},[3946,5199,5178],{"class":4262},[3946,5201,4337],{"class":3952},[3946,5203,5204,5206,5208,5210,5212,5214,5217,5219,5221],{"class":3948,"line":3986},[3946,5205,4293],{"class":4251},[3946,5207,4263],{"class":4262},[3946,5209,4298],{"class":3952},[3946,5211,4439],{"class":4224},[3946,5213,4331],{"class":3952},[3946,5215,5216],{"class":3966},"'access_token'",[3946,5218,4447],{"class":3952},[3946,5220,5178],{"class":4262},[3946,5222,4337],{"class":3952},[3946,5224,5225],{"class":3948,"line":3999},[3946,5226,4278],{"emptyLinePlaceholder":4277},[3946,5228,5229],{"class":3948,"line":4012},[3946,5230,5231],{"class":4342},"\u002F\u002F ❌ Погано (невалідні символи)\n",[3946,5233,5234,5236,5238,5240,5242,5244,5247,5249,5251,5254],{"class":3948,"line":4026},[3946,5235,4293],{"class":4251},[3946,5237,4263],{"class":4262},[3946,5239,4298],{"class":3952},[3946,5241,4439],{"class":4224},[3946,5243,4331],{"class":3952},[3946,5245,5246],{"class":3966},"'@nomad\u002Fauth\u002Ftokens'",[3946,5248,4447],{"class":3952},[3946,5250,5178],{"class":4262},[3946,5252,5253],{"class":3952},");  ",[3946,5255,5256],{"class":4342},"\u002F\u002F Error: \"\u002F\"\n",[3946,5258,5259,5261,5263,5265,5267,5269,5272,5274,5276,5279],{"class":3948,"line":4037},[3946,5260,4293],{"class":4251},[3946,5262,4263],{"class":4262},[3946,5264,4298],{"class":3952},[3946,5266,4439],{"class":4224},[3946,5268,4331],{"class":3952},[3946,5270,5271],{"class":3966},"'user@data'",[3946,5273,4447],{"class":3952},[3946,5275,5178],{"class":4262},[3946,5277,5278],{"class":3952},");           ",[3946,5280,5281],{"class":4342},"\u002F\u002F Error: \"@\"\n",[3946,5283,5284,5286,5288,5290,5292,5294,5297,5299,5301,5304],{"class":3948,"line":4487},[3946,5285,4293],{"class":4251},[3946,5287,4263],{"class":4262},[3946,5289,4298],{"class":3952},[3946,5291,4439],{"class":4224},[3946,5293,4331],{"class":3952},[3946,5295,5296],{"class":3966},"'cache#tokens'",[3946,5298,4447],{"class":3952},[3946,5300,5178],{"class":4262},[3946,5302,5303],{"class":3952},");        ",[3946,5305,5306],{"class":4342},"\u002F\u002F Error: \"#\"\n",[3765,5308,5309],{"start":3956},[3768,5310,5311],{},[3771,5312,5313],{},"Зберігайте лише критичні дані:",[3857,5315,5317],{"className":4242,"code":5316,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ✅ Добре\nawait SecureStore.setItemAsync('accessToken', token);\nawait SecureStore.setItemAsync('refreshToken', refreshToken);\n\n\u002F\u002F ❌ Погано (надмірне використання)\nawait SecureStore.setItemAsync('userName', 'John'); \u002F\u002F Це не чутливі дані\nawait SecureStore.setItemAsync('theme', 'dark');    \u002F\u002F Використайте AsyncStorage\n",[3782,5318,5319,5323,5344,5366,5370,5375,5401],{"__ignoreMap":3865},[3946,5320,5321],{"class":3948,"line":3949},[3946,5322,5158],{"class":4342},[3946,5324,5325,5327,5329,5331,5333,5335,5338,5340,5342],{"class":3948,"line":3956},[3946,5326,4293],{"class":4251},[3946,5328,4263],{"class":4262},[3946,5330,4298],{"class":3952},[3946,5332,4439],{"class":4224},[3946,5334,4331],{"class":3952},[3946,5336,5337],{"class":3966},"'accessToken'",[3946,5339,4447],{"class":3952},[3946,5341,4398],{"class":4262},[3946,5343,4337],{"class":3952},[3946,5345,5346,5348,5350,5352,5354,5356,5359,5361,5364],{"class":3948,"line":3973},[3946,5347,4293],{"class":4251},[3946,5349,4263],{"class":4262},[3946,5351,4298],{"class":3952},[3946,5353,4439],{"class":4224},[3946,5355,4331],{"class":3952},[3946,5357,5358],{"class":3966},"'refreshToken'",[3946,5360,4447],{"class":3952},[3946,5362,5363],{"class":4262},"refreshToken",[3946,5365,4337],{"class":3952},[3946,5367,5368],{"class":3948,"line":3986},[3946,5369,4278],{"emptyLinePlaceholder":4277},[3946,5371,5372],{"class":3948,"line":3999},[3946,5373,5374],{"class":4342},"\u002F\u002F ❌ Погано (надмірне використання)\n",[3946,5376,5377,5379,5381,5383,5385,5387,5390,5392,5395,5398],{"class":3948,"line":4012},[3946,5378,4293],{"class":4251},[3946,5380,4263],{"class":4262},[3946,5382,4298],{"class":3952},[3946,5384,4439],{"class":4224},[3946,5386,4331],{"class":3952},[3946,5388,5389],{"class":3966},"'userName'",[3946,5391,4447],{"class":3952},[3946,5393,5394],{"class":3966},"'John'",[3946,5396,5397],{"class":3952},"); ",[3946,5399,5400],{"class":4342},"\u002F\u002F Це не чутливі дані\n",[3946,5402,5403,5405,5407,5409,5411,5413,5416,5418,5421,5424],{"class":3948,"line":4026},[3946,5404,4293],{"class":4251},[3946,5406,4263],{"class":4262},[3946,5408,4298],{"class":3952},[3946,5410,4439],{"class":4224},[3946,5412,4331],{"class":3952},[3946,5414,5415],{"class":3966},"'theme'",[3946,5417,4447],{"class":3952},[3946,5419,5420],{"class":3966},"'dark'",[3946,5422,5423],{"class":3952},");    ",[3946,5425,5426],{"class":4342},"\u002F\u002F Використайте AsyncStorage\n",[3765,5428,5429],{"start":3973},[3768,5430,5431],{},[3771,5432,5433],{},"Обробляйте помилки:",[3857,5435,5437],{"className":4242,"code":5436,"language":4244,"meta":3865,"style":3865},"async function safeGetToken(): Promise\u003Cstring | null> {\n  try {\n    return await SecureStore.getItemAsync('userToken');\n  } catch (error) {\n    if (error instanceof Error) {\n      \u002F\u002F Логування в систему моніторингу (Sentry, Crashlytics)\n      console.error('SecureStore error:', error.message);\n    }\n    \u002F\u002F Не викидайте помилку далі — поверніть null і дозвольте додатку працювати\n    return null;\n  }\n}\n",[3782,5438,5439,5462,5468,5487,5499,5516,5521,5546,5551,5556,5564,5568],{"__ignoreMap":3865},[3946,5440,5441,5443,5445,5448,5450,5452,5454,5456,5458,5460],{"class":3948,"line":3949},[3946,5442,4387],{"class":4255},[3946,5444,4390],{"class":4255},[3946,5446,5447],{"class":4224}," safeGetToken",[3946,5449,4550],{"class":3952},[3946,5451,4410],{"class":4403},[3946,5453,4413],{"class":3952},[3946,5455,4404],{"class":4403},[3946,5457,4559],{"class":3952},[3946,5459,4562],{"class":4403},[3946,5461,4419],{"class":3952},[3946,5463,5464,5466],{"class":3948,"line":3956},[3946,5465,4424],{"class":4251},[3946,5467,4427],{"class":3952},[3946,5469,5470,5472,5475,5477,5479,5481,5483,5485],{"class":3948,"line":3973},[3946,5471,4603],{"class":4251},[3946,5473,5474],{"class":4251}," await",[3946,5476,4263],{"class":4262},[3946,5478,4298],{"class":3952},[3946,5480,4591],{"class":4224},[3946,5482,4331],{"class":3952},[3946,5484,4444],{"class":3966},[3946,5486,4337],{"class":3952},[3946,5488,5489,5491,5493,5495,5497],{"class":3948,"line":3986},[3946,5490,4473],{"class":3952},[3946,5492,4476],{"class":4251},[3946,5494,4479],{"class":3952},[3946,5496,4482],{"class":4262},[3946,5498,4318],{"class":3952},[3946,5500,5501,5504,5506,5508,5511,5514],{"class":3948,"line":3999},[3946,5502,5503],{"class":4251},"    if",[3946,5505,4479],{"class":3952},[3946,5507,4482],{"class":4262},[3946,5509,5510],{"class":4255}," instanceof",[3946,5512,5513],{"class":4403}," Error",[3946,5515,4318],{"class":3952},[3946,5517,5518],{"class":3948,"line":4012},[3946,5519,5520],{"class":4342},"      \u002F\u002F Логування в систему моніторингу (Sentry, Crashlytics)\n",[3946,5522,5523,5526,5528,5530,5532,5535,5537,5539,5541,5544],{"class":3948,"line":4026},[3946,5524,5525],{"class":4262},"      console",[3946,5527,4298],{"class":3952},[3946,5529,4482],{"class":4224},[3946,5531,4331],{"class":3952},[3946,5533,5534],{"class":3966},"'SecureStore error:'",[3946,5536,4447],{"class":3952},[3946,5538,4482],{"class":4262},[3946,5540,4298],{"class":3952},[3946,5542,5543],{"class":4262},"message",[3946,5545,4337],{"class":3952},[3946,5547,5548],{"class":3948,"line":4037},[3946,5549,5550],{"class":3952},"    }\n",[3946,5552,5553],{"class":3948,"line":4487},[3946,5554,5555],{"class":4342},"    \u002F\u002F Не викидайте помилку далі — поверніть null і дозвольте додатку працювати\n",[3946,5557,5558,5560,5562],{"class":3948,"line":4507},[3946,5559,4603],{"class":4251},[3946,5561,4648],{"class":4255},[3946,5563,4272],{"class":3952},[3946,5565,5566],{"class":3948,"line":4518},[3946,5567,4521],{"class":3952},[3946,5569,5570],{"class":3948,"line":4524},[3946,5571,4040],{"class":3952},[3765,5573,5574],{"start":3973},[3768,5575,5576],{},[3771,5577,5578],{},"Серіалізуйте складні об'єкти:",[3857,5580,5582],{"className":4242,"code":5581,"language":4244,"meta":3865,"style":3865},"interface UserSession {\n  accessToken: string;\n  refreshToken: string;\n  expiresAt: number;\n  userId: string;\n}\n\nasync function saveSession(session: UserSession): Promise\u003Cvoid> {\n  const serialized = JSON.stringify(session);\n  await SecureStore.setItemAsync('userSession', serialized);\n}\n\nasync function getSession(): Promise\u003CUserSession | null> {\n  const serialized = await SecureStore.getItemAsync('userSession');\n  if (!serialized) return null;\n  \n  try {\n    return JSON.parse(serialized) as UserSession;\n  } catch {\n    \u002F\u002F Corrupted data\n    await SecureStore.deleteItemAsync('userSession');\n    return null;\n  }\n}\n",[3782,5583,5584,5593,5604,5615,5626,5637,5641,5645,5674,5697,5719,5723,5727,5750,5772,5791,5796,5802,5827,5835,5840,5856,5864,5868],{"__ignoreMap":3865},[3946,5585,5586,5588,5591],{"class":3948,"line":3949},[3946,5587,4801],{"class":4255},[3946,5589,5590],{"class":4403}," UserSession",[3946,5592,4427],{"class":3952},[3946,5594,5595,5598,5600,5602],{"class":3948,"line":3956},[3946,5596,5597],{"class":4262},"  accessToken",[3946,5599,3963],{"class":3952},[3946,5601,4404],{"class":4403},[3946,5603,4272],{"class":3952},[3946,5605,5606,5609,5611,5613],{"class":3948,"line":3973},[3946,5607,5608],{"class":4262},"  refreshToken",[3946,5610,3963],{"class":3952},[3946,5612,4404],{"class":4403},[3946,5614,4272],{"class":3952},[3946,5616,5617,5620,5622,5624],{"class":3948,"line":3986},[3946,5618,5619],{"class":4262},"  expiresAt",[3946,5621,3963],{"class":3952},[3946,5623,4832],{"class":4403},[3946,5625,4272],{"class":3952},[3946,5627,5628,5631,5633,5635],{"class":3948,"line":3999},[3946,5629,5630],{"class":4262},"  userId",[3946,5632,3963],{"class":3952},[3946,5634,4404],{"class":4403},[3946,5636,4272],{"class":3952},[3946,5638,5639],{"class":3948,"line":4012},[3946,5640,4040],{"class":3952},[3946,5642,5643],{"class":3948,"line":4026},[3946,5644,4278],{"emptyLinePlaceholder":4277},[3946,5646,5647,5649,5651,5654,5656,5659,5661,5664,5666,5668,5670,5672],{"class":3948,"line":4037},[3946,5648,4387],{"class":4255},[3946,5650,4390],{"class":4255},[3946,5652,5653],{"class":4224}," saveSession",[3946,5655,4331],{"class":3952},[3946,5657,5658],{"class":4262},"session",[3946,5660,3963],{"class":3952},[3946,5662,5663],{"class":4403},"UserSession",[3946,5665,4407],{"class":3952},[3946,5667,4410],{"class":4403},[3946,5669,4413],{"class":3952},[3946,5671,4416],{"class":4403},[3946,5673,4419],{"class":3952},[3946,5675,5676,5678,5681,5683,5686,5688,5691,5693,5695],{"class":3948,"line":4487},[3946,5677,5018],{"class":4255},[3946,5679,5680],{"class":4286}," serialized",[3946,5682,4290],{"class":3952},[3946,5684,5685],{"class":4286},"JSON",[3946,5687,4298],{"class":3952},[3946,5689,5690],{"class":4224},"stringify",[3946,5692,4331],{"class":3952},[3946,5694,5658],{"class":4262},[3946,5696,4337],{"class":3952},[3946,5698,5699,5701,5703,5705,5707,5709,5712,5714,5717],{"class":3948,"line":4507},[3946,5700,4935],{"class":4251},[3946,5702,4263],{"class":4262},[3946,5704,4298],{"class":3952},[3946,5706,4439],{"class":4224},[3946,5708,4331],{"class":3952},[3946,5710,5711],{"class":3966},"'userSession'",[3946,5713,4447],{"class":3952},[3946,5715,5716],{"class":4262},"serialized",[3946,5718,4337],{"class":3952},[3946,5720,5721],{"class":3948,"line":4518},[3946,5722,4040],{"class":3952},[3946,5724,5725],{"class":3948,"line":4524},[3946,5726,4278],{"emptyLinePlaceholder":4277},[3946,5728,5729,5731,5733,5736,5738,5740,5742,5744,5746,5748],{"class":3948,"line":4529},[3946,5730,4387],{"class":4255},[3946,5732,4390],{"class":4255},[3946,5734,5735],{"class":4224}," getSession",[3946,5737,4550],{"class":3952},[3946,5739,4410],{"class":4403},[3946,5741,4413],{"class":3952},[3946,5743,5663],{"class":4403},[3946,5745,4559],{"class":3952},[3946,5747,4562],{"class":4403},[3946,5749,4419],{"class":3952},[3946,5751,5752,5754,5756,5758,5760,5762,5764,5766,5768,5770],{"class":3948,"line":4534},[3946,5753,5018],{"class":4255},[3946,5755,5680],{"class":4286},[3946,5757,4290],{"class":3952},[3946,5759,4293],{"class":4251},[3946,5761,4263],{"class":4262},[3946,5763,4298],{"class":3952},[3946,5765,4591],{"class":4224},[3946,5767,4331],{"class":3952},[3946,5769,5711],{"class":3966},[3946,5771,4337],{"class":3952},[3946,5773,5774,5777,5779,5781,5784,5787,5789],{"class":3948,"line":4540},[3946,5775,5776],{"class":4251},"  if",[3946,5778,4312],{"class":3952},[3946,5780,5716],{"class":4262},[3946,5782,5783],{"class":3952},") ",[3946,5785,5786],{"class":4251},"return",[3946,5788,4648],{"class":4255},[3946,5790,4272],{"class":3952},[3946,5792,5793],{"class":3948,"line":4567},[3946,5794,5795],{"class":3952},"  \n",[3946,5797,5798,5800],{"class":3948,"line":4574},[3946,5799,4424],{"class":4251},[3946,5801,4427],{"class":3952},[3946,5803,5804,5806,5809,5811,5814,5816,5818,5820,5823,5825],{"class":3948,"line":4600},[3946,5805,4603],{"class":4251},[3946,5807,5808],{"class":4286}," JSON",[3946,5810,4298],{"class":3952},[3946,5812,5813],{"class":4224},"parse",[3946,5815,4331],{"class":3952},[3946,5817,5716],{"class":4262},[3946,5819,5783],{"class":3952},[3946,5821,5822],{"class":4251},"as",[3946,5824,5590],{"class":4403},[3946,5826,4272],{"class":3952},[3946,5828,5829,5831,5833],{"class":3948,"line":4610},[3946,5830,4473],{"class":3952},[3946,5832,4476],{"class":4251},[3946,5834,4427],{"class":3952},[3946,5836,5837],{"class":3948,"line":4623},[3946,5838,5839],{"class":4342},"    \u002F\u002F Corrupted data\n",[3946,5841,5842,5844,5846,5848,5850,5852,5854],{"class":3948,"line":4643},[3946,5843,4432],{"class":4251},[3946,5845,4263],{"class":4262},[3946,5847,4298],{"class":3952},[3946,5849,4710],{"class":4224},[3946,5851,4331],{"class":3952},[3946,5853,5711],{"class":3966},[3946,5855,4337],{"class":3952},[3946,5857,5858,5860,5862],{"class":3948,"line":4653},[3946,5859,4603],{"class":4251},[3946,5861,4648],{"class":4255},[3946,5863,4272],{"class":3952},[3946,5865,5866],{"class":3948,"line":4658},[3946,5867,4521],{"class":3952},[3946,5869,5870],{"class":3948,"line":4663},[3946,5871,4040],{"class":3952},[3765,5873,5874],{"start":3986},[3768,5875,5876],{},[3771,5877,5878],{},"Використовуйте namespace для ключів:",[3857,5880,5882],{"className":4242,"code":5881,"language":4244,"meta":3865,"style":3865},"const STORAGE_KEYS = {\n  AUTH_TOKEN: '@app\u002Fauth\u002Ftoken',\n  REFRESH_TOKEN: '@app\u002Fauth\u002Frefresh',\n  USER_ID: '@app\u002Fauth\u002FuserId',\n} as const;\n\n\u002F\u002F Використання\nawait SecureStore.setItemAsync(STORAGE_KEYS.AUTH_TOKEN, token);\n",[3782,5883,5884,5894,5904,5914,5924,5936,5940,5945],{"__ignoreMap":3865},[3946,5885,5886,5888,5891],{"class":3948,"line":3949},[3946,5887,4283],{"class":4255},[3946,5889,5890],{"class":4286}," STORAGE_KEYS",[3946,5892,5893],{"class":3952}," = {\n",[3946,5895,5896,5899,5902],{"class":3948,"line":3956},[3946,5897,5898],{"class":4262},"  AUTH_TOKEN:",[3946,5900,5901],{"class":3966}," '@app\u002Fauth\u002Ftoken'",[3946,5903,3970],{"class":3952},[3946,5905,5906,5909,5912],{"class":3948,"line":3973},[3946,5907,5908],{"class":4262},"  REFRESH_TOKEN:",[3946,5910,5911],{"class":3966}," '@app\u002Fauth\u002Frefresh'",[3946,5913,3970],{"class":3952},[3946,5915,5916,5919,5922],{"class":3948,"line":3986},[3946,5917,5918],{"class":4262},"  USER_ID:",[3946,5920,5921],{"class":3966}," '@app\u002Fauth\u002FuserId'",[3946,5923,3970],{"class":3952},[3946,5925,5926,5929,5931,5934],{"class":3948,"line":3999},[3946,5927,5928],{"class":3952},"} ",[3946,5930,5822],{"class":4251},[3946,5932,5933],{"class":4255}," const",[3946,5935,4272],{"class":3952},[3946,5937,5938],{"class":3948,"line":4012},[3946,5939,4278],{"emptyLinePlaceholder":4277},[3946,5941,5942],{"class":3948,"line":4026},[3946,5943,5944],{"class":4342},"\u002F\u002F Використання\n",[3946,5946,5947,5949,5951,5953,5955,5957,5960,5962,5965,5967,5969],{"class":3948,"line":4037},[3946,5948,4293],{"class":4251},[3946,5950,4263],{"class":4262},[3946,5952,4298],{"class":3952},[3946,5954,4439],{"class":4224},[3946,5956,4331],{"class":3952},[3946,5958,5959],{"class":4286},"STORAGE_KEYS",[3946,5961,4298],{"class":3952},[3946,5963,5964],{"class":4286},"AUTH_TOKEN",[3946,5966,4447],{"class":3952},[3946,5968,4398],{"class":4262},[3946,5970,4337],{"class":3952},[3811,5972],{},[3738,5974,5976],{"id":5975},"розділ-3-архітектура-системи-автентифікації","Розділ 3: Архітектура Системи Автентифікації",[3750,5978,5980],{"id":5979},"_31-структура-проєкту","3.1. Структура Проєкту",[3743,5982,5983],{},"Перш ніж писати код, важливо спланувати архітектуру. Ось рекомендована структура для системи автентифікації:",[3857,5985,5988],{"className":5986,"code":5987,"language":3862},[3860],"src\u002F\n├── features\u002F\n│   └── auth\u002F\n│       ├── api\u002F\n│       │   └── authApi.ts           # HTTP запити до API\n│       ├── components\u002F\n│       │   ├── LoginForm.tsx        # Форма входу\n│       │   └── ProtectedRoute.tsx   # HOC для захищених екранів\n│       ├── context\u002F\n│       │   └── AuthContext.tsx      # Глобальний стан автентифікації\n│       ├── hooks\u002F\n│       │   ├── useAuth.ts           # Hook для доступу до контексту\n│       │   └── useProtectedRoute.ts # Hook для захисту маршрутів\n│       ├── services\u002F\n│       │   └── tokenService.ts      # Робота з SecureStore\n│       ├── types\u002F\n│       │   └── auth.types.ts        # TypeScript типи\n│       └── utils\u002F\n│           ├── tokenValidator.ts    # Валідація JWT\n│           └── authErrors.ts        # Кастомні помилки\n├── navigation\u002F\n│   ├── AuthNavigator.tsx            # Стек для неавторизованих\n│   ├── AppNavigator.tsx             # Стек для авторизованих\n│   └── RootNavigator.tsx            # Головний навігатор\n└── App.tsx\n",[3782,5989,5987],{"__ignoreMap":3865},[3750,5991,5993],{"id":5992},"_32-typescript-типи","3.2. TypeScript Типи",[3743,5995,5996],{},"Почнемо з визначення типів — це забезпечить type safety і зробить код самодокументованим:",[3857,5998,6000],{"className":4242,"code":5999,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Ftypes\u002Fauth.types.ts\n\n\u002F**\n * Дані користувача після автентифікації\n *\u002F\nexport interface User {\n  id: string;\n  email: string;\n  name: string;\n  avatar?: string;\n  role: 'user' | 'admin' | 'moderator';\n}\n\n\u002F**\n * Credentials для входу\n *\u002F\nexport interface LoginCredentials {\n  email: string;\n  password: string;\n}\n\n\u002F**\n * Credentials для реєстрації\n *\u002F\nexport interface RegisterCredentials extends LoginCredentials {\n  name: string;\n  confirmPassword: string;\n}\n\n\u002F**\n * Відповідь API після успішної автентифікації\n *\u002F\nexport interface AuthResponse {\n  user: User;\n  accessToken: string;\n  refreshToken: string;\n  expiresIn: number; \u002F\u002F Секунди до закінчення терміну дії\n}\n\n\u002F**\n * Стан автентифікації в контексті\n *\u002F\nexport interface AuthState {\n  user: User | null;\n  isAuthenticated: boolean;\n  isLoading: boolean;\n  error: string | null;\n}\n\n\u002F**\n * Дії контексту автентифікації\n *\u002F\nexport interface AuthContextValue extends AuthState {\n  login: (credentials: LoginCredentials) => Promise\u003Cvoid>;\n  register: (credentials: RegisterCredentials) => Promise\u003Cvoid>;\n  logout: () => Promise\u003Cvoid>;\n  refreshSession: () => Promise\u003Cvoid>;\n  clearError: () => void;\n}\n\n\u002F**\n * Кастомні помилки автентифікації\n *\u002F\nexport class AuthError extends Error {\n  constructor(\n    message: string,\n    public code: 'INVALID_CREDENTIALS' | 'NETWORK_ERROR' | 'TOKEN_EXPIRED' | 'UNKNOWN',\n    public statusCode?: number\n  ) {\n    super(message);\n    this.name = 'AuthError';\n  }\n}\n\n\u002F**\n * Токени збережені в SecureStore\n *\u002F\nexport interface StoredTokens {\n  accessToken: string;\n  refreshToken: string;\n  expiresAt: number; \u002F\u002F Unix timestamp\n}\n",[3782,6001,6002,6007,6011,6016,6021,6026,6039,6050,6061,6072,6083,6105,6109,6113,6117,6122,6126,6137,6147,6158,6162,6166,6170,6175,6179,6195,6205,6216,6220,6224,6228,6233,6237,6248,6260,6271,6282,6297,6302,6307,6312,6318,6323,6335,6350,6362,6374,6390,6395,6400,6405,6411,6416,6432,6464,6491,6510,6528,6543,6548,6553,6558,6564,6569,6586,6595,6607,6638,6651,6657,6669,6687,6692,6697,6702,6707,6713,6718,6730,6741,6752,6766],{"__ignoreMap":3865},[3946,6003,6004],{"class":3948,"line":3949},[3946,6005,6006],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Ftypes\u002Fauth.types.ts\n",[3946,6008,6009],{"class":3948,"line":3956},[3946,6010,4278],{"emptyLinePlaceholder":4277},[3946,6012,6013],{"class":3948,"line":3973},[3946,6014,6015],{"class":4342},"\u002F**\n",[3946,6017,6018],{"class":3948,"line":3986},[3946,6019,6020],{"class":4342}," * Дані користувача після автентифікації\n",[3946,6022,6023],{"class":3948,"line":3999},[3946,6024,6025],{"class":4342}," *\u002F\n",[3946,6027,6028,6031,6034,6037],{"class":3948,"line":4012},[3946,6029,6030],{"class":4251},"export",[3946,6032,6033],{"class":4255}," interface",[3946,6035,6036],{"class":4403}," User",[3946,6038,4427],{"class":3952},[3946,6040,6041,6044,6046,6048],{"class":3948,"line":4026},[3946,6042,6043],{"class":4262},"  id",[3946,6045,3963],{"class":3952},[3946,6047,4404],{"class":4403},[3946,6049,4272],{"class":3952},[3946,6051,6052,6055,6057,6059],{"class":3948,"line":4037},[3946,6053,6054],{"class":4262},"  email",[3946,6056,3963],{"class":3952},[3946,6058,4404],{"class":4403},[3946,6060,4272],{"class":3952},[3946,6062,6063,6066,6068,6070],{"class":3948,"line":4487},[3946,6064,6065],{"class":4262},"  name",[3946,6067,3963],{"class":3952},[3946,6069,4404],{"class":4403},[3946,6071,4272],{"class":3952},[3946,6073,6074,6077,6079,6081],{"class":3948,"line":4507},[3946,6075,6076],{"class":4262},"  avatar",[3946,6078,4814],{"class":3952},[3946,6080,4404],{"class":4403},[3946,6082,4272],{"class":3952},[3946,6084,6085,6088,6090,6093,6095,6098,6100,6103],{"class":3948,"line":4518},[3946,6086,6087],{"class":4262},"  role",[3946,6089,3963],{"class":3952},[3946,6091,6092],{"class":3966},"'user'",[3946,6094,4559],{"class":3952},[3946,6096,6097],{"class":3966},"'admin'",[3946,6099,4559],{"class":3952},[3946,6101,6102],{"class":3966},"'moderator'",[3946,6104,4272],{"class":3952},[3946,6106,6107],{"class":3948,"line":4524},[3946,6108,4040],{"class":3952},[3946,6110,6111],{"class":3948,"line":4529},[3946,6112,4278],{"emptyLinePlaceholder":4277},[3946,6114,6115],{"class":3948,"line":4534},[3946,6116,6015],{"class":4342},[3946,6118,6119],{"class":3948,"line":4540},[3946,6120,6121],{"class":4342}," * Credentials для входу\n",[3946,6123,6124],{"class":3948,"line":4567},[3946,6125,6025],{"class":4342},[3946,6127,6128,6130,6132,6135],{"class":3948,"line":4574},[3946,6129,6030],{"class":4251},[3946,6131,6033],{"class":4255},[3946,6133,6134],{"class":4403}," LoginCredentials",[3946,6136,4427],{"class":3952},[3946,6138,6139,6141,6143,6145],{"class":3948,"line":4600},[3946,6140,6054],{"class":4262},[3946,6142,3963],{"class":3952},[3946,6144,4404],{"class":4403},[3946,6146,4272],{"class":3952},[3946,6148,6149,6152,6154,6156],{"class":3948,"line":4610},[3946,6150,6151],{"class":4262},"  password",[3946,6153,3963],{"class":3952},[3946,6155,4404],{"class":4403},[3946,6157,4272],{"class":3952},[3946,6159,6160],{"class":3948,"line":4623},[3946,6161,4040],{"class":3952},[3946,6163,6164],{"class":3948,"line":4643},[3946,6165,4278],{"emptyLinePlaceholder":4277},[3946,6167,6168],{"class":3948,"line":4653},[3946,6169,6015],{"class":4342},[3946,6171,6172],{"class":3948,"line":4658},[3946,6173,6174],{"class":4342}," * Credentials для реєстрації\n",[3946,6176,6177],{"class":3948,"line":4663},[3946,6178,6025],{"class":4342},[3946,6180,6181,6183,6185,6188,6191,6193],{"class":3948,"line":4668},[3946,6182,6030],{"class":4251},[3946,6184,6033],{"class":4255},[3946,6186,6187],{"class":4403}," RegisterCredentials",[3946,6189,6190],{"class":4255}," extends",[3946,6192,6134],{"class":4403},[3946,6194,4427],{"class":3952},[3946,6196,6197,6199,6201,6203],{"class":3948,"line":4674},[3946,6198,6065],{"class":4262},[3946,6200,3963],{"class":3952},[3946,6202,4404],{"class":4403},[3946,6204,4272],{"class":3952},[3946,6206,6207,6210,6212,6214],{"class":3948,"line":4694},[3946,6208,6209],{"class":4262},"  confirmPassword",[3946,6211,3963],{"class":3952},[3946,6213,4404],{"class":4403},[3946,6215,4272],{"class":3952},[3946,6217,6218],{"class":3948,"line":4701},[3946,6219,4040],{"class":3952},[3946,6221,6222],{"class":3948,"line":4719},[3946,6223,4278],{"emptyLinePlaceholder":4277},[3946,6225,6226],{"class":3948,"line":4735},[3946,6227,6015],{"class":4342},[3946,6229,6230],{"class":3948,"line":4748},[3946,6231,6232],{"class":4342}," * Відповідь API після успішної автентифікації\n",[3946,6234,6235],{"class":3948,"line":4768},[3946,6236,6025],{"class":4342},[3946,6238,6239,6241,6243,6246],{"class":3948,"line":4777},[3946,6240,6030],{"class":4251},[3946,6242,6033],{"class":4255},[3946,6244,6245],{"class":4403}," AuthResponse",[3946,6247,4427],{"class":3952},[3946,6249,6250,6253,6255,6258],{"class":3948,"line":4782},[3946,6251,6252],{"class":4262},"  user",[3946,6254,3963],{"class":3952},[3946,6256,6257],{"class":4403},"User",[3946,6259,4272],{"class":3952},[3946,6261,6263,6265,6267,6269],{"class":3948,"line":6262},35,[3946,6264,5597],{"class":4262},[3946,6266,3963],{"class":3952},[3946,6268,4404],{"class":4403},[3946,6270,4272],{"class":3952},[3946,6272,6274,6276,6278,6280],{"class":3948,"line":6273},36,[3946,6275,5608],{"class":4262},[3946,6277,3963],{"class":3952},[3946,6279,4404],{"class":4403},[3946,6281,4272],{"class":3952},[3946,6283,6285,6288,6290,6292,6294],{"class":3948,"line":6284},37,[3946,6286,6287],{"class":4262},"  expiresIn",[3946,6289,3963],{"class":3952},[3946,6291,4832],{"class":4403},[3946,6293,4851],{"class":3952},[3946,6295,6296],{"class":4342},"\u002F\u002F Секунди до закінчення терміну дії\n",[3946,6298,6300],{"class":3948,"line":6299},38,[3946,6301,4040],{"class":3952},[3946,6303,6305],{"class":3948,"line":6304},39,[3946,6306,4278],{"emptyLinePlaceholder":4277},[3946,6308,6310],{"class":3948,"line":6309},40,[3946,6311,6015],{"class":4342},[3946,6313,6315],{"class":3948,"line":6314},41,[3946,6316,6317],{"class":4342}," * Стан автентифікації в контексті\n",[3946,6319,6321],{"class":3948,"line":6320},42,[3946,6322,6025],{"class":4342},[3946,6324,6326,6328,6330,6333],{"class":3948,"line":6325},43,[3946,6327,6030],{"class":4251},[3946,6329,6033],{"class":4255},[3946,6331,6332],{"class":4403}," AuthState",[3946,6334,4427],{"class":3952},[3946,6336,6338,6340,6342,6344,6346,6348],{"class":3948,"line":6337},44,[3946,6339,6252],{"class":4262},[3946,6341,3963],{"class":3952},[3946,6343,6257],{"class":4403},[3946,6345,4559],{"class":3952},[3946,6347,4562],{"class":4403},[3946,6349,4272],{"class":3952},[3946,6351,6353,6356,6358,6360],{"class":3948,"line":6352},45,[3946,6354,6355],{"class":4262},"  isAuthenticated",[3946,6357,3963],{"class":3952},[3946,6359,4848],{"class":4403},[3946,6361,4272],{"class":3952},[3946,6363,6365,6368,6370,6372],{"class":3948,"line":6364},46,[3946,6366,6367],{"class":4262},"  isLoading",[3946,6369,3963],{"class":3952},[3946,6371,4848],{"class":4403},[3946,6373,4272],{"class":3952},[3946,6375,6377,6380,6382,6384,6386,6388],{"class":3948,"line":6376},47,[3946,6378,6379],{"class":4262},"  error",[3946,6381,3963],{"class":3952},[3946,6383,4404],{"class":4403},[3946,6385,4559],{"class":3952},[3946,6387,4562],{"class":4403},[3946,6389,4272],{"class":3952},[3946,6391,6393],{"class":3948,"line":6392},48,[3946,6394,4040],{"class":3952},[3946,6396,6398],{"class":3948,"line":6397},49,[3946,6399,4278],{"emptyLinePlaceholder":4277},[3946,6401,6403],{"class":3948,"line":6402},50,[3946,6404,6015],{"class":4342},[3946,6406,6408],{"class":3948,"line":6407},51,[3946,6409,6410],{"class":4342}," * Дії контексту автентифікації\n",[3946,6412,6414],{"class":3948,"line":6413},52,[3946,6415,6025],{"class":4342},[3946,6417,6419,6421,6423,6426,6428,6430],{"class":3948,"line":6418},53,[3946,6420,6030],{"class":4251},[3946,6422,6033],{"class":4255},[3946,6424,6425],{"class":4403}," AuthContextValue",[3946,6427,6190],{"class":4255},[3946,6429,6332],{"class":4403},[3946,6431,4427],{"class":3952},[3946,6433,6435,6438,6441,6444,6446,6449,6451,6454,6457,6459,6461],{"class":3948,"line":6434},54,[3946,6436,6437],{"class":4224},"  login",[3946,6439,6440],{"class":3952},": (",[3946,6442,6443],{"class":4262},"credentials",[3946,6445,3963],{"class":3952},[3946,6447,6448],{"class":4403},"LoginCredentials",[3946,6450,5783],{"class":3952},[3946,6452,6453],{"class":4255},"=>",[3946,6455,6456],{"class":4403}," Promise",[3946,6458,4413],{"class":3952},[3946,6460,4416],{"class":4403},[3946,6462,6463],{"class":3952},">;\n",[3946,6465,6467,6470,6472,6474,6476,6479,6481,6483,6485,6487,6489],{"class":3948,"line":6466},55,[3946,6468,6469],{"class":4224},"  register",[3946,6471,6440],{"class":3952},[3946,6473,6443],{"class":4262},[3946,6475,3963],{"class":3952},[3946,6477,6478],{"class":4403},"RegisterCredentials",[3946,6480,5783],{"class":3952},[3946,6482,6453],{"class":4255},[3946,6484,6456],{"class":4403},[3946,6486,4413],{"class":3952},[3946,6488,4416],{"class":4403},[3946,6490,6463],{"class":3952},[3946,6492,6494,6497,6500,6502,6504,6506,6508],{"class":3948,"line":6493},56,[3946,6495,6496],{"class":4224},"  logout",[3946,6498,6499],{"class":3952},": () ",[3946,6501,6453],{"class":4255},[3946,6503,6456],{"class":4403},[3946,6505,4413],{"class":3952},[3946,6507,4416],{"class":4403},[3946,6509,6463],{"class":3952},[3946,6511,6513,6516,6518,6520,6522,6524,6526],{"class":3948,"line":6512},57,[3946,6514,6515],{"class":4224},"  refreshSession",[3946,6517,6499],{"class":3952},[3946,6519,6453],{"class":4255},[3946,6521,6456],{"class":4403},[3946,6523,4413],{"class":3952},[3946,6525,4416],{"class":4403},[3946,6527,6463],{"class":3952},[3946,6529,6531,6534,6536,6538,6541],{"class":3948,"line":6530},58,[3946,6532,6533],{"class":4224},"  clearError",[3946,6535,6499],{"class":3952},[3946,6537,6453],{"class":4255},[3946,6539,6540],{"class":4403}," void",[3946,6542,4272],{"class":3952},[3946,6544,6546],{"class":3948,"line":6545},59,[3946,6547,4040],{"class":3952},[3946,6549,6551],{"class":3948,"line":6550},60,[3946,6552,4278],{"emptyLinePlaceholder":4277},[3946,6554,6556],{"class":3948,"line":6555},61,[3946,6557,6015],{"class":4342},[3946,6559,6561],{"class":3948,"line":6560},62,[3946,6562,6563],{"class":4342}," * Кастомні помилки автентифікації\n",[3946,6565,6567],{"class":3948,"line":6566},63,[3946,6568,6025],{"class":4342},[3946,6570,6572,6574,6577,6580,6582,6584],{"class":3948,"line":6571},64,[3946,6573,6030],{"class":4251},[3946,6575,6576],{"class":4255}," class",[3946,6578,6579],{"class":4403}," AuthError",[3946,6581,6190],{"class":4255},[3946,6583,5513],{"class":4403},[3946,6585,4427],{"class":3952},[3946,6587,6589,6592],{"class":3948,"line":6588},65,[3946,6590,6591],{"class":4255},"  constructor",[3946,6593,6594],{"class":3952},"(\n",[3946,6596,6598,6601,6603,6605],{"class":3948,"line":6597},66,[3946,6599,6600],{"class":4262},"    message",[3946,6602,3963],{"class":3952},[3946,6604,4404],{"class":4403},[3946,6606,3970],{"class":3952},[3946,6608,6610,6613,6616,6618,6621,6623,6626,6628,6631,6633,6636],{"class":3948,"line":6609},67,[3946,6611,6612],{"class":4255},"    public",[3946,6614,6615],{"class":4262}," code",[3946,6617,3963],{"class":3952},[3946,6619,6620],{"class":3966},"'INVALID_CREDENTIALS'",[3946,6622,4559],{"class":3952},[3946,6624,6625],{"class":3966},"'NETWORK_ERROR'",[3946,6627,4559],{"class":3952},[3946,6629,6630],{"class":3966},"'TOKEN_EXPIRED'",[3946,6632,4559],{"class":3952},[3946,6634,6635],{"class":3966},"'UNKNOWN'",[3946,6637,3970],{"class":3952},[3946,6639,6641,6643,6646,6648],{"class":3948,"line":6640},68,[3946,6642,6612],{"class":4255},[3946,6644,6645],{"class":4262}," statusCode",[3946,6647,4814],{"class":3952},[3946,6649,6650],{"class":4403},"number\n",[3946,6652,6654],{"class":3948,"line":6653},69,[3946,6655,6656],{"class":3952},"  ) {\n",[3946,6658,6660,6663,6665,6667],{"class":3948,"line":6659},70,[3946,6661,6662],{"class":4255},"    super",[3946,6664,4331],{"class":3952},[3946,6666,5543],{"class":4262},[3946,6668,4337],{"class":3952},[3946,6670,6672,6675,6677,6680,6682,6685],{"class":3948,"line":6671},71,[3946,6673,6674],{"class":4255},"    this",[3946,6676,4298],{"class":3952},[3946,6678,6679],{"class":4262},"name",[3946,6681,4290],{"class":3952},[3946,6683,6684],{"class":3966},"'AuthError'",[3946,6686,4272],{"class":3952},[3946,6688,6690],{"class":3948,"line":6689},72,[3946,6691,4521],{"class":3952},[3946,6693,6695],{"class":3948,"line":6694},73,[3946,6696,4040],{"class":3952},[3946,6698,6700],{"class":3948,"line":6699},74,[3946,6701,4278],{"emptyLinePlaceholder":4277},[3946,6703,6705],{"class":3948,"line":6704},75,[3946,6706,6015],{"class":4342},[3946,6708,6710],{"class":3948,"line":6709},76,[3946,6711,6712],{"class":4342}," * Токени збережені в SecureStore\n",[3946,6714,6716],{"class":3948,"line":6715},77,[3946,6717,6025],{"class":4342},[3946,6719,6721,6723,6725,6728],{"class":3948,"line":6720},78,[3946,6722,6030],{"class":4251},[3946,6724,6033],{"class":4255},[3946,6726,6727],{"class":4403}," StoredTokens",[3946,6729,4427],{"class":3952},[3946,6731,6733,6735,6737,6739],{"class":3948,"line":6732},79,[3946,6734,5597],{"class":4262},[3946,6736,3963],{"class":3952},[3946,6738,4404],{"class":4403},[3946,6740,4272],{"class":3952},[3946,6742,6744,6746,6748,6750],{"class":3948,"line":6743},80,[3946,6745,5608],{"class":4262},[3946,6747,3963],{"class":3952},[3946,6749,4404],{"class":4403},[3946,6751,4272],{"class":3952},[3946,6753,6755,6757,6759,6761,6763],{"class":3948,"line":6754},81,[3946,6756,5619],{"class":4262},[3946,6758,3963],{"class":3952},[3946,6760,4832],{"class":4403},[3946,6762,4851],{"class":3952},[3946,6764,6765],{"class":4342},"\u002F\u002F Unix timestamp\n",[3946,6767,6769],{"class":3948,"line":6768},82,[3946,6770,4040],{"class":3952},[3750,6772,6774],{"id":6773},"_33-token-service-абстракція-над-securestore","3.3. Token Service — Абстракція над SecureStore",[3743,6776,6777],{},"Створимо сервіс для централізованої роботи з токенами:",[3857,6779,6781],{"className":4242,"code":6780,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService.ts\n\nimport * as SecureStore from 'expo-secure-store';\nimport type { StoredTokens } from '..\u002Ftypes\u002Fauth.types';\n\n\u002F**\n * Ключі для SecureStore\n *\u002F\nconst STORAGE_KEYS = {\n  TOKENS: '@secure-notes\u002Ftokens',\n} as const;\n\n\u002F**\n * Сервіс для роботи з токенами в захищеному сховищі\n *\u002F\nclass TokenService {\n  \u002F**\n   * Збереження токенів\n   *\u002F\n  async saveTokens(\n    accessToken: string,\n    refreshToken: string,\n    expiresIn: number\n  ): Promise\u003Cvoid> {\n    try {\n      const tokens: StoredTokens = {\n        accessToken,\n        refreshToken,\n        expiresAt: Date.now() + expiresIn * 1000,\n      };\n\n      const serialized = JSON.stringify(tokens);\n      await SecureStore.setItemAsync(STORAGE_KEYS.TOKENS, serialized);\n      \n      console.log('✅ Токени збережено у SecureStore');\n    } catch (error) {\n      console.error('❌ Помилка збереження токенів:', error);\n      throw new Error('Не вдалося зберегти токени автентифікації');\n    }\n  }\n\n  \u002F**\n   * Отримання збережених токенів\n   *\u002F\n  async getTokens(): Promise\u003CStoredTokens | null> {\n    try {\n      const serialized = await SecureStore.getItemAsync(STORAGE_KEYS.TOKENS);\n      \n      if (!serialized) {\n        console.log('ℹ️ Токени не знайдено');\n        return null;\n      }\n\n      const tokens = JSON.parse(serialized) as StoredTokens;\n      \n      \u002F\u002F Перевірка на валідність структури\n      if (!tokens.accessToken || !tokens.refreshToken || !tokens.expiresAt) {\n        console.warn('⚠️ Невалідна структура токенів, видаляємо');\n        await this.clearTokens();\n        return null;\n      }\n\n      return tokens;\n    } catch (error) {\n      console.error('❌ Помилка читання токенів:', error);\n      \u002F\u002F Corrupted data — видаляємо\n      await this.clearTokens();\n      return null;\n    }\n  }\n\n  \u002F**\n   * Отримання лише access token\n   *\u002F\n  async getAccessToken(): Promise\u003Cstring | null> {\n    const tokens = await this.getTokens();\n    return tokens?.accessToken ?? null;\n  }\n\n  \u002F**\n   * Перевірка чи токен валідний (не закінчився)\n   *\u002F\n  async isTokenValid(): Promise\u003Cboolean> {\n    const tokens = await this.getTokens();\n    \n    if (!tokens) return false;\n\n    \u002F\u002F Додаємо буфер 60 секунд перед закінченням\n    const isValid = tokens.expiresAt > Date.now() + 60000;\n    \n    if (!isValid) {\n      console.log('⏰ Токен закінчився');\n    }\n    \n    return isValid;\n  }\n\n  \u002F**\n   * Оновлення access token (після refresh)\n   *\u002F\n  async updateAccessToken(\n    newAccessToken: string,\n    expiresIn: number\n  ): Promise\u003Cvoid> {\n    const tokens = await this.getTokens();\n    \n    if (!tokens) {\n      throw new Error('Неможливо оновити токен: поточні токени не знайдено');\n    }\n\n    await this.saveTokens(newAccessToken, tokens.refreshToken, expiresIn);\n  }\n\n  \u002F**\n   * Видалення токенів (logout)\n   *\u002F\n  async clearTokens(): Promise\u003Cvoid> {\n    try {\n      await SecureStore.deleteItemAsync(STORAGE_KEYS.TOKENS);\n      console.log('🗑️ Токени видалено');\n    } catch (error) {\n      console.error('❌ Помилка видалення токенів:', error);\n      \u002F\u002F Не критично, можна проігнорувати\n    }\n  }\n\n  \u002F**\n   * Отримання часу до закінчення токену (в секундах)\n   *\u002F\n  async getTimeUntilExpiry(): Promise\u003Cnumber | null> {\n    const tokens = await this.getTokens();\n    \n    if (!tokens) return null;\n\n    const timeLeft = Math.floor((tokens.expiresAt - Date.now()) \u002F 1000);\n    return Math.max(0, timeLeft);\n  }\n}\n\n\u002F\u002F Singleton instance\nexport const tokenService = new TokenService();\n",[3782,6782,6783,6788,6792,6808,6832,6836,6840,6845,6849,6857,6867,6877,6881,6885,6890,6894,6904,6909,6914,6919,6929,6940,6951,6960,6973,6980,6994,7001,7008,7035,7040,7044,7065,7091,7096,7111,7124,7143,7160,7164,7168,7172,7176,7181,7185,7206,7212,7238,7242,7253,7269,7278,7283,7287,7313,7317,7322,7355,7370,7385,7393,7397,7401,7410,7422,7441,7446,7458,7466,7470,7474,7478,7482,7487,7491,7512,7531,7549,7553,7557,7561,7566,7570,7588,7607,7613,7631,7636,7642,7675,7680,7692,7708,7713,7718,7727,7732,7737,7742,7748,7753,7763,7775,7784,7797,7816,7821,7832,7848,7853,7858,7889,7894,7899,7904,7910,7915,7933,7940,7961,7977,7990,8010,8016,8021,8026,8031,8036,8042,8047,8069,8088,8093,8110,8115,8158,8183,8188,8193,8198,8204],{"__ignoreMap":3865},[3946,6784,6785],{"class":3948,"line":3949},[3946,6786,6787],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService.ts\n",[3946,6789,6790],{"class":3948,"line":3956},[3946,6791,4278],{"emptyLinePlaceholder":4277},[3946,6793,6794,6796,6798,6800,6802,6804,6806],{"class":3948,"line":3973},[3946,6795,4252],{"class":4251},[3946,6797,4256],{"class":4255},[3946,6799,4259],{"class":4251},[3946,6801,4263],{"class":4262},[3946,6803,4266],{"class":4251},[3946,6805,4269],{"class":3966},[3946,6807,4272],{"class":3952},[3946,6809,6810,6812,6815,6818,6821,6824,6827,6830],{"class":3948,"line":3986},[3946,6811,4252],{"class":4251},[3946,6813,6814],{"class":4251}," type",[3946,6816,6817],{"class":3952}," { ",[3946,6819,6820],{"class":4262},"StoredTokens",[3946,6822,6823],{"class":3952}," } ",[3946,6825,6826],{"class":4251},"from",[3946,6828,6829],{"class":3966}," '..\u002Ftypes\u002Fauth.types'",[3946,6831,4272],{"class":3952},[3946,6833,6834],{"class":3948,"line":3999},[3946,6835,4278],{"emptyLinePlaceholder":4277},[3946,6837,6838],{"class":3948,"line":4012},[3946,6839,6015],{"class":4342},[3946,6841,6842],{"class":3948,"line":4026},[3946,6843,6844],{"class":4342}," * Ключі для SecureStore\n",[3946,6846,6847],{"class":3948,"line":4037},[3946,6848,6025],{"class":4342},[3946,6850,6851,6853,6855],{"class":3948,"line":4487},[3946,6852,4283],{"class":4255},[3946,6854,5890],{"class":4286},[3946,6856,5893],{"class":3952},[3946,6858,6859,6862,6865],{"class":3948,"line":4507},[3946,6860,6861],{"class":4262},"  TOKENS:",[3946,6863,6864],{"class":3966}," '@secure-notes\u002Ftokens'",[3946,6866,3970],{"class":3952},[3946,6868,6869,6871,6873,6875],{"class":3948,"line":4518},[3946,6870,5928],{"class":3952},[3946,6872,5822],{"class":4251},[3946,6874,5933],{"class":4255},[3946,6876,4272],{"class":3952},[3946,6878,6879],{"class":3948,"line":4524},[3946,6880,4278],{"emptyLinePlaceholder":4277},[3946,6882,6883],{"class":3948,"line":4529},[3946,6884,6015],{"class":4342},[3946,6886,6887],{"class":3948,"line":4534},[3946,6888,6889],{"class":4342}," * Сервіс для роботи з токенами в захищеному сховищі\n",[3946,6891,6892],{"class":3948,"line":4540},[3946,6893,6025],{"class":4342},[3946,6895,6896,6899,6902],{"class":3948,"line":4567},[3946,6897,6898],{"class":4255},"class",[3946,6900,6901],{"class":4403}," TokenService",[3946,6903,4427],{"class":3952},[3946,6905,6906],{"class":3948,"line":4574},[3946,6907,6908],{"class":4342},"  \u002F**\n",[3946,6910,6911],{"class":3948,"line":4600},[3946,6912,6913],{"class":4342},"   * Збереження токенів\n",[3946,6915,6916],{"class":3948,"line":4610},[3946,6917,6918],{"class":4342},"   *\u002F\n",[3946,6920,6921,6924,6927],{"class":3948,"line":4623},[3946,6922,6923],{"class":4255},"  async",[3946,6925,6926],{"class":4224}," saveTokens",[3946,6928,6594],{"class":3952},[3946,6930,6931,6934,6936,6938],{"class":3948,"line":4643},[3946,6932,6933],{"class":4262},"    accessToken",[3946,6935,3963],{"class":3952},[3946,6937,4404],{"class":4403},[3946,6939,3970],{"class":3952},[3946,6941,6942,6945,6947,6949],{"class":3948,"line":4653},[3946,6943,6944],{"class":4262},"    refreshToken",[3946,6946,3963],{"class":3952},[3946,6948,4404],{"class":4403},[3946,6950,3970],{"class":3952},[3946,6952,6953,6956,6958],{"class":3948,"line":4658},[3946,6954,6955],{"class":4262},"    expiresIn",[3946,6957,3963],{"class":3952},[3946,6959,6650],{"class":4403},[3946,6961,6962,6965,6967,6969,6971],{"class":3948,"line":4663},[3946,6963,6964],{"class":3952},"  ): ",[3946,6966,4410],{"class":4403},[3946,6968,4413],{"class":3952},[3946,6970,4416],{"class":4403},[3946,6972,4419],{"class":3952},[3946,6974,6975,6978],{"class":3948,"line":4668},[3946,6976,6977],{"class":4251},"    try",[3946,6979,4427],{"class":3952},[3946,6981,6982,6985,6988,6990,6992],{"class":3948,"line":4674},[3946,6983,6984],{"class":4255},"      const",[3946,6986,6987],{"class":4286}," tokens",[3946,6989,3963],{"class":3952},[3946,6991,6820],{"class":4403},[3946,6993,5893],{"class":3952},[3946,6995,6996,6999],{"class":3948,"line":4694},[3946,6997,6998],{"class":4262},"        accessToken",[3946,7000,3970],{"class":3952},[3946,7002,7003,7006],{"class":3948,"line":4701},[3946,7004,7005],{"class":4262},"        refreshToken",[3946,7007,3970],{"class":3952},[3946,7009,7010,7013,7016,7018,7021,7024,7027,7030,7033],{"class":3948,"line":4719},[3946,7011,7012],{"class":4262},"        expiresAt:",[3946,7014,7015],{"class":4262}," Date",[3946,7017,4298],{"class":3952},[3946,7019,7020],{"class":4224},"now",[3946,7022,7023],{"class":3952},"() + ",[3946,7025,7026],{"class":4262},"expiresIn",[3946,7028,7029],{"class":3952}," * ",[3946,7031,7032],{"class":4020},"1000",[3946,7034,3970],{"class":3952},[3946,7036,7037],{"class":3948,"line":4735},[3946,7038,7039],{"class":3952},"      };\n",[3946,7041,7042],{"class":3948,"line":4748},[3946,7043,4278],{"emptyLinePlaceholder":4277},[3946,7045,7046,7048,7050,7052,7054,7056,7058,7060,7063],{"class":3948,"line":4768},[3946,7047,6984],{"class":4255},[3946,7049,5680],{"class":4286},[3946,7051,4290],{"class":3952},[3946,7053,5685],{"class":4286},[3946,7055,4298],{"class":3952},[3946,7057,5690],{"class":4224},[3946,7059,4331],{"class":3952},[3946,7061,7062],{"class":4262},"tokens",[3946,7064,4337],{"class":3952},[3946,7066,7067,7070,7072,7074,7076,7078,7080,7082,7085,7087,7089],{"class":3948,"line":4777},[3946,7068,7069],{"class":4251},"      await",[3946,7071,4263],{"class":4262},[3946,7073,4298],{"class":3952},[3946,7075,4439],{"class":4224},[3946,7077,4331],{"class":3952},[3946,7079,5959],{"class":4286},[3946,7081,4298],{"class":3952},[3946,7083,7084],{"class":4286},"TOKENS",[3946,7086,4447],{"class":3952},[3946,7088,5716],{"class":4262},[3946,7090,4337],{"class":3952},[3946,7092,7093],{"class":3948,"line":4782},[3946,7094,7095],{"class":3952},"      \n",[3946,7097,7098,7100,7102,7104,7106,7109],{"class":3948,"line":6262},[3946,7099,5525],{"class":4262},[3946,7101,4298],{"class":3952},[3946,7103,4461],{"class":4224},[3946,7105,4331],{"class":3952},[3946,7107,7108],{"class":3966},"'✅ Токени збережено у SecureStore'",[3946,7110,4337],{"class":3952},[3946,7112,7113,7116,7118,7120,7122],{"class":3948,"line":6273},[3946,7114,7115],{"class":3952},"    } ",[3946,7117,4476],{"class":4251},[3946,7119,4479],{"class":3952},[3946,7121,4482],{"class":4262},[3946,7123,4318],{"class":3952},[3946,7125,7126,7128,7130,7132,7134,7137,7139,7141],{"class":3948,"line":6284},[3946,7127,5525],{"class":4262},[3946,7129,4298],{"class":3952},[3946,7131,4482],{"class":4224},[3946,7133,4331],{"class":3952},[3946,7135,7136],{"class":3966},"'❌ Помилка збереження токенів:'",[3946,7138,4447],{"class":3952},[3946,7140,4482],{"class":4262},[3946,7142,4337],{"class":3952},[3946,7144,7145,7148,7151,7153,7155,7158],{"class":3948,"line":6299},[3946,7146,7147],{"class":4251},"      throw",[3946,7149,7150],{"class":4255}," new",[3946,7152,5513],{"class":4224},[3946,7154,4331],{"class":3952},[3946,7156,7157],{"class":3966},"'Не вдалося зберегти токени автентифікації'",[3946,7159,4337],{"class":3952},[3946,7161,7162],{"class":3948,"line":6304},[3946,7163,5550],{"class":3952},[3946,7165,7166],{"class":3948,"line":6309},[3946,7167,4521],{"class":3952},[3946,7169,7170],{"class":3948,"line":6314},[3946,7171,4278],{"emptyLinePlaceholder":4277},[3946,7173,7174],{"class":3948,"line":6320},[3946,7175,6908],{"class":4342},[3946,7177,7178],{"class":3948,"line":6325},[3946,7179,7180],{"class":4342},"   * Отримання збережених токенів\n",[3946,7182,7183],{"class":3948,"line":6337},[3946,7184,6918],{"class":4342},[3946,7186,7187,7189,7192,7194,7196,7198,7200,7202,7204],{"class":3948,"line":6352},[3946,7188,6923],{"class":4255},[3946,7190,7191],{"class":4224}," getTokens",[3946,7193,4550],{"class":3952},[3946,7195,4410],{"class":4403},[3946,7197,4413],{"class":3952},[3946,7199,6820],{"class":4403},[3946,7201,4559],{"class":3952},[3946,7203,4562],{"class":4403},[3946,7205,4419],{"class":3952},[3946,7207,7208,7210],{"class":3948,"line":6364},[3946,7209,6977],{"class":4251},[3946,7211,4427],{"class":3952},[3946,7213,7214,7216,7218,7220,7222,7224,7226,7228,7230,7232,7234,7236],{"class":3948,"line":6376},[3946,7215,6984],{"class":4255},[3946,7217,5680],{"class":4286},[3946,7219,4290],{"class":3952},[3946,7221,4293],{"class":4251},[3946,7223,4263],{"class":4262},[3946,7225,4298],{"class":3952},[3946,7227,4591],{"class":4224},[3946,7229,4331],{"class":3952},[3946,7231,5959],{"class":4286},[3946,7233,4298],{"class":3952},[3946,7235,7084],{"class":4286},[3946,7237,4337],{"class":3952},[3946,7239,7240],{"class":3948,"line":6392},[3946,7241,7095],{"class":3952},[3946,7243,7244,7247,7249,7251],{"class":3948,"line":6397},[3946,7245,7246],{"class":4251},"      if",[3946,7248,4312],{"class":3952},[3946,7250,5716],{"class":4262},[3946,7252,4318],{"class":3952},[3946,7254,7255,7258,7260,7262,7264,7267],{"class":3948,"line":6402},[3946,7256,7257],{"class":4262},"        console",[3946,7259,4298],{"class":3952},[3946,7261,4461],{"class":4224},[3946,7263,4331],{"class":3952},[3946,7265,7266],{"class":3966},"'ℹ️ Токени не знайдено'",[3946,7268,4337],{"class":3952},[3946,7270,7271,7274,7276],{"class":3948,"line":6407},[3946,7272,7273],{"class":4251},"        return",[3946,7275,4648],{"class":4255},[3946,7277,4272],{"class":3952},[3946,7279,7280],{"class":3948,"line":6413},[3946,7281,7282],{"class":3952},"      }\n",[3946,7284,7285],{"class":3948,"line":6418},[3946,7286,4278],{"emptyLinePlaceholder":4277},[3946,7288,7289,7291,7293,7295,7297,7299,7301,7303,7305,7307,7309,7311],{"class":3948,"line":6434},[3946,7290,6984],{"class":4255},[3946,7292,6987],{"class":4286},[3946,7294,4290],{"class":3952},[3946,7296,5685],{"class":4286},[3946,7298,4298],{"class":3952},[3946,7300,5813],{"class":4224},[3946,7302,4331],{"class":3952},[3946,7304,5716],{"class":4262},[3946,7306,5783],{"class":3952},[3946,7308,5822],{"class":4251},[3946,7310,6727],{"class":4403},[3946,7312,4272],{"class":3952},[3946,7314,7315],{"class":3948,"line":6466},[3946,7316,7095],{"class":3952},[3946,7318,7319],{"class":3948,"line":6493},[3946,7320,7321],{"class":4342},"      \u002F\u002F Перевірка на валідність структури\n",[3946,7323,7324,7326,7328,7330,7332,7335,7338,7340,7342,7344,7346,7348,7350,7353],{"class":3948,"line":6512},[3946,7325,7246],{"class":4251},[3946,7327,4312],{"class":3952},[3946,7329,7062],{"class":4262},[3946,7331,4298],{"class":3952},[3946,7333,7334],{"class":4262},"accessToken",[3946,7336,7337],{"class":3952}," || !",[3946,7339,7062],{"class":4262},[3946,7341,4298],{"class":3952},[3946,7343,5363],{"class":4262},[3946,7345,7337],{"class":3952},[3946,7347,7062],{"class":4262},[3946,7349,4298],{"class":3952},[3946,7351,7352],{"class":4262},"expiresAt",[3946,7354,4318],{"class":3952},[3946,7356,7357,7359,7361,7363,7365,7368],{"class":3948,"line":6530},[3946,7358,7257],{"class":4262},[3946,7360,4298],{"class":3952},[3946,7362,4328],{"class":4224},[3946,7364,4331],{"class":3952},[3946,7366,7367],{"class":3966},"'⚠️ Невалідна структура токенів, видаляємо'",[3946,7369,4337],{"class":3952},[3946,7371,7372,7375,7378,7380,7383],{"class":3948,"line":6545},[3946,7373,7374],{"class":4251},"        await",[3946,7376,7377],{"class":4255}," this",[3946,7379,4298],{"class":3952},[3946,7381,7382],{"class":4224},"clearTokens",[3946,7384,4304],{"class":3952},[3946,7386,7387,7389,7391],{"class":3948,"line":6550},[3946,7388,7273],{"class":4251},[3946,7390,4648],{"class":4255},[3946,7392,4272],{"class":3952},[3946,7394,7395],{"class":3948,"line":6555},[3946,7396,7282],{"class":3952},[3946,7398,7399],{"class":3948,"line":6560},[3946,7400,4278],{"emptyLinePlaceholder":4277},[3946,7402,7403,7406,7408],{"class":3948,"line":6566},[3946,7404,7405],{"class":4251},"      return",[3946,7407,6987],{"class":4262},[3946,7409,4272],{"class":3952},[3946,7411,7412,7414,7416,7418,7420],{"class":3948,"line":6571},[3946,7413,7115],{"class":3952},[3946,7415,4476],{"class":4251},[3946,7417,4479],{"class":3952},[3946,7419,4482],{"class":4262},[3946,7421,4318],{"class":3952},[3946,7423,7424,7426,7428,7430,7432,7435,7437,7439],{"class":3948,"line":6588},[3946,7425,5525],{"class":4262},[3946,7427,4298],{"class":3952},[3946,7429,4482],{"class":4224},[3946,7431,4331],{"class":3952},[3946,7433,7434],{"class":3966},"'❌ Помилка читання токенів:'",[3946,7436,4447],{"class":3952},[3946,7438,4482],{"class":4262},[3946,7440,4337],{"class":3952},[3946,7442,7443],{"class":3948,"line":6597},[3946,7444,7445],{"class":4342},"      \u002F\u002F Corrupted data — видаляємо\n",[3946,7447,7448,7450,7452,7454,7456],{"class":3948,"line":6609},[3946,7449,7069],{"class":4251},[3946,7451,7377],{"class":4255},[3946,7453,4298],{"class":3952},[3946,7455,7382],{"class":4224},[3946,7457,4304],{"class":3952},[3946,7459,7460,7462,7464],{"class":3948,"line":6640},[3946,7461,7405],{"class":4251},[3946,7463,4648],{"class":4255},[3946,7465,4272],{"class":3952},[3946,7467,7468],{"class":3948,"line":6653},[3946,7469,5550],{"class":3952},[3946,7471,7472],{"class":3948,"line":6659},[3946,7473,4521],{"class":3952},[3946,7475,7476],{"class":3948,"line":6671},[3946,7477,4278],{"emptyLinePlaceholder":4277},[3946,7479,7480],{"class":3948,"line":6689},[3946,7481,6908],{"class":4342},[3946,7483,7484],{"class":3948,"line":6694},[3946,7485,7486],{"class":4342},"   * Отримання лише access token\n",[3946,7488,7489],{"class":3948,"line":6699},[3946,7490,6918],{"class":4342},[3946,7492,7493,7495,7498,7500,7502,7504,7506,7508,7510],{"class":3948,"line":6704},[3946,7494,6923],{"class":4255},[3946,7496,7497],{"class":4224}," getAccessToken",[3946,7499,4550],{"class":3952},[3946,7501,4410],{"class":4403},[3946,7503,4413],{"class":3952},[3946,7505,4404],{"class":4403},[3946,7507,4559],{"class":3952},[3946,7509,4562],{"class":4403},[3946,7511,4419],{"class":3952},[3946,7513,7514,7516,7518,7520,7522,7524,7526,7529],{"class":3948,"line":6709},[3946,7515,4577],{"class":4255},[3946,7517,6987],{"class":4286},[3946,7519,4290],{"class":3952},[3946,7521,4293],{"class":4251},[3946,7523,7377],{"class":4255},[3946,7525,4298],{"class":3952},[3946,7527,7528],{"class":4224},"getTokens",[3946,7530,4304],{"class":3952},[3946,7532,7533,7535,7537,7540,7542,7545,7547],{"class":3948,"line":6715},[3946,7534,4603],{"class":4251},[3946,7536,6987],{"class":4262},[3946,7538,7539],{"class":3952},"?.",[3946,7541,7334],{"class":4262},[3946,7543,7544],{"class":3952}," ?? ",[3946,7546,4562],{"class":4255},[3946,7548,4272],{"class":3952},[3946,7550,7551],{"class":3948,"line":6720},[3946,7552,4521],{"class":3952},[3946,7554,7555],{"class":3948,"line":6732},[3946,7556,4278],{"emptyLinePlaceholder":4277},[3946,7558,7559],{"class":3948,"line":6743},[3946,7560,6908],{"class":4342},[3946,7562,7563],{"class":3948,"line":6754},[3946,7564,7565],{"class":4342},"   * Перевірка чи токен валідний (не закінчився)\n",[3946,7567,7568],{"class":3948,"line":6768},[3946,7569,6918],{"class":4342},[3946,7571,7573,7575,7578,7580,7582,7584,7586],{"class":3948,"line":7572},83,[3946,7574,6923],{"class":4255},[3946,7576,7577],{"class":4224}," isTokenValid",[3946,7579,4550],{"class":3952},[3946,7581,4410],{"class":4403},[3946,7583,4413],{"class":3952},[3946,7585,4848],{"class":4403},[3946,7587,4419],{"class":3952},[3946,7589,7591,7593,7595,7597,7599,7601,7603,7605],{"class":3948,"line":7590},84,[3946,7592,4577],{"class":4255},[3946,7594,6987],{"class":4286},[3946,7596,4290],{"class":3952},[3946,7598,4293],{"class":4251},[3946,7600,7377],{"class":4255},[3946,7602,4298],{"class":3952},[3946,7604,7528],{"class":4224},[3946,7606,4304],{"class":3952},[3946,7608,7610],{"class":3948,"line":7609},85,[3946,7611,7612],{"class":3952},"    \n",[3946,7614,7616,7618,7620,7622,7624,7626,7629],{"class":3948,"line":7615},86,[3946,7617,5503],{"class":4251},[3946,7619,4312],{"class":3952},[3946,7621,7062],{"class":4262},[3946,7623,5783],{"class":3952},[3946,7625,5786],{"class":4251},[3946,7627,7628],{"class":4255}," false",[3946,7630,4272],{"class":3952},[3946,7632,7634],{"class":3948,"line":7633},87,[3946,7635,4278],{"emptyLinePlaceholder":4277},[3946,7637,7639],{"class":3948,"line":7638},88,[3946,7640,7641],{"class":4342},"    \u002F\u002F Додаємо буфер 60 секунд перед закінченням\n",[3946,7643,7645,7647,7650,7652,7654,7656,7658,7661,7664,7666,7668,7670,7673],{"class":3948,"line":7644},89,[3946,7646,4577],{"class":4255},[3946,7648,7649],{"class":4286}," isValid",[3946,7651,4290],{"class":3952},[3946,7653,7062],{"class":4262},[3946,7655,4298],{"class":3952},[3946,7657,7352],{"class":4262},[3946,7659,7660],{"class":3952}," > ",[3946,7662,7663],{"class":4262},"Date",[3946,7665,4298],{"class":3952},[3946,7667,7020],{"class":4224},[3946,7669,7023],{"class":3952},[3946,7671,7672],{"class":4020},"60000",[3946,7674,4272],{"class":3952},[3946,7676,7678],{"class":3948,"line":7677},90,[3946,7679,7612],{"class":3952},[3946,7681,7683,7685,7687,7690],{"class":3948,"line":7682},91,[3946,7684,5503],{"class":4251},[3946,7686,4312],{"class":3952},[3946,7688,7689],{"class":4262},"isValid",[3946,7691,4318],{"class":3952},[3946,7693,7695,7697,7699,7701,7703,7706],{"class":3948,"line":7694},92,[3946,7696,5525],{"class":4262},[3946,7698,4298],{"class":3952},[3946,7700,4461],{"class":4224},[3946,7702,4331],{"class":3952},[3946,7704,7705],{"class":3966},"'⏰ Токен закінчився'",[3946,7707,4337],{"class":3952},[3946,7709,7711],{"class":3948,"line":7710},93,[3946,7712,5550],{"class":3952},[3946,7714,7716],{"class":3948,"line":7715},94,[3946,7717,7612],{"class":3952},[3946,7719,7721,7723,7725],{"class":3948,"line":7720},95,[3946,7722,4603],{"class":4251},[3946,7724,7649],{"class":4262},[3946,7726,4272],{"class":3952},[3946,7728,7730],{"class":3948,"line":7729},96,[3946,7731,4521],{"class":3952},[3946,7733,7735],{"class":3948,"line":7734},97,[3946,7736,4278],{"emptyLinePlaceholder":4277},[3946,7738,7740],{"class":3948,"line":7739},98,[3946,7741,6908],{"class":4342},[3946,7743,7745],{"class":3948,"line":7744},99,[3946,7746,7747],{"class":4342},"   * Оновлення access token (після refresh)\n",[3946,7749,7751],{"class":3948,"line":7750},100,[3946,7752,6918],{"class":4342},[3946,7754,7756,7758,7761],{"class":3948,"line":7755},101,[3946,7757,6923],{"class":4255},[3946,7759,7760],{"class":4224}," updateAccessToken",[3946,7762,6594],{"class":3952},[3946,7764,7766,7769,7771,7773],{"class":3948,"line":7765},102,[3946,7767,7768],{"class":4262},"    newAccessToken",[3946,7770,3963],{"class":3952},[3946,7772,4404],{"class":4403},[3946,7774,3970],{"class":3952},[3946,7776,7778,7780,7782],{"class":3948,"line":7777},103,[3946,7779,6955],{"class":4262},[3946,7781,3963],{"class":3952},[3946,7783,6650],{"class":4403},[3946,7785,7787,7789,7791,7793,7795],{"class":3948,"line":7786},104,[3946,7788,6964],{"class":3952},[3946,7790,4410],{"class":4403},[3946,7792,4413],{"class":3952},[3946,7794,4416],{"class":4403},[3946,7796,4419],{"class":3952},[3946,7798,7800,7802,7804,7806,7808,7810,7812,7814],{"class":3948,"line":7799},105,[3946,7801,4577],{"class":4255},[3946,7803,6987],{"class":4286},[3946,7805,4290],{"class":3952},[3946,7807,4293],{"class":4251},[3946,7809,7377],{"class":4255},[3946,7811,4298],{"class":3952},[3946,7813,7528],{"class":4224},[3946,7815,4304],{"class":3952},[3946,7817,7819],{"class":3948,"line":7818},106,[3946,7820,7612],{"class":3952},[3946,7822,7824,7826,7828,7830],{"class":3948,"line":7823},107,[3946,7825,5503],{"class":4251},[3946,7827,4312],{"class":3952},[3946,7829,7062],{"class":4262},[3946,7831,4318],{"class":3952},[3946,7833,7835,7837,7839,7841,7843,7846],{"class":3948,"line":7834},108,[3946,7836,7147],{"class":4251},[3946,7838,7150],{"class":4255},[3946,7840,5513],{"class":4224},[3946,7842,4331],{"class":3952},[3946,7844,7845],{"class":3966},"'Неможливо оновити токен: поточні токени не знайдено'",[3946,7847,4337],{"class":3952},[3946,7849,7851],{"class":3948,"line":7850},109,[3946,7852,5550],{"class":3952},[3946,7854,7856],{"class":3948,"line":7855},110,[3946,7857,4278],{"emptyLinePlaceholder":4277},[3946,7859,7861,7863,7865,7867,7870,7872,7875,7877,7879,7881,7883,7885,7887],{"class":3948,"line":7860},111,[3946,7862,4432],{"class":4251},[3946,7864,7377],{"class":4255},[3946,7866,4298],{"class":3952},[3946,7868,7869],{"class":4224},"saveTokens",[3946,7871,4331],{"class":3952},[3946,7873,7874],{"class":4262},"newAccessToken",[3946,7876,4447],{"class":3952},[3946,7878,7062],{"class":4262},[3946,7880,4298],{"class":3952},[3946,7882,5363],{"class":4262},[3946,7884,4447],{"class":3952},[3946,7886,7026],{"class":4262},[3946,7888,4337],{"class":3952},[3946,7890,7892],{"class":3948,"line":7891},112,[3946,7893,4521],{"class":3952},[3946,7895,7897],{"class":3948,"line":7896},113,[3946,7898,4278],{"emptyLinePlaceholder":4277},[3946,7900,7902],{"class":3948,"line":7901},114,[3946,7903,6908],{"class":4342},[3946,7905,7907],{"class":3948,"line":7906},115,[3946,7908,7909],{"class":4342},"   * Видалення токенів (logout)\n",[3946,7911,7913],{"class":3948,"line":7912},116,[3946,7914,6918],{"class":4342},[3946,7916,7918,7920,7923,7925,7927,7929,7931],{"class":3948,"line":7917},117,[3946,7919,6923],{"class":4255},[3946,7921,7922],{"class":4224}," clearTokens",[3946,7924,4550],{"class":3952},[3946,7926,4410],{"class":4403},[3946,7928,4413],{"class":3952},[3946,7930,4416],{"class":4403},[3946,7932,4419],{"class":3952},[3946,7934,7936,7938],{"class":3948,"line":7935},118,[3946,7937,6977],{"class":4251},[3946,7939,4427],{"class":3952},[3946,7941,7943,7945,7947,7949,7951,7953,7955,7957,7959],{"class":3948,"line":7942},119,[3946,7944,7069],{"class":4251},[3946,7946,4263],{"class":4262},[3946,7948,4298],{"class":3952},[3946,7950,4710],{"class":4224},[3946,7952,4331],{"class":3952},[3946,7954,5959],{"class":4286},[3946,7956,4298],{"class":3952},[3946,7958,7084],{"class":4286},[3946,7960,4337],{"class":3952},[3946,7962,7964,7966,7968,7970,7972,7975],{"class":3948,"line":7963},120,[3946,7965,5525],{"class":4262},[3946,7967,4298],{"class":3952},[3946,7969,4461],{"class":4224},[3946,7971,4331],{"class":3952},[3946,7973,7974],{"class":3966},"'🗑️ Токени видалено'",[3946,7976,4337],{"class":3952},[3946,7978,7980,7982,7984,7986,7988],{"class":3948,"line":7979},121,[3946,7981,7115],{"class":3952},[3946,7983,4476],{"class":4251},[3946,7985,4479],{"class":3952},[3946,7987,4482],{"class":4262},[3946,7989,4318],{"class":3952},[3946,7991,7993,7995,7997,7999,8001,8004,8006,8008],{"class":3948,"line":7992},122,[3946,7994,5525],{"class":4262},[3946,7996,4298],{"class":3952},[3946,7998,4482],{"class":4224},[3946,8000,4331],{"class":3952},[3946,8002,8003],{"class":3966},"'❌ Помилка видалення токенів:'",[3946,8005,4447],{"class":3952},[3946,8007,4482],{"class":4262},[3946,8009,4337],{"class":3952},[3946,8011,8013],{"class":3948,"line":8012},123,[3946,8014,8015],{"class":4342},"      \u002F\u002F Не критично, можна проігнорувати\n",[3946,8017,8019],{"class":3948,"line":8018},124,[3946,8020,5550],{"class":3952},[3946,8022,8024],{"class":3948,"line":8023},125,[3946,8025,4521],{"class":3952},[3946,8027,8029],{"class":3948,"line":8028},126,[3946,8030,4278],{"emptyLinePlaceholder":4277},[3946,8032,8034],{"class":3948,"line":8033},127,[3946,8035,6908],{"class":4342},[3946,8037,8039],{"class":3948,"line":8038},128,[3946,8040,8041],{"class":4342},"   * Отримання часу до закінчення токену (в секундах)\n",[3946,8043,8045],{"class":3948,"line":8044},129,[3946,8046,6918],{"class":4342},[3946,8048,8050,8052,8055,8057,8059,8061,8063,8065,8067],{"class":3948,"line":8049},130,[3946,8051,6923],{"class":4255},[3946,8053,8054],{"class":4224}," getTimeUntilExpiry",[3946,8056,4550],{"class":3952},[3946,8058,4410],{"class":4403},[3946,8060,4413],{"class":3952},[3946,8062,4832],{"class":4403},[3946,8064,4559],{"class":3952},[3946,8066,4562],{"class":4403},[3946,8068,4419],{"class":3952},[3946,8070,8072,8074,8076,8078,8080,8082,8084,8086],{"class":3948,"line":8071},131,[3946,8073,4577],{"class":4255},[3946,8075,6987],{"class":4286},[3946,8077,4290],{"class":3952},[3946,8079,4293],{"class":4251},[3946,8081,7377],{"class":4255},[3946,8083,4298],{"class":3952},[3946,8085,7528],{"class":4224},[3946,8087,4304],{"class":3952},[3946,8089,8091],{"class":3948,"line":8090},132,[3946,8092,7612],{"class":3952},[3946,8094,8096,8098,8100,8102,8104,8106,8108],{"class":3948,"line":8095},133,[3946,8097,5503],{"class":4251},[3946,8099,4312],{"class":3952},[3946,8101,7062],{"class":4262},[3946,8103,5783],{"class":3952},[3946,8105,5786],{"class":4251},[3946,8107,4648],{"class":4255},[3946,8109,4272],{"class":3952},[3946,8111,8113],{"class":3948,"line":8112},134,[3946,8114,4278],{"emptyLinePlaceholder":4277},[3946,8116,8118,8120,8123,8125,8128,8130,8133,8136,8138,8140,8142,8145,8147,8149,8151,8154,8156],{"class":3948,"line":8117},135,[3946,8119,4577],{"class":4255},[3946,8121,8122],{"class":4286}," timeLeft",[3946,8124,4290],{"class":3952},[3946,8126,8127],{"class":4262},"Math",[3946,8129,4298],{"class":3952},[3946,8131,8132],{"class":4224},"floor",[3946,8134,8135],{"class":3952},"((",[3946,8137,7062],{"class":4262},[3946,8139,4298],{"class":3952},[3946,8141,7352],{"class":4262},[3946,8143,8144],{"class":3952}," - ",[3946,8146,7663],{"class":4262},[3946,8148,4298],{"class":3952},[3946,8150,7020],{"class":4224},[3946,8152,8153],{"class":3952},"()) \u002F ",[3946,8155,7032],{"class":4020},[3946,8157,4337],{"class":3952},[3946,8159,8161,8163,8166,8168,8171,8173,8176,8178,8181],{"class":3948,"line":8160},136,[3946,8162,4603],{"class":4251},[3946,8164,8165],{"class":4262}," Math",[3946,8167,4298],{"class":3952},[3946,8169,8170],{"class":4224},"max",[3946,8172,4331],{"class":3952},[3946,8174,8175],{"class":4020},"0",[3946,8177,4447],{"class":3952},[3946,8179,8180],{"class":4262},"timeLeft",[3946,8182,4337],{"class":3952},[3946,8184,8186],{"class":3948,"line":8185},137,[3946,8187,4521],{"class":3952},[3946,8189,8191],{"class":3948,"line":8190},138,[3946,8192,4040],{"class":3952},[3946,8194,8196],{"class":3948,"line":8195},139,[3946,8197,4278],{"emptyLinePlaceholder":4277},[3946,8199,8201],{"class":3948,"line":8200},140,[3946,8202,8203],{"class":4342},"\u002F\u002F Singleton instance\n",[3946,8205,8207,8209,8211,8214,8216,8219,8221],{"class":3948,"line":8206},141,[3946,8208,6030],{"class":4251},[3946,8210,5933],{"class":4255},[3946,8212,8213],{"class":4286}," tokenService",[3946,8215,4290],{"class":3952},[3946,8217,8218],{"class":4255},"new",[3946,8220,6901],{"class":4224},[3946,8222,4304],{"class":3952},[3743,8224,8225],{},[3771,8226,8227],{},"Ключові особливості цієї реалізації:",[3765,8229,8230,8236,8242,8248,8254],{},[3768,8231,8232,8235],{},[3771,8233,8234],{},"Singleton Pattern"," — один екземпляр сервісу на весь додаток",[3768,8237,8238,8241],{},[3771,8239,8240],{},"Error Handling"," — всі помилки логуються та обробляються gracefully",[3768,8243,8244,8247],{},[3771,8245,8246],{},"Data Validation"," — перевірка структури даних перед поверненням",[3768,8249,8250,8253],{},[3771,8251,8252],{},"Expiry Buffer"," — 60 секунд буфер для запобігання race conditions",[3768,8255,8256,8259],{},[3771,8257,8258],{},"Corrupted Data Recovery"," — автоматичне видалення пошкоджених даних",[3750,8261,8263],{"id":8262},"_34-api-service-взаємодія-з-backend","3.4. API Service — Взаємодія з Backend",[3743,8265,8266],{},"Створимо сервіс для HTTP запитів:",[3857,8268,8270],{"className":4242,"code":8269,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fapi\u002FauthApi.ts\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport type {\n  AuthResponse,\n  LoginCredentials,\n  RegisterCredentials,\n  User,\n} from '..\u002Ftypes\u002Fauth.types';\nimport { tokenService } from '..\u002Fservices\u002FtokenService';\n\n\u002F**\n * Базова конфігурація API\n *\u002F\nconst API_BASE_URL = __DEV__\n  ? 'http:\u002F\u002Flocalhost:3000\u002Fapi'\n  : 'https:\u002F\u002Fapi.securenotes.com';\n\nconst API_TIMEOUT = 10000; \u002F\u002F 10 секунд\n\n\u002F**\n * Клас для роботи з API автентифікації\n *\u002F\nclass AuthApi {\n  private client: AxiosInstance;\n\n  constructor() {\n    this.client = axios.create({\n      baseURL: API_BASE_URL,\n      timeout: API_TIMEOUT,\n      headers: {\n        'Content-Type': 'application\u002Fjson',\n      },\n    });\n\n    \u002F\u002F Interceptor для додавання токену до запитів\n    this.client.interceptors.request.use(\n      async (config) => {\n        const token = await tokenService.getAccessToken();\n        \n        if (token) {\n          config.headers.Authorization = `Bearer ${token}`;\n        }\n        \n        return config;\n      },\n      (error) => Promise.reject(error)\n    );\n\n    \u002F\u002F Interceptor для обробки 401 помилок\n    this.client.interceptors.response.use(\n      (response) => response,\n      async (error: AxiosError) => {\n        if (error.response?.status === 401) {\n          \u002F\u002F Токен невалідний — очищаємо\n          await tokenService.clearTokens();\n          \n          \u002F\u002F Тут можна додати логіку refresh token\n          \u002F\u002F або редірект на екран логіну\n        }\n        \n        return Promise.reject(error);\n      }\n    );\n  }\n\n  \u002F**\n   * Вхід в систему\n   *\u002F\n  async login(credentials: LoginCredentials): Promise\u003CAuthResponse> {\n    try {\n      const response = await this.client.post\u003CAuthResponse>(\n        '\u002Fauth\u002Flogin',\n        credentials\n      );\n\n      return response.data;\n    } catch (error) {\n      throw this.handleError(error);\n    }\n  }\n\n  \u002F**\n   * Реєстрація\n   *\u002F\n  async register(credentials: RegisterCredentials): Promise\u003CAuthResponse> {\n    try {\n      const response = await this.client.post\u003CAuthResponse>(\n        '\u002Fauth\u002Fregister',\n        credentials\n      );\n\n      return response.data;\n    } catch (error) {\n      throw this.handleError(error);\n    }\n  }\n\n  \u002F**\n   * Вихід з системи (інвалідація токену на сервері)\n   *\u002F\n  async logout(): Promise\u003Cvoid> {\n    try {\n      await this.client.post('\u002Fauth\u002Flogout');\n    } catch (error) {\n      \u002F\u002F Логуємо, але не кидаємо помилку\n      console.error('Помилка logout на сервері:', error);\n    }\n  }\n\n  \u002F**\n   * Оновлення токену за допомогою refresh token\n   *\u002F\n  async refreshToken(refreshToken: string): Promise\u003CAuthResponse> {\n    try {\n      const response = await this.client.post\u003CAuthResponse>(\n        '\u002Fauth\u002Frefresh',\n        { refreshToken }\n      );\n\n      return response.data;\n    } catch (error) {\n      throw this.handleError(error);\n    }\n  }\n\n  \u002F**\n   * Отримання інформації про поточного користувача\n   *\u002F\n  async getCurrentUser(): Promise\u003CUser> {\n    try {\n      const response = await this.client.get\u003CUser>('\u002Fauth\u002Fme');\n      return response.data;\n    } catch (error) {\n      throw this.handleError(error);\n    }\n  }\n\n  \u002F**\n   * Валідація токену на сервері\n   *\u002F\n  async validateToken(): Promise\u003Cboolean> {\n    try {\n      await this.client.get('\u002Fauth\u002Fvalidate');\n      return true;\n    } catch {\n      return false;\n    }\n  }\n\n  \u002F**\n   * Уніфікована обробка помилок\n   *\u002F\n  private handleError(error: unknown): Error {\n    if (axios.isAxiosError(error)) {\n      const message = error.response?.data?.message || error.message;\n      const status = error.response?.status;\n\n      \u002F\u002F Специфічні повідомлення для різних статусів\n      switch (status) {\n        case 400:\n          return new Error('Невірні дані. Перевірте введену інформацію.');\n        case 401:\n          return new Error('Невірний email або пароль.');\n        case 403:\n          return new Error('Доступ заборонено.');\n        case 404:\n          return new Error('Користувача не знайдено.');\n        case 409:\n          return new Error('Користувач з таким email вже існує.');\n        case 429:\n          return new Error('Занадто багато спроб. Спробуйте пізніше.');\n        case 500:\n          return new Error('Помилка сервера. Спробуйте пізніше.');\n        default:\n          return new Error(message || 'Невідома помилка мережі');\n      }\n    }\n\n    if (error instanceof Error) {\n      return error;\n    }\n\n    return new Error('Невідома помилка');\n  }\n}\n\n\u002F\u002F Singleton instance\nexport const authApi = new AuthApi();\n",[3782,8271,8272,8277,8281,8308,8316,8323,8330,8337,8344,8354,8372,8376,8380,8385,8389,8401,8409,8419,8423,8440,8444,8448,8453,8457,8466,8480,8484,8491,8513,8522,8531,8538,8551,8556,8561,8565,8570,8595,8611,8631,8636,8647,8680,8685,8689,8698,8702,8727,8732,8736,8741,8764,8779,8797,8822,8827,8840,8845,8850,8855,8859,8863,8879,8883,8887,8891,8895,8899,8904,8908,8934,8940,8968,8975,8980,8985,8989,9001,9013,9030,9034,9038,9042,9046,9051,9055,9080,9086,9112,9119,9123,9127,9131,9143,9155,9171,9175,9179,9183,9187,9192,9196,9213,9219,9240,9252,9257,9276,9280,9284,9288,9292,9297,9301,9326,9332,9358,9365,9375,9379,9383,9395,9407,9423,9427,9431,9435,9439,9444,9448,9465,9471,9504,9516,9528,9544,9548,9552,9556,9560,9565,9569,9587,9594,9616,9625,9634,9643,9648,9653,9658,9663,9669,9674,9698,9719,9754,9776,9781,9787,9799,9811,9828,9838,9854,9864,9880,9890,9906,9916,9932,9942,9958,9968,9984,9992,10012,10017,10022,10027,10042,10051,10056,10061,10077,10082,10087,10092,10097],{"__ignoreMap":3865},[3946,8273,8274],{"class":3948,"line":3949},[3946,8275,8276],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fapi\u002FauthApi.ts\n",[3946,8278,8279],{"class":3948,"line":3956},[3946,8280,4278],{"emptyLinePlaceholder":4277},[3946,8282,8283,8285,8288,8291,8294,8296,8299,8301,8303,8306],{"class":3948,"line":3973},[3946,8284,4252],{"class":4251},[3946,8286,8287],{"class":4262}," axios",[3946,8289,8290],{"class":3952},", { ",[3946,8292,8293],{"class":4262},"AxiosError",[3946,8295,4447],{"class":3952},[3946,8297,8298],{"class":4262},"AxiosInstance",[3946,8300,6823],{"class":3952},[3946,8302,6826],{"class":4251},[3946,8304,8305],{"class":3966}," 'axios'",[3946,8307,4272],{"class":3952},[3946,8309,8310,8312,8314],{"class":3948,"line":3986},[3946,8311,4252],{"class":4251},[3946,8313,6814],{"class":4251},[3946,8315,4427],{"class":3952},[3946,8317,8318,8321],{"class":3948,"line":3999},[3946,8319,8320],{"class":4262},"  AuthResponse",[3946,8322,3970],{"class":3952},[3946,8324,8325,8328],{"class":3948,"line":4012},[3946,8326,8327],{"class":4262},"  LoginCredentials",[3946,8329,3970],{"class":3952},[3946,8331,8332,8335],{"class":3948,"line":4026},[3946,8333,8334],{"class":4262},"  RegisterCredentials",[3946,8336,3970],{"class":3952},[3946,8338,8339,8342],{"class":3948,"line":4037},[3946,8340,8341],{"class":4262},"  User",[3946,8343,3970],{"class":3952},[3946,8345,8346,8348,8350,8352],{"class":3948,"line":4487},[3946,8347,5928],{"class":3952},[3946,8349,6826],{"class":4251},[3946,8351,6829],{"class":3966},[3946,8353,4272],{"class":3952},[3946,8355,8356,8358,8360,8363,8365,8367,8370],{"class":3948,"line":4507},[3946,8357,4252],{"class":4251},[3946,8359,6817],{"class":3952},[3946,8361,8362],{"class":4262},"tokenService",[3946,8364,6823],{"class":3952},[3946,8366,6826],{"class":4251},[3946,8368,8369],{"class":3966}," '..\u002Fservices\u002FtokenService'",[3946,8371,4272],{"class":3952},[3946,8373,8374],{"class":3948,"line":4518},[3946,8375,4278],{"emptyLinePlaceholder":4277},[3946,8377,8378],{"class":3948,"line":4524},[3946,8379,6015],{"class":4342},[3946,8381,8382],{"class":3948,"line":4529},[3946,8383,8384],{"class":4342}," * Базова конфігурація API\n",[3946,8386,8387],{"class":3948,"line":4534},[3946,8388,6025],{"class":4342},[3946,8390,8391,8393,8396,8398],{"class":3948,"line":4540},[3946,8392,4283],{"class":4255},[3946,8394,8395],{"class":4286}," API_BASE_URL",[3946,8397,4290],{"class":3952},[3946,8399,8400],{"class":4262},"__DEV__\n",[3946,8402,8403,8406],{"class":3948,"line":4567},[3946,8404,8405],{"class":3952},"  ? ",[3946,8407,8408],{"class":3966},"'http:\u002F\u002Flocalhost:3000\u002Fapi'\n",[3946,8410,8411,8414,8417],{"class":3948,"line":4574},[3946,8412,8413],{"class":3952},"  : ",[3946,8415,8416],{"class":3966},"'https:\u002F\u002Fapi.securenotes.com'",[3946,8418,4272],{"class":3952},[3946,8420,8421],{"class":3948,"line":4600},[3946,8422,4278],{"emptyLinePlaceholder":4277},[3946,8424,8425,8427,8430,8432,8435,8437],{"class":3948,"line":4610},[3946,8426,4283],{"class":4255},[3946,8428,8429],{"class":4286}," API_TIMEOUT",[3946,8431,4290],{"class":3952},[3946,8433,8434],{"class":4020},"10000",[3946,8436,4851],{"class":3952},[3946,8438,8439],{"class":4342},"\u002F\u002F 10 секунд\n",[3946,8441,8442],{"class":3948,"line":4623},[3946,8443,4278],{"emptyLinePlaceholder":4277},[3946,8445,8446],{"class":3948,"line":4643},[3946,8447,6015],{"class":4342},[3946,8449,8450],{"class":3948,"line":4653},[3946,8451,8452],{"class":4342}," * Клас для роботи з API автентифікації\n",[3946,8454,8455],{"class":3948,"line":4658},[3946,8456,6025],{"class":4342},[3946,8458,8459,8461,8464],{"class":3948,"line":4663},[3946,8460,6898],{"class":4255},[3946,8462,8463],{"class":4403}," AuthApi",[3946,8465,4427],{"class":3952},[3946,8467,8468,8471,8474,8476,8478],{"class":3948,"line":4668},[3946,8469,8470],{"class":4255},"  private",[3946,8472,8473],{"class":4262}," client",[3946,8475,3963],{"class":3952},[3946,8477,8298],{"class":4403},[3946,8479,4272],{"class":3952},[3946,8481,8482],{"class":3948,"line":4674},[3946,8483,4278],{"emptyLinePlaceholder":4277},[3946,8485,8486,8488],{"class":3948,"line":4694},[3946,8487,6591],{"class":4255},[3946,8489,8490],{"class":3952},"() {\n",[3946,8492,8493,8495,8497,8500,8502,8505,8507,8510],{"class":3948,"line":4701},[3946,8494,6674],{"class":4255},[3946,8496,4298],{"class":3952},[3946,8498,8499],{"class":4262},"client",[3946,8501,4290],{"class":3952},[3946,8503,8504],{"class":4262},"axios",[3946,8506,4298],{"class":3952},[3946,8508,8509],{"class":4224},"create",[3946,8511,8512],{"class":3952},"({\n",[3946,8514,8515,8518,8520],{"class":3948,"line":4719},[3946,8516,8517],{"class":4262},"      baseURL:",[3946,8519,8395],{"class":4286},[3946,8521,3970],{"class":3952},[3946,8523,8524,8527,8529],{"class":3948,"line":4735},[3946,8525,8526],{"class":4262},"      timeout:",[3946,8528,8429],{"class":4286},[3946,8530,3970],{"class":3952},[3946,8532,8533,8536],{"class":3948,"line":4748},[3946,8534,8535],{"class":4262},"      headers:",[3946,8537,4427],{"class":3952},[3946,8539,8540,8543,8546,8549],{"class":3948,"line":4768},[3946,8541,8542],{"class":3966},"        'Content-Type'",[3946,8544,8545],{"class":4262},":",[3946,8547,8548],{"class":3966}," 'application\u002Fjson'",[3946,8550,3970],{"class":3952},[3946,8552,8553],{"class":3948,"line":4777},[3946,8554,8555],{"class":3952},"      },\n",[3946,8557,8558],{"class":3948,"line":4782},[3946,8559,8560],{"class":3952},"    });\n",[3946,8562,8563],{"class":3948,"line":6262},[3946,8564,4278],{"emptyLinePlaceholder":4277},[3946,8566,8567],{"class":3948,"line":6273},[3946,8568,8569],{"class":4342},"    \u002F\u002F Interceptor для додавання токену до запитів\n",[3946,8571,8572,8574,8576,8578,8580,8583,8585,8588,8590,8593],{"class":3948,"line":6284},[3946,8573,6674],{"class":4255},[3946,8575,4298],{"class":3952},[3946,8577,8499],{"class":4262},[3946,8579,4298],{"class":3952},[3946,8581,8582],{"class":4262},"interceptors",[3946,8584,4298],{"class":3952},[3946,8586,8587],{"class":4262},"request",[3946,8589,4298],{"class":3952},[3946,8591,8592],{"class":4224},"use",[3946,8594,6594],{"class":3952},[3946,8596,8597,8600,8602,8605,8607,8609],{"class":3948,"line":6299},[3946,8598,8599],{"class":4255},"      async",[3946,8601,4479],{"class":3952},[3946,8603,8604],{"class":4262},"config",[3946,8606,5783],{"class":3952},[3946,8608,6453],{"class":4255},[3946,8610,4427],{"class":3952},[3946,8612,8613,8616,8618,8620,8622,8624,8626,8629],{"class":3948,"line":6304},[3946,8614,8615],{"class":4255},"        const",[3946,8617,4580],{"class":4286},[3946,8619,4290],{"class":3952},[3946,8621,4293],{"class":4251},[3946,8623,8213],{"class":4262},[3946,8625,4298],{"class":3952},[3946,8627,8628],{"class":4224},"getAccessToken",[3946,8630,4304],{"class":3952},[3946,8632,8633],{"class":3948,"line":6309},[3946,8634,8635],{"class":3952},"        \n",[3946,8637,8638,8641,8643,8645],{"class":3948,"line":6314},[3946,8639,8640],{"class":4251},"        if",[3946,8642,4479],{"class":3952},[3946,8644,4398],{"class":4262},[3946,8646,4318],{"class":3952},[3946,8648,8649,8652,8654,8657,8659,8662,8664,8667,8670,8672,8675,8678],{"class":3948,"line":6320},[3946,8650,8651],{"class":4262},"          config",[3946,8653,4298],{"class":3952},[3946,8655,8656],{"class":4262},"headers",[3946,8658,4298],{"class":3952},[3946,8660,8661],{"class":4262},"Authorization",[3946,8663,4290],{"class":3952},[3946,8665,8666],{"class":3966},"`Bearer ",[3946,8668,8669],{"class":4255},"${",[3946,8671,4398],{"class":4262},[3946,8673,8674],{"class":4255},"}",[3946,8676,8677],{"class":3966},"`",[3946,8679,4272],{"class":3952},[3946,8681,8682],{"class":3948,"line":6325},[3946,8683,8684],{"class":3952},"        }\n",[3946,8686,8687],{"class":3948,"line":6337},[3946,8688,8635],{"class":3952},[3946,8690,8691,8693,8696],{"class":3948,"line":6352},[3946,8692,7273],{"class":4251},[3946,8694,8695],{"class":4262}," config",[3946,8697,4272],{"class":3952},[3946,8699,8700],{"class":3948,"line":6364},[3946,8701,8555],{"class":3952},[3946,8703,8704,8707,8709,8711,8713,8715,8717,8720,8722,8724],{"class":3948,"line":6376},[3946,8705,8706],{"class":3952},"      (",[3946,8708,4482],{"class":4262},[3946,8710,5783],{"class":3952},[3946,8712,6453],{"class":4255},[3946,8714,6456],{"class":4403},[3946,8716,4298],{"class":3952},[3946,8718,8719],{"class":4224},"reject",[3946,8721,4331],{"class":3952},[3946,8723,4482],{"class":4262},[3946,8725,8726],{"class":3952},")\n",[3946,8728,8729],{"class":3948,"line":6392},[3946,8730,8731],{"class":3952},"    );\n",[3946,8733,8734],{"class":3948,"line":6397},[3946,8735,4278],{"emptyLinePlaceholder":4277},[3946,8737,8738],{"class":3948,"line":6402},[3946,8739,8740],{"class":4342},"    \u002F\u002F Interceptor для обробки 401 помилок\n",[3946,8742,8743,8745,8747,8749,8751,8753,8755,8758,8760,8762],{"class":3948,"line":6407},[3946,8744,6674],{"class":4255},[3946,8746,4298],{"class":3952},[3946,8748,8499],{"class":4262},[3946,8750,4298],{"class":3952},[3946,8752,8582],{"class":4262},[3946,8754,4298],{"class":3952},[3946,8756,8757],{"class":4262},"response",[3946,8759,4298],{"class":3952},[3946,8761,8592],{"class":4224},[3946,8763,6594],{"class":3952},[3946,8765,8766,8768,8770,8772,8774,8777],{"class":3948,"line":6413},[3946,8767,8706],{"class":3952},[3946,8769,8757],{"class":4262},[3946,8771,5783],{"class":3952},[3946,8773,6453],{"class":4255},[3946,8775,8776],{"class":4262}," response",[3946,8778,3970],{"class":3952},[3946,8780,8781,8783,8785,8787,8789,8791,8793,8795],{"class":3948,"line":6418},[3946,8782,8599],{"class":4255},[3946,8784,4479],{"class":3952},[3946,8786,4482],{"class":4262},[3946,8788,3963],{"class":3952},[3946,8790,8293],{"class":4403},[3946,8792,5783],{"class":3952},[3946,8794,6453],{"class":4255},[3946,8796,4427],{"class":3952},[3946,8798,8799,8801,8803,8805,8807,8809,8811,8814,8817,8820],{"class":3948,"line":6434},[3946,8800,8640],{"class":4251},[3946,8802,4479],{"class":3952},[3946,8804,4482],{"class":4262},[3946,8806,4298],{"class":3952},[3946,8808,8757],{"class":4262},[3946,8810,7539],{"class":3952},[3946,8812,8813],{"class":4262},"status",[3946,8815,8816],{"class":3952}," === ",[3946,8818,8819],{"class":4020},"401",[3946,8821,4318],{"class":3952},[3946,8823,8824],{"class":3948,"line":6466},[3946,8825,8826],{"class":4342},"          \u002F\u002F Токен невалідний — очищаємо\n",[3946,8828,8829,8832,8834,8836,8838],{"class":3948,"line":6493},[3946,8830,8831],{"class":4251},"          await",[3946,8833,8213],{"class":4262},[3946,8835,4298],{"class":3952},[3946,8837,7382],{"class":4224},[3946,8839,4304],{"class":3952},[3946,8841,8842],{"class":3948,"line":6512},[3946,8843,8844],{"class":3952},"          \n",[3946,8846,8847],{"class":3948,"line":6530},[3946,8848,8849],{"class":4342},"          \u002F\u002F Тут можна додати логіку refresh token\n",[3946,8851,8852],{"class":3948,"line":6545},[3946,8853,8854],{"class":4342},"          \u002F\u002F або редірект на екран логіну\n",[3946,8856,8857],{"class":3948,"line":6550},[3946,8858,8684],{"class":3952},[3946,8860,8861],{"class":3948,"line":6555},[3946,8862,8635],{"class":3952},[3946,8864,8865,8867,8869,8871,8873,8875,8877],{"class":3948,"line":6560},[3946,8866,7273],{"class":4251},[3946,8868,6456],{"class":4403},[3946,8870,4298],{"class":3952},[3946,8872,8719],{"class":4224},[3946,8874,4331],{"class":3952},[3946,8876,4482],{"class":4262},[3946,8878,4337],{"class":3952},[3946,8880,8881],{"class":3948,"line":6566},[3946,8882,7282],{"class":3952},[3946,8884,8885],{"class":3948,"line":6571},[3946,8886,8731],{"class":3952},[3946,8888,8889],{"class":3948,"line":6588},[3946,8890,4521],{"class":3952},[3946,8892,8893],{"class":3948,"line":6597},[3946,8894,4278],{"emptyLinePlaceholder":4277},[3946,8896,8897],{"class":3948,"line":6609},[3946,8898,6908],{"class":4342},[3946,8900,8901],{"class":3948,"line":6640},[3946,8902,8903],{"class":4342},"   * Вхід в систему\n",[3946,8905,8906],{"class":3948,"line":6653},[3946,8907,6918],{"class":4342},[3946,8909,8910,8912,8915,8917,8919,8921,8923,8925,8927,8929,8932],{"class":3948,"line":6659},[3946,8911,6923],{"class":4255},[3946,8913,8914],{"class":4224}," login",[3946,8916,4331],{"class":3952},[3946,8918,6443],{"class":4262},[3946,8920,3963],{"class":3952},[3946,8922,6448],{"class":4403},[3946,8924,4407],{"class":3952},[3946,8926,4410],{"class":4403},[3946,8928,4413],{"class":3952},[3946,8930,8931],{"class":4403},"AuthResponse",[3946,8933,4419],{"class":3952},[3946,8935,8936,8938],{"class":3948,"line":6671},[3946,8937,6977],{"class":4251},[3946,8939,4427],{"class":3952},[3946,8941,8942,8944,8946,8948,8950,8952,8954,8956,8958,8961,8963,8965],{"class":3948,"line":6689},[3946,8943,6984],{"class":4255},[3946,8945,8776],{"class":4286},[3946,8947,4290],{"class":3952},[3946,8949,4293],{"class":4251},[3946,8951,7377],{"class":4255},[3946,8953,4298],{"class":3952},[3946,8955,8499],{"class":4262},[3946,8957,4298],{"class":3952},[3946,8959,8960],{"class":4224},"post",[3946,8962,4413],{"class":3952},[3946,8964,8931],{"class":4403},[3946,8966,8967],{"class":3952},">(\n",[3946,8969,8970,8973],{"class":3948,"line":6694},[3946,8971,8972],{"class":3966},"        '\u002Fauth\u002Flogin'",[3946,8974,3970],{"class":3952},[3946,8976,8977],{"class":3948,"line":6699},[3946,8978,8979],{"class":4262},"        credentials\n",[3946,8981,8982],{"class":3948,"line":6704},[3946,8983,8984],{"class":3952},"      );\n",[3946,8986,8987],{"class":3948,"line":6709},[3946,8988,4278],{"emptyLinePlaceholder":4277},[3946,8990,8991,8993,8995,8997,8999],{"class":3948,"line":6715},[3946,8992,7405],{"class":4251},[3946,8994,8776],{"class":4262},[3946,8996,4298],{"class":3952},[3946,8998,5178],{"class":4262},[3946,9000,4272],{"class":3952},[3946,9002,9003,9005,9007,9009,9011],{"class":3948,"line":6720},[3946,9004,7115],{"class":3952},[3946,9006,4476],{"class":4251},[3946,9008,4479],{"class":3952},[3946,9010,4482],{"class":4262},[3946,9012,4318],{"class":3952},[3946,9014,9015,9017,9019,9021,9024,9026,9028],{"class":3948,"line":6732},[3946,9016,7147],{"class":4251},[3946,9018,7377],{"class":4255},[3946,9020,4298],{"class":3952},[3946,9022,9023],{"class":4224},"handleError",[3946,9025,4331],{"class":3952},[3946,9027,4482],{"class":4262},[3946,9029,4337],{"class":3952},[3946,9031,9032],{"class":3948,"line":6743},[3946,9033,5550],{"class":3952},[3946,9035,9036],{"class":3948,"line":6754},[3946,9037,4521],{"class":3952},[3946,9039,9040],{"class":3948,"line":6768},[3946,9041,4278],{"emptyLinePlaceholder":4277},[3946,9043,9044],{"class":3948,"line":7572},[3946,9045,6908],{"class":4342},[3946,9047,9048],{"class":3948,"line":7590},[3946,9049,9050],{"class":4342},"   * Реєстрація\n",[3946,9052,9053],{"class":3948,"line":7609},[3946,9054,6918],{"class":4342},[3946,9056,9057,9059,9062,9064,9066,9068,9070,9072,9074,9076,9078],{"class":3948,"line":7615},[3946,9058,6923],{"class":4255},[3946,9060,9061],{"class":4224}," register",[3946,9063,4331],{"class":3952},[3946,9065,6443],{"class":4262},[3946,9067,3963],{"class":3952},[3946,9069,6478],{"class":4403},[3946,9071,4407],{"class":3952},[3946,9073,4410],{"class":4403},[3946,9075,4413],{"class":3952},[3946,9077,8931],{"class":4403},[3946,9079,4419],{"class":3952},[3946,9081,9082,9084],{"class":3948,"line":7633},[3946,9083,6977],{"class":4251},[3946,9085,4427],{"class":3952},[3946,9087,9088,9090,9092,9094,9096,9098,9100,9102,9104,9106,9108,9110],{"class":3948,"line":7638},[3946,9089,6984],{"class":4255},[3946,9091,8776],{"class":4286},[3946,9093,4290],{"class":3952},[3946,9095,4293],{"class":4251},[3946,9097,7377],{"class":4255},[3946,9099,4298],{"class":3952},[3946,9101,8499],{"class":4262},[3946,9103,4298],{"class":3952},[3946,9105,8960],{"class":4224},[3946,9107,4413],{"class":3952},[3946,9109,8931],{"class":4403},[3946,9111,8967],{"class":3952},[3946,9113,9114,9117],{"class":3948,"line":7644},[3946,9115,9116],{"class":3966},"        '\u002Fauth\u002Fregister'",[3946,9118,3970],{"class":3952},[3946,9120,9121],{"class":3948,"line":7677},[3946,9122,8979],{"class":4262},[3946,9124,9125],{"class":3948,"line":7682},[3946,9126,8984],{"class":3952},[3946,9128,9129],{"class":3948,"line":7694},[3946,9130,4278],{"emptyLinePlaceholder":4277},[3946,9132,9133,9135,9137,9139,9141],{"class":3948,"line":7710},[3946,9134,7405],{"class":4251},[3946,9136,8776],{"class":4262},[3946,9138,4298],{"class":3952},[3946,9140,5178],{"class":4262},[3946,9142,4272],{"class":3952},[3946,9144,9145,9147,9149,9151,9153],{"class":3948,"line":7715},[3946,9146,7115],{"class":3952},[3946,9148,4476],{"class":4251},[3946,9150,4479],{"class":3952},[3946,9152,4482],{"class":4262},[3946,9154,4318],{"class":3952},[3946,9156,9157,9159,9161,9163,9165,9167,9169],{"class":3948,"line":7720},[3946,9158,7147],{"class":4251},[3946,9160,7377],{"class":4255},[3946,9162,4298],{"class":3952},[3946,9164,9023],{"class":4224},[3946,9166,4331],{"class":3952},[3946,9168,4482],{"class":4262},[3946,9170,4337],{"class":3952},[3946,9172,9173],{"class":3948,"line":7729},[3946,9174,5550],{"class":3952},[3946,9176,9177],{"class":3948,"line":7734},[3946,9178,4521],{"class":3952},[3946,9180,9181],{"class":3948,"line":7739},[3946,9182,4278],{"emptyLinePlaceholder":4277},[3946,9184,9185],{"class":3948,"line":7744},[3946,9186,6908],{"class":4342},[3946,9188,9189],{"class":3948,"line":7750},[3946,9190,9191],{"class":4342},"   * Вихід з системи (інвалідація токену на сервері)\n",[3946,9193,9194],{"class":3948,"line":7755},[3946,9195,6918],{"class":4342},[3946,9197,9198,9200,9203,9205,9207,9209,9211],{"class":3948,"line":7765},[3946,9199,6923],{"class":4255},[3946,9201,9202],{"class":4224}," logout",[3946,9204,4550],{"class":3952},[3946,9206,4410],{"class":4403},[3946,9208,4413],{"class":3952},[3946,9210,4416],{"class":4403},[3946,9212,4419],{"class":3952},[3946,9214,9215,9217],{"class":3948,"line":7777},[3946,9216,6977],{"class":4251},[3946,9218,4427],{"class":3952},[3946,9220,9221,9223,9225,9227,9229,9231,9233,9235,9238],{"class":3948,"line":7786},[3946,9222,7069],{"class":4251},[3946,9224,7377],{"class":4255},[3946,9226,4298],{"class":3952},[3946,9228,8499],{"class":4262},[3946,9230,4298],{"class":3952},[3946,9232,8960],{"class":4224},[3946,9234,4331],{"class":3952},[3946,9236,9237],{"class":3966},"'\u002Fauth\u002Flogout'",[3946,9239,4337],{"class":3952},[3946,9241,9242,9244,9246,9248,9250],{"class":3948,"line":7799},[3946,9243,7115],{"class":3952},[3946,9245,4476],{"class":4251},[3946,9247,4479],{"class":3952},[3946,9249,4482],{"class":4262},[3946,9251,4318],{"class":3952},[3946,9253,9254],{"class":3948,"line":7818},[3946,9255,9256],{"class":4342},"      \u002F\u002F Логуємо, але не кидаємо помилку\n",[3946,9258,9259,9261,9263,9265,9267,9270,9272,9274],{"class":3948,"line":7823},[3946,9260,5525],{"class":4262},[3946,9262,4298],{"class":3952},[3946,9264,4482],{"class":4224},[3946,9266,4331],{"class":3952},[3946,9268,9269],{"class":3966},"'Помилка logout на сервері:'",[3946,9271,4447],{"class":3952},[3946,9273,4482],{"class":4262},[3946,9275,4337],{"class":3952},[3946,9277,9278],{"class":3948,"line":7834},[3946,9279,5550],{"class":3952},[3946,9281,9282],{"class":3948,"line":7850},[3946,9283,4521],{"class":3952},[3946,9285,9286],{"class":3948,"line":7855},[3946,9287,4278],{"emptyLinePlaceholder":4277},[3946,9289,9290],{"class":3948,"line":7860},[3946,9291,6908],{"class":4342},[3946,9293,9294],{"class":3948,"line":7891},[3946,9295,9296],{"class":4342},"   * Оновлення токену за допомогою refresh token\n",[3946,9298,9299],{"class":3948,"line":7896},[3946,9300,6918],{"class":4342},[3946,9302,9303,9305,9308,9310,9312,9314,9316,9318,9320,9322,9324],{"class":3948,"line":7901},[3946,9304,6923],{"class":4255},[3946,9306,9307],{"class":4224}," refreshToken",[3946,9309,4331],{"class":3952},[3946,9311,5363],{"class":4262},[3946,9313,3963],{"class":3952},[3946,9315,4404],{"class":4403},[3946,9317,4407],{"class":3952},[3946,9319,4410],{"class":4403},[3946,9321,4413],{"class":3952},[3946,9323,8931],{"class":4403},[3946,9325,4419],{"class":3952},[3946,9327,9328,9330],{"class":3948,"line":7906},[3946,9329,6977],{"class":4251},[3946,9331,4427],{"class":3952},[3946,9333,9334,9336,9338,9340,9342,9344,9346,9348,9350,9352,9354,9356],{"class":3948,"line":7912},[3946,9335,6984],{"class":4255},[3946,9337,8776],{"class":4286},[3946,9339,4290],{"class":3952},[3946,9341,4293],{"class":4251},[3946,9343,7377],{"class":4255},[3946,9345,4298],{"class":3952},[3946,9347,8499],{"class":4262},[3946,9349,4298],{"class":3952},[3946,9351,8960],{"class":4224},[3946,9353,4413],{"class":3952},[3946,9355,8931],{"class":4403},[3946,9357,8967],{"class":3952},[3946,9359,9360,9363],{"class":3948,"line":7917},[3946,9361,9362],{"class":3966},"        '\u002Fauth\u002Frefresh'",[3946,9364,3970],{"class":3952},[3946,9366,9367,9370,9372],{"class":3948,"line":7935},[3946,9368,9369],{"class":3952},"        { ",[3946,9371,5363],{"class":4262},[3946,9373,9374],{"class":3952}," }\n",[3946,9376,9377],{"class":3948,"line":7942},[3946,9378,8984],{"class":3952},[3946,9380,9381],{"class":3948,"line":7963},[3946,9382,4278],{"emptyLinePlaceholder":4277},[3946,9384,9385,9387,9389,9391,9393],{"class":3948,"line":7979},[3946,9386,7405],{"class":4251},[3946,9388,8776],{"class":4262},[3946,9390,4298],{"class":3952},[3946,9392,5178],{"class":4262},[3946,9394,4272],{"class":3952},[3946,9396,9397,9399,9401,9403,9405],{"class":3948,"line":7992},[3946,9398,7115],{"class":3952},[3946,9400,4476],{"class":4251},[3946,9402,4479],{"class":3952},[3946,9404,4482],{"class":4262},[3946,9406,4318],{"class":3952},[3946,9408,9409,9411,9413,9415,9417,9419,9421],{"class":3948,"line":8012},[3946,9410,7147],{"class":4251},[3946,9412,7377],{"class":4255},[3946,9414,4298],{"class":3952},[3946,9416,9023],{"class":4224},[3946,9418,4331],{"class":3952},[3946,9420,4482],{"class":4262},[3946,9422,4337],{"class":3952},[3946,9424,9425],{"class":3948,"line":8018},[3946,9426,5550],{"class":3952},[3946,9428,9429],{"class":3948,"line":8023},[3946,9430,4521],{"class":3952},[3946,9432,9433],{"class":3948,"line":8028},[3946,9434,4278],{"emptyLinePlaceholder":4277},[3946,9436,9437],{"class":3948,"line":8033},[3946,9438,6908],{"class":4342},[3946,9440,9441],{"class":3948,"line":8038},[3946,9442,9443],{"class":4342},"   * Отримання інформації про поточного користувача\n",[3946,9445,9446],{"class":3948,"line":8044},[3946,9447,6918],{"class":4342},[3946,9449,9450,9452,9455,9457,9459,9461,9463],{"class":3948,"line":8049},[3946,9451,6923],{"class":4255},[3946,9453,9454],{"class":4224}," getCurrentUser",[3946,9456,4550],{"class":3952},[3946,9458,4410],{"class":4403},[3946,9460,4413],{"class":3952},[3946,9462,6257],{"class":4403},[3946,9464,4419],{"class":3952},[3946,9466,9467,9469],{"class":3948,"line":8071},[3946,9468,6977],{"class":4251},[3946,9470,4427],{"class":3952},[3946,9472,9473,9475,9477,9479,9481,9483,9485,9487,9489,9492,9494,9496,9499,9502],{"class":3948,"line":8090},[3946,9474,6984],{"class":4255},[3946,9476,8776],{"class":4286},[3946,9478,4290],{"class":3952},[3946,9480,4293],{"class":4251},[3946,9482,7377],{"class":4255},[3946,9484,4298],{"class":3952},[3946,9486,8499],{"class":4262},[3946,9488,4298],{"class":3952},[3946,9490,9491],{"class":4224},"get",[3946,9493,4413],{"class":3952},[3946,9495,6257],{"class":4403},[3946,9497,9498],{"class":3952},">(",[3946,9500,9501],{"class":3966},"'\u002Fauth\u002Fme'",[3946,9503,4337],{"class":3952},[3946,9505,9506,9508,9510,9512,9514],{"class":3948,"line":8095},[3946,9507,7405],{"class":4251},[3946,9509,8776],{"class":4262},[3946,9511,4298],{"class":3952},[3946,9513,5178],{"class":4262},[3946,9515,4272],{"class":3952},[3946,9517,9518,9520,9522,9524,9526],{"class":3948,"line":8112},[3946,9519,7115],{"class":3952},[3946,9521,4476],{"class":4251},[3946,9523,4479],{"class":3952},[3946,9525,4482],{"class":4262},[3946,9527,4318],{"class":3952},[3946,9529,9530,9532,9534,9536,9538,9540,9542],{"class":3948,"line":8117},[3946,9531,7147],{"class":4251},[3946,9533,7377],{"class":4255},[3946,9535,4298],{"class":3952},[3946,9537,9023],{"class":4224},[3946,9539,4331],{"class":3952},[3946,9541,4482],{"class":4262},[3946,9543,4337],{"class":3952},[3946,9545,9546],{"class":3948,"line":8160},[3946,9547,5550],{"class":3952},[3946,9549,9550],{"class":3948,"line":8185},[3946,9551,4521],{"class":3952},[3946,9553,9554],{"class":3948,"line":8190},[3946,9555,4278],{"emptyLinePlaceholder":4277},[3946,9557,9558],{"class":3948,"line":8195},[3946,9559,6908],{"class":4342},[3946,9561,9562],{"class":3948,"line":8200},[3946,9563,9564],{"class":4342},"   * Валідація токену на сервері\n",[3946,9566,9567],{"class":3948,"line":8206},[3946,9568,6918],{"class":4342},[3946,9570,9572,9574,9577,9579,9581,9583,9585],{"class":3948,"line":9571},142,[3946,9573,6923],{"class":4255},[3946,9575,9576],{"class":4224}," validateToken",[3946,9578,4550],{"class":3952},[3946,9580,4410],{"class":4403},[3946,9582,4413],{"class":3952},[3946,9584,4848],{"class":4403},[3946,9586,4419],{"class":3952},[3946,9588,9590,9592],{"class":3948,"line":9589},143,[3946,9591,6977],{"class":4251},[3946,9593,4427],{"class":3952},[3946,9595,9597,9599,9601,9603,9605,9607,9609,9611,9614],{"class":3948,"line":9596},144,[3946,9598,7069],{"class":4251},[3946,9600,7377],{"class":4255},[3946,9602,4298],{"class":3952},[3946,9604,8499],{"class":4262},[3946,9606,4298],{"class":3952},[3946,9608,9491],{"class":4224},[3946,9610,4331],{"class":3952},[3946,9612,9613],{"class":3966},"'\u002Fauth\u002Fvalidate'",[3946,9615,4337],{"class":3952},[3946,9617,9619,9621,9623],{"class":3948,"line":9618},145,[3946,9620,7405],{"class":4251},[3946,9622,4960],{"class":4255},[3946,9624,4272],{"class":3952},[3946,9626,9628,9630,9632],{"class":3948,"line":9627},146,[3946,9629,7115],{"class":3952},[3946,9631,4476],{"class":4251},[3946,9633,4427],{"class":3952},[3946,9635,9637,9639,9641],{"class":3948,"line":9636},147,[3946,9638,7405],{"class":4251},[3946,9640,7628],{"class":4255},[3946,9642,4272],{"class":3952},[3946,9644,9646],{"class":3948,"line":9645},148,[3946,9647,5550],{"class":3952},[3946,9649,9651],{"class":3948,"line":9650},149,[3946,9652,4521],{"class":3952},[3946,9654,9656],{"class":3948,"line":9655},150,[3946,9657,4278],{"emptyLinePlaceholder":4277},[3946,9659,9661],{"class":3948,"line":9660},151,[3946,9662,6908],{"class":4342},[3946,9664,9666],{"class":3948,"line":9665},152,[3946,9667,9668],{"class":4342},"   * Уніфікована обробка помилок\n",[3946,9670,9672],{"class":3948,"line":9671},153,[3946,9673,6918],{"class":4342},[3946,9675,9677,9679,9682,9684,9686,9688,9691,9693,9696],{"class":3948,"line":9676},154,[3946,9678,8470],{"class":4255},[3946,9680,9681],{"class":4224}," handleError",[3946,9683,4331],{"class":3952},[3946,9685,4482],{"class":4262},[3946,9687,3963],{"class":3952},[3946,9689,9690],{"class":4403},"unknown",[3946,9692,4407],{"class":3952},[3946,9694,9695],{"class":4403},"Error",[3946,9697,4427],{"class":3952},[3946,9699,9701,9703,9705,9707,9709,9712,9714,9716],{"class":3948,"line":9700},155,[3946,9702,5503],{"class":4251},[3946,9704,4479],{"class":3952},[3946,9706,8504],{"class":4262},[3946,9708,4298],{"class":3952},[3946,9710,9711],{"class":4224},"isAxiosError",[3946,9713,4331],{"class":3952},[3946,9715,4482],{"class":4262},[3946,9717,9718],{"class":3952},")) {\n",[3946,9720,9722,9724,9727,9729,9731,9733,9735,9737,9739,9741,9743,9746,9748,9750,9752],{"class":3948,"line":9721},156,[3946,9723,6984],{"class":4255},[3946,9725,9726],{"class":4286}," message",[3946,9728,4290],{"class":3952},[3946,9730,4482],{"class":4262},[3946,9732,4298],{"class":3952},[3946,9734,8757],{"class":4262},[3946,9736,7539],{"class":3952},[3946,9738,5178],{"class":4262},[3946,9740,7539],{"class":3952},[3946,9742,5543],{"class":4262},[3946,9744,9745],{"class":3952}," || ",[3946,9747,4482],{"class":4262},[3946,9749,4298],{"class":3952},[3946,9751,5543],{"class":4262},[3946,9753,4272],{"class":3952},[3946,9755,9757,9759,9762,9764,9766,9768,9770,9772,9774],{"class":3948,"line":9756},157,[3946,9758,6984],{"class":4255},[3946,9760,9761],{"class":4286}," status",[3946,9763,4290],{"class":3952},[3946,9765,4482],{"class":4262},[3946,9767,4298],{"class":3952},[3946,9769,8757],{"class":4262},[3946,9771,7539],{"class":3952},[3946,9773,8813],{"class":4262},[3946,9775,4272],{"class":3952},[3946,9777,9779],{"class":3948,"line":9778},158,[3946,9780,4278],{"emptyLinePlaceholder":4277},[3946,9782,9784],{"class":3948,"line":9783},159,[3946,9785,9786],{"class":4342},"      \u002F\u002F Специфічні повідомлення для різних статусів\n",[3946,9788,9790,9793,9795,9797],{"class":3948,"line":9789},160,[3946,9791,9792],{"class":4251},"      switch",[3946,9794,4479],{"class":3952},[3946,9796,8813],{"class":4262},[3946,9798,4318],{"class":3952},[3946,9800,9802,9805,9808],{"class":3948,"line":9801},161,[3946,9803,9804],{"class":4251},"        case",[3946,9806,9807],{"class":4020}," 400",[3946,9809,9810],{"class":3952},":\n",[3946,9812,9814,9817,9819,9821,9823,9826],{"class":3948,"line":9813},162,[3946,9815,9816],{"class":4251},"          return",[3946,9818,7150],{"class":4255},[3946,9820,5513],{"class":4224},[3946,9822,4331],{"class":3952},[3946,9824,9825],{"class":3966},"'Невірні дані. Перевірте введену інформацію.'",[3946,9827,4337],{"class":3952},[3946,9829,9831,9833,9836],{"class":3948,"line":9830},163,[3946,9832,9804],{"class":4251},[3946,9834,9835],{"class":4020}," 401",[3946,9837,9810],{"class":3952},[3946,9839,9841,9843,9845,9847,9849,9852],{"class":3948,"line":9840},164,[3946,9842,9816],{"class":4251},[3946,9844,7150],{"class":4255},[3946,9846,5513],{"class":4224},[3946,9848,4331],{"class":3952},[3946,9850,9851],{"class":3966},"'Невірний email або пароль.'",[3946,9853,4337],{"class":3952},[3946,9855,9857,9859,9862],{"class":3948,"line":9856},165,[3946,9858,9804],{"class":4251},[3946,9860,9861],{"class":4020}," 403",[3946,9863,9810],{"class":3952},[3946,9865,9867,9869,9871,9873,9875,9878],{"class":3948,"line":9866},166,[3946,9868,9816],{"class":4251},[3946,9870,7150],{"class":4255},[3946,9872,5513],{"class":4224},[3946,9874,4331],{"class":3952},[3946,9876,9877],{"class":3966},"'Доступ заборонено.'",[3946,9879,4337],{"class":3952},[3946,9881,9883,9885,9888],{"class":3948,"line":9882},167,[3946,9884,9804],{"class":4251},[3946,9886,9887],{"class":4020}," 404",[3946,9889,9810],{"class":3952},[3946,9891,9893,9895,9897,9899,9901,9904],{"class":3948,"line":9892},168,[3946,9894,9816],{"class":4251},[3946,9896,7150],{"class":4255},[3946,9898,5513],{"class":4224},[3946,9900,4331],{"class":3952},[3946,9902,9903],{"class":3966},"'Користувача не знайдено.'",[3946,9905,4337],{"class":3952},[3946,9907,9909,9911,9914],{"class":3948,"line":9908},169,[3946,9910,9804],{"class":4251},[3946,9912,9913],{"class":4020}," 409",[3946,9915,9810],{"class":3952},[3946,9917,9919,9921,9923,9925,9927,9930],{"class":3948,"line":9918},170,[3946,9920,9816],{"class":4251},[3946,9922,7150],{"class":4255},[3946,9924,5513],{"class":4224},[3946,9926,4331],{"class":3952},[3946,9928,9929],{"class":3966},"'Користувач з таким email вже існує.'",[3946,9931,4337],{"class":3952},[3946,9933,9935,9937,9940],{"class":3948,"line":9934},171,[3946,9936,9804],{"class":4251},[3946,9938,9939],{"class":4020}," 429",[3946,9941,9810],{"class":3952},[3946,9943,9945,9947,9949,9951,9953,9956],{"class":3948,"line":9944},172,[3946,9946,9816],{"class":4251},[3946,9948,7150],{"class":4255},[3946,9950,5513],{"class":4224},[3946,9952,4331],{"class":3952},[3946,9954,9955],{"class":3966},"'Занадто багато спроб. Спробуйте пізніше.'",[3946,9957,4337],{"class":3952},[3946,9959,9961,9963,9966],{"class":3948,"line":9960},173,[3946,9962,9804],{"class":4251},[3946,9964,9965],{"class":4020}," 500",[3946,9967,9810],{"class":3952},[3946,9969,9971,9973,9975,9977,9979,9982],{"class":3948,"line":9970},174,[3946,9972,9816],{"class":4251},[3946,9974,7150],{"class":4255},[3946,9976,5513],{"class":4224},[3946,9978,4331],{"class":3952},[3946,9980,9981],{"class":3966},"'Помилка сервера. Спробуйте пізніше.'",[3946,9983,4337],{"class":3952},[3946,9985,9987,9990],{"class":3948,"line":9986},175,[3946,9988,9989],{"class":4251},"        default",[3946,9991,9810],{"class":3952},[3946,9993,9995,9997,9999,10001,10003,10005,10007,10010],{"class":3948,"line":9994},176,[3946,9996,9816],{"class":4251},[3946,9998,7150],{"class":4255},[3946,10000,5513],{"class":4224},[3946,10002,4331],{"class":3952},[3946,10004,5543],{"class":4262},[3946,10006,9745],{"class":3952},[3946,10008,10009],{"class":3966},"'Невідома помилка мережі'",[3946,10011,4337],{"class":3952},[3946,10013,10015],{"class":3948,"line":10014},177,[3946,10016,7282],{"class":3952},[3946,10018,10020],{"class":3948,"line":10019},178,[3946,10021,5550],{"class":3952},[3946,10023,10025],{"class":3948,"line":10024},179,[3946,10026,4278],{"emptyLinePlaceholder":4277},[3946,10028,10030,10032,10034,10036,10038,10040],{"class":3948,"line":10029},180,[3946,10031,5503],{"class":4251},[3946,10033,4479],{"class":3952},[3946,10035,4482],{"class":4262},[3946,10037,5510],{"class":4255},[3946,10039,5513],{"class":4403},[3946,10041,4318],{"class":3952},[3946,10043,10045,10047,10049],{"class":3948,"line":10044},181,[3946,10046,7405],{"class":4251},[3946,10048,4513],{"class":4262},[3946,10050,4272],{"class":3952},[3946,10052,10054],{"class":3948,"line":10053},182,[3946,10055,5550],{"class":3952},[3946,10057,10059],{"class":3948,"line":10058},183,[3946,10060,4278],{"emptyLinePlaceholder":4277},[3946,10062,10064,10066,10068,10070,10072,10075],{"class":3948,"line":10063},184,[3946,10065,4603],{"class":4251},[3946,10067,7150],{"class":4255},[3946,10069,5513],{"class":4224},[3946,10071,4331],{"class":3952},[3946,10073,10074],{"class":3966},"'Невідома помилка'",[3946,10076,4337],{"class":3952},[3946,10078,10080],{"class":3948,"line":10079},185,[3946,10081,4521],{"class":3952},[3946,10083,10085],{"class":3948,"line":10084},186,[3946,10086,4040],{"class":3952},[3946,10088,10090],{"class":3948,"line":10089},187,[3946,10091,4278],{"emptyLinePlaceholder":4277},[3946,10093,10095],{"class":3948,"line":10094},188,[3946,10096,8203],{"class":4342},[3946,10098,10100,10102,10104,10107,10109,10111,10113],{"class":3948,"line":10099},189,[3946,10101,6030],{"class":4251},[3946,10103,5933],{"class":4255},[3946,10105,10106],{"class":4286}," authApi",[3946,10108,4290],{"class":3952},[3946,10110,8218],{"class":4255},[3946,10112,8463],{"class":4224},[3946,10114,4304],{"class":3952},[3743,10116,10117],{},[3771,10118,10119],{},"Ключові аспекти цієї реалізації:",[3765,10121,10122,10135,10148,10161],{},[3768,10123,10124,10127],{},[3771,10125,10126],{},"Axios Interceptors:",[3878,10128,10129,10132],{},[3768,10130,10131],{},"Request interceptor автоматично додає токен до всіх запитів",[3768,10133,10134],{},"Response interceptor обробляє 401 помилки глобально",[3768,10136,10137,10140],{},[3771,10138,10139],{},"Централізована обробка помилок:",[3878,10141,10142,10145],{},[3768,10143,10144],{},"Користувач бачить зрозумілі повідомлення",[3768,10146,10147],{},"Різні статус коди обробляються по-різному",[3768,10149,10150,10153],{},[3771,10151,10152],{},"Type Safety:",[3878,10154,10155,10158],{},[3768,10156,10157],{},"Всі методи типізовані",[3768,10159,10160],{},"Response data валідується TypeScript",[3768,10162,10163,10166],{},[3771,10164,10165],{},"Environment-aware:",[3878,10167,10168],{},[3768,10169,10170],{},"Різні URL для development та production",[3811,10172],{},[3738,10174,10176],{"id":10175},"розділ-4-auth-context-глобальний-стан","Розділ 4: Auth Context — Глобальний Стан",[3750,10178,10180],{"id":10179},"_41-архітектура-context","4.1. Архітектура Context",[3743,10182,10183],{},"Auth Context — це серце нашої системи автентифікації. Він забезпечує:",[3878,10185,10186,10192,10197,10203],{},[3768,10187,10188,10191],{},[3771,10189,10190],{},"Глобальний стан"," користувача",[3768,10193,10194,10196],{},[3771,10195,48],{}," для login\u002Flogout\u002Fregister",[3768,10198,10199,10202],{},[3771,10200,10201],{},"Автоматичне відновлення"," сесії при запуску",[3768,10204,10205,10208],{},[3771,10206,10207],{},"Реактивність"," — всі компоненти автоматично оновлюються",[3743,10210,10211],{},[3771,10212,10213],{},"Діаграма потоку:",[3857,10215,10218],{"className":10216,"code":10217,"language":3862},[3860],"App Start\n   ↓\nAuthProvider init\n   ↓\nCheck SecureStore for tokens\n   ↓\n   ├─ Tokens found & valid → Fetch user data → Set authenticated\n   └─ No tokens \u002F invalid → Set unauthenticated\n   ↓\nRender navigation tree\n   ↓\n   ├─ Authenticated → AppNavigator (main screens)\n   └─ Unauthenticated → AuthNavigator (login\u002Fregister)\n",[3782,10219,10217],{"__ignoreMap":3865},[3750,10221,10223],{"id":10222},"_42-реалізація-authcontext","4.2. Реалізація AuthContext",[3857,10225,10227],{"className":4242,"code":10226,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext.tsx\n\nimport React, {\n  createContext,\n  useContext,\n  useEffect,\n  useState,\n  useCallback,\n  useMemo,\n  ReactNode,\n} from 'react';\nimport type {\n  AuthContextValue,\n  AuthState,\n  LoginCredentials,\n  RegisterCredentials,\n  User,\n} from '..\u002Ftypes\u002Fauth.types';\nimport { authApi } from '..\u002Fapi\u002FauthApi';\nimport { tokenService } from '..\u002Fservices\u002FtokenService';\n\n\u002F**\n * Context для автентифікації\n *\u002F\nconst AuthContext = createContext\u003CAuthContextValue | undefined>(undefined);\n\n\u002F**\n * Props для Provider\n *\u002F\ninterface AuthProviderProps {\n  children: ReactNode;\n}\n\n\u002F**\n * Provider компонент для автентифікації\n *\u002F\nexport function AuthProvider({ children }: AuthProviderProps) {\n  \u002F\u002F Стан автентифікації\n  const [state, setState] = useState\u003CAuthState>({\n    user: null,\n    isAuthenticated: false,\n    isLoading: true, \u002F\u002F Початково true, поки перевіряємо токени\n    error: null,\n  });\n\n  \u002F**\n   * Оновлення стану (helper)\n   *\u002F\n  const updateState = useCallback((updates: Partial\u003CAuthState>) => {\n    setState((prev) => ({ ...prev, ...updates }));\n  }, []);\n\n  \u002F**\n   * Очищення помилки\n   *\u002F\n  const clearError = useCallback(() => {\n    updateState({ error: null });\n  }, [updateState]);\n\n  \u002F**\n   * Встановлення автентифікації\n   *\u002F\n  const setAuthenticated = useCallback(\n    (user: User) => {\n      updateState({\n        user,\n        isAuthenticated: true,\n        isLoading: false,\n        error: null,\n      });\n      console.log('✅ Користувач автентифікований:', user.email);\n    },\n    [updateState]\n  );\n\n  \u002F**\n   * Скидання автентифікації\n   *\u002F\n  const setUnauthenticated = useCallback(() => {\n    updateState({\n      user: null,\n      isAuthenticated: false,\n      isLoading: false,\n    });\n    console.log('🔓 Користувач деавтентифікований');\n  }, [updateState]);\n\n  \u002F**\n   * Відновлення сесії з SecureStore\n   *\u002F\n  const restoreSession = useCallback(async () => {\n    console.log('🔄 Спроба відновлення сесії...');\n    \n    try {\n      \u002F\u002F Перевіряємо наявність токенів\n      const tokens = await tokenService.getTokens();\n      \n      if (!tokens) {\n        console.log('ℹ️ Токени не знайдено');\n        setUnauthenticated();\n        return;\n      }\n\n      \u002F\u002F Перевіряємо валідність токену\n      const isValid = await tokenService.isTokenValid();\n      \n      if (!isValid) {\n        console.log('⏰ Токен закінчився');\n        await tokenService.clearTokens();\n        setUnauthenticated();\n        return;\n      }\n\n      \u002F\u002F Отримуємо дані користувача з сервера\n      const user = await authApi.getCurrentUser();\n      \n      setAuthenticated(user);\n    } catch (error) {\n      console.error('❌ Помилка відновлення сесії:', error);\n      \u002F\u002F Очищаємо невалідні токени\n      await tokenService.clearTokens();\n      setUnauthenticated();\n    }\n  }, [setAuthenticated, setUnauthenticated]);\n\n  \u002F**\n   * Вхід в систему\n   *\u002F\n  const login = useCallback(\n    async (credentials: LoginCredentials) => {\n      try {\n        updateState({ isLoading: true, error: null });\n\n        \u002F\u002F Запит до API\n        const response = await authApi.login(credentials);\n\n        \u002F\u002F Зберігаємо токени\n        await tokenService.saveTokens(\n          response.accessToken,\n          response.refreshToken,\n          response.expiresIn\n        );\n\n        \u002F\u002F Оновлюємо стан\n        setAuthenticated(response.user);\n      } catch (error) {\n        const errorMessage =\n          error instanceof Error ? error.message : 'Помилка входу в систему';\n        \n        updateState({\n          error: errorMessage,\n          isLoading: false,\n        });\n        \n        throw error;\n      }\n    },\n    [updateState, setAuthenticated]\n  );\n\n  \u002F**\n   * Реєстрація\n   *\u002F\n  const register = useCallback(\n    async (credentials: RegisterCredentials) => {\n      try {\n        updateState({ isLoading: true, error: null });\n\n        \u002F\u002F Запит до API\n        const response = await authApi.register(credentials);\n\n        \u002F\u002F Зберігаємо токени\n        await tokenService.saveTokens(\n          response.accessToken,\n          response.refreshToken,\n          response.expiresIn\n        );\n\n        \u002F\u002F Оновлюємо стан\n        setAuthenticated(response.user);\n      } catch (error) {\n        const errorMessage =\n          error instanceof Error ? error.message : 'Помилка реєстрації';\n        \n        updateState({\n          error: errorMessage,\n          isLoading: false,\n        });\n        \n        throw error;\n      }\n    },\n    [updateState, setAuthenticated]\n  );\n\n  \u002F**\n   * Вихід з системи\n   *\u002F\n  const logout = useCallback(async () => {\n    try {\n      updateState({ isLoading: true });\n\n      \u002F\u002F Інвалідуємо токен на сервері\n      await authApi.logout();\n    } catch (error) {\n      console.error('Помилка logout на сервері:', error);\n      \u002F\u002F Продовжуємо logout локально навіть при помилці\n    } finally {\n      \u002F\u002F Видаляємо токени з SecureStore\n      await tokenService.clearTokens();\n      \n      \u002F\u002F Оновлюємо стан\n      setUnauthenticated();\n    }\n  }, [updateState, setUnauthenticated]);\n\n  \u002F**\n   * Оновлення сесії (refresh token)\n   *\u002F\n  const refreshSession = useCallback(async () => {\n    try {\n      const tokens = await tokenService.getTokens();\n      \n      if (!tokens?.refreshToken) {\n        throw new Error('Refresh token не знайдено');\n      }\n\n      const response = await authApi.refreshToken(tokens.refreshToken);\n\n      await tokenService.saveTokens(\n        response.accessToken,\n        response.refreshToken,\n        response.expiresIn\n      );\n\n      setAuthenticated(response.user);\n    } catch (error) {\n      console.error('❌ Помилка оновлення сесії:', error);\n      await tokenService.clearTokens();\n      setUnauthenticated();\n      throw error;\n    }\n  }, [setAuthenticated, setUnauthenticated]);\n\n  \u002F**\n   * Відновлення сесії при старті додатку\n   *\u002F\n  useEffect(() => {\n    restoreSession();\n  }, [restoreSession]);\n\n  \u002F**\n   * Мемоїзоване значення контексту\n   *\u002F\n  const value = useMemo\u003CAuthContextValue>(\n    () => ({\n      ...state,\n      login,\n      register,\n      logout,\n      refreshSession,\n      clearError,\n    }),\n    [state, login, register, logout, refreshSession, clearError]\n  );\n\n  return \u003CAuthContext.Provider value={value}>{children}\u003C\u002FAuthContext.Provider>;\n}\n\n\u002F**\n * Hook для використання Auth Context\n *\u002F\nexport function useAuth(): AuthContextValue {\n  const context = useContext(AuthContext);\n\n  if (!context) {\n    throw new Error('useAuth must be used within AuthProvider');\n  }\n\n  return context;\n}\n",[3782,10228,10229,10234,10238,10247,10254,10261,10268,10275,10282,10289,10296,10307,10315,10322,10329,10335,10341,10347,10357,10375,10391,10395,10399,10404,10408,10436,10440,10444,10449,10453,10462,10474,10478,10482,10486,10491,10495,10518,10523,10552,10561,10570,10582,10591,10595,10599,10603,10608,10612,10645,10672,10677,10681,10685,10690,10694,10712,10727,10738,10742,10746,10751,10755,10768,10786,10793,10800,10809,10818,10827,10832,10856,10861,10871,10876,10880,10884,10889,10893,10910,10916,10925,10934,10943,10947,10962,10970,10974,10978,10983,10987,11009,11024,11028,11034,11039,11057,11061,11071,11085,11092,11098,11102,11106,11111,11130,11134,11144,11158,11170,11176,11182,11186,11190,11195,11215,11219,11230,11242,11261,11266,11278,11285,11289,11303,11307,11311,11315,11319,11331,11350,11357,11377,11381,11386,11409,11413,11418,11430,11441,11451,11460,11465,11469,11474,11489,11502,11512,11538,11542,11548,11557,11566,11571,11575,11584,11588,11592,11604,11608,11612,11616,11620,11624,11636,11654,11660,11678,11682,11686,11709,11713,11717,11729,11739,11749,11757,11761,11765,11769,11783,11795,11803,11826,11830,11836,11844,11852,11856,11860,11869,11874,11879,11892,11897,11902,11907,11913,11918,11939,11946,11959,11964,11970,11984,11997,12016,12022,12032,12038,12051,12056,12062,12069,12074,12087,12092,12097,12103,12108,12130,12137,12156,12161,12176,12192,12197,12202,12229,12234,12247,12259,12270,12279,12284,12289,12304,12317,12337,12350,12357,12366,12371,12384,12389,12394,12400,12405,12416,12424,12434,12439,12444,12450,12455,12474,12485,12495,12503,12511,12519,12527,12535,12541,12572,12577,12582,12622,12627,12632,12637,12643,12648,12664,12683,12688,12700,12716,12721,12726,12735],{"__ignoreMap":3865},[3946,10230,10231],{"class":3948,"line":3949},[3946,10232,10233],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext.tsx\n",[3946,10235,10236],{"class":3948,"line":3956},[3946,10237,4278],{"emptyLinePlaceholder":4277},[3946,10239,10240,10242,10245],{"class":3948,"line":3973},[3946,10241,4252],{"class":4251},[3946,10243,10244],{"class":4262}," React",[3946,10246,4952],{"class":3952},[3946,10248,10249,10252],{"class":3948,"line":3986},[3946,10250,10251],{"class":4262},"  createContext",[3946,10253,3970],{"class":3952},[3946,10255,10256,10259],{"class":3948,"line":3999},[3946,10257,10258],{"class":4262},"  useContext",[3946,10260,3970],{"class":3952},[3946,10262,10263,10266],{"class":3948,"line":4012},[3946,10264,10265],{"class":4262},"  useEffect",[3946,10267,3970],{"class":3952},[3946,10269,10270,10273],{"class":3948,"line":4026},[3946,10271,10272],{"class":4262},"  useState",[3946,10274,3970],{"class":3952},[3946,10276,10277,10280],{"class":3948,"line":4037},[3946,10278,10279],{"class":4262},"  useCallback",[3946,10281,3970],{"class":3952},[3946,10283,10284,10287],{"class":3948,"line":4487},[3946,10285,10286],{"class":4262},"  useMemo",[3946,10288,3970],{"class":3952},[3946,10290,10291,10294],{"class":3948,"line":4507},[3946,10292,10293],{"class":4262},"  ReactNode",[3946,10295,3970],{"class":3952},[3946,10297,10298,10300,10302,10305],{"class":3948,"line":4518},[3946,10299,5928],{"class":3952},[3946,10301,6826],{"class":4251},[3946,10303,10304],{"class":3966}," 'react'",[3946,10306,4272],{"class":3952},[3946,10308,10309,10311,10313],{"class":3948,"line":4524},[3946,10310,4252],{"class":4251},[3946,10312,6814],{"class":4251},[3946,10314,4427],{"class":3952},[3946,10316,10317,10320],{"class":3948,"line":4529},[3946,10318,10319],{"class":4262},"  AuthContextValue",[3946,10321,3970],{"class":3952},[3946,10323,10324,10327],{"class":3948,"line":4534},[3946,10325,10326],{"class":4262},"  AuthState",[3946,10328,3970],{"class":3952},[3946,10330,10331,10333],{"class":3948,"line":4540},[3946,10332,8327],{"class":4262},[3946,10334,3970],{"class":3952},[3946,10336,10337,10339],{"class":3948,"line":4567},[3946,10338,8334],{"class":4262},[3946,10340,3970],{"class":3952},[3946,10342,10343,10345],{"class":3948,"line":4574},[3946,10344,8341],{"class":4262},[3946,10346,3970],{"class":3952},[3946,10348,10349,10351,10353,10355],{"class":3948,"line":4600},[3946,10350,5928],{"class":3952},[3946,10352,6826],{"class":4251},[3946,10354,6829],{"class":3966},[3946,10356,4272],{"class":3952},[3946,10358,10359,10361,10363,10366,10368,10370,10373],{"class":3948,"line":4610},[3946,10360,4252],{"class":4251},[3946,10362,6817],{"class":3952},[3946,10364,10365],{"class":4262},"authApi",[3946,10367,6823],{"class":3952},[3946,10369,6826],{"class":4251},[3946,10371,10372],{"class":3966}," '..\u002Fapi\u002FauthApi'",[3946,10374,4272],{"class":3952},[3946,10376,10377,10379,10381,10383,10385,10387,10389],{"class":3948,"line":4623},[3946,10378,4252],{"class":4251},[3946,10380,6817],{"class":3952},[3946,10382,8362],{"class":4262},[3946,10384,6823],{"class":3952},[3946,10386,6826],{"class":4251},[3946,10388,8369],{"class":3966},[3946,10390,4272],{"class":3952},[3946,10392,10393],{"class":3948,"line":4643},[3946,10394,4278],{"emptyLinePlaceholder":4277},[3946,10396,10397],{"class":3948,"line":4653},[3946,10398,6015],{"class":4342},[3946,10400,10401],{"class":3948,"line":4658},[3946,10402,10403],{"class":4342}," * Context для автентифікації\n",[3946,10405,10406],{"class":3948,"line":4663},[3946,10407,6025],{"class":4342},[3946,10409,10410,10412,10415,10417,10420,10422,10425,10427,10430,10432,10434],{"class":3948,"line":4668},[3946,10411,4283],{"class":4255},[3946,10413,10414],{"class":4286}," AuthContext",[3946,10416,4290],{"class":3952},[3946,10418,10419],{"class":4224},"createContext",[3946,10421,4413],{"class":3952},[3946,10423,10424],{"class":4403},"AuthContextValue",[3946,10426,4559],{"class":3952},[3946,10428,10429],{"class":4403},"undefined",[3946,10431,9498],{"class":3952},[3946,10433,10429],{"class":4255},[3946,10435,4337],{"class":3952},[3946,10437,10438],{"class":3948,"line":4674},[3946,10439,4278],{"emptyLinePlaceholder":4277},[3946,10441,10442],{"class":3948,"line":4694},[3946,10443,6015],{"class":4342},[3946,10445,10446],{"class":3948,"line":4701},[3946,10447,10448],{"class":4342}," * Props для Provider\n",[3946,10450,10451],{"class":3948,"line":4719},[3946,10452,6025],{"class":4342},[3946,10454,10455,10457,10460],{"class":3948,"line":4735},[3946,10456,4801],{"class":4255},[3946,10458,10459],{"class":4403}," AuthProviderProps",[3946,10461,4427],{"class":3952},[3946,10463,10464,10467,10469,10472],{"class":3948,"line":4748},[3946,10465,10466],{"class":4262},"  children",[3946,10468,3963],{"class":3952},[3946,10470,10471],{"class":4403},"ReactNode",[3946,10473,4272],{"class":3952},[3946,10475,10476],{"class":3948,"line":4768},[3946,10477,4040],{"class":3952},[3946,10479,10480],{"class":3948,"line":4777},[3946,10481,4278],{"emptyLinePlaceholder":4277},[3946,10483,10484],{"class":3948,"line":4782},[3946,10485,6015],{"class":4342},[3946,10487,10488],{"class":3948,"line":6262},[3946,10489,10490],{"class":4342}," * Provider компонент для автентифікації\n",[3946,10492,10493],{"class":3948,"line":6273},[3946,10494,6025],{"class":4342},[3946,10496,10497,10499,10501,10504,10507,10510,10513,10516],{"class":3948,"line":6284},[3946,10498,6030],{"class":4251},[3946,10500,4390],{"class":4255},[3946,10502,10503],{"class":4224}," AuthProvider",[3946,10505,10506],{"class":3952},"({ ",[3946,10508,10509],{"class":4262},"children",[3946,10511,10512],{"class":3952}," }: ",[3946,10514,10515],{"class":4403},"AuthProviderProps",[3946,10517,4318],{"class":3952},[3946,10519,10520],{"class":3948,"line":6299},[3946,10521,10522],{"class":4342},"  \u002F\u002F Стан автентифікації\n",[3946,10524,10525,10527,10530,10533,10535,10538,10541,10544,10546,10549],{"class":3948,"line":6304},[3946,10526,5018],{"class":4255},[3946,10528,10529],{"class":3952}," [",[3946,10531,10532],{"class":4286},"state",[3946,10534,4447],{"class":3952},[3946,10536,10537],{"class":4286},"setState",[3946,10539,10540],{"class":3952},"] = ",[3946,10542,10543],{"class":4224},"useState",[3946,10545,4413],{"class":3952},[3946,10547,10548],{"class":4403},"AuthState",[3946,10550,10551],{"class":3952},">({\n",[3946,10553,10554,10557,10559],{"class":3948,"line":6309},[3946,10555,10556],{"class":4262},"    user:",[3946,10558,4648],{"class":4255},[3946,10560,3970],{"class":3952},[3946,10562,10563,10566,10568],{"class":3948,"line":6314},[3946,10564,10565],{"class":4262},"    isAuthenticated:",[3946,10567,7628],{"class":4255},[3946,10569,3970],{"class":3952},[3946,10571,10572,10575,10577,10579],{"class":3948,"line":6320},[3946,10573,10574],{"class":4262},"    isLoading:",[3946,10576,4960],{"class":4255},[3946,10578,4447],{"class":3952},[3946,10580,10581],{"class":4342},"\u002F\u002F Початково true, поки перевіряємо токени\n",[3946,10583,10584,10587,10589],{"class":3948,"line":6325},[3946,10585,10586],{"class":4262},"    error:",[3946,10588,4648],{"class":4255},[3946,10590,3970],{"class":3952},[3946,10592,10593],{"class":3948,"line":6337},[3946,10594,4977],{"class":3952},[3946,10596,10597],{"class":3948,"line":6352},[3946,10598,4278],{"emptyLinePlaceholder":4277},[3946,10600,10601],{"class":3948,"line":6364},[3946,10602,6908],{"class":4342},[3946,10604,10605],{"class":3948,"line":6376},[3946,10606,10607],{"class":4342},"   * Оновлення стану (helper)\n",[3946,10609,10610],{"class":3948,"line":6392},[3946,10611,6918],{"class":4342},[3946,10613,10614,10616,10619,10621,10624,10626,10629,10631,10634,10636,10638,10641,10643],{"class":3948,"line":6397},[3946,10615,5018],{"class":4255},[3946,10617,10618],{"class":4286}," updateState",[3946,10620,4290],{"class":3952},[3946,10622,10623],{"class":4224},"useCallback",[3946,10625,8135],{"class":3952},[3946,10627,10628],{"class":4262},"updates",[3946,10630,3963],{"class":3952},[3946,10632,10633],{"class":4403},"Partial",[3946,10635,4413],{"class":3952},[3946,10637,10548],{"class":4403},[3946,10639,10640],{"class":3952},">) ",[3946,10642,6453],{"class":4255},[3946,10644,4427],{"class":3952},[3946,10646,10647,10650,10652,10655,10657,10659,10662,10664,10667,10669],{"class":3948,"line":6402},[3946,10648,10649],{"class":4224},"    setState",[3946,10651,8135],{"class":3952},[3946,10653,10654],{"class":4262},"prev",[3946,10656,5783],{"class":3952},[3946,10658,6453],{"class":4255},[3946,10660,10661],{"class":3952}," ({ ...",[3946,10663,10654],{"class":4262},[3946,10665,10666],{"class":3952},", ...",[3946,10668,10628],{"class":4262},[3946,10670,10671],{"class":3952}," }));\n",[3946,10673,10674],{"class":3948,"line":6407},[3946,10675,10676],{"class":3952},"  }, []);\n",[3946,10678,10679],{"class":3948,"line":6413},[3946,10680,4278],{"emptyLinePlaceholder":4277},[3946,10682,10683],{"class":3948,"line":6418},[3946,10684,6908],{"class":4342},[3946,10686,10687],{"class":3948,"line":6434},[3946,10688,10689],{"class":4342},"   * Очищення помилки\n",[3946,10691,10692],{"class":3948,"line":6466},[3946,10693,6918],{"class":4342},[3946,10695,10696,10698,10701,10703,10705,10708,10710],{"class":3948,"line":6493},[3946,10697,5018],{"class":4255},[3946,10699,10700],{"class":4286}," clearError",[3946,10702,4290],{"class":3952},[3946,10704,10623],{"class":4224},[3946,10706,10707],{"class":3952},"(() ",[3946,10709,6453],{"class":4255},[3946,10711,4427],{"class":3952},[3946,10713,10714,10717,10719,10722,10724],{"class":3948,"line":6512},[3946,10715,10716],{"class":4224},"    updateState",[3946,10718,10506],{"class":3952},[3946,10720,10721],{"class":4262},"error:",[3946,10723,4648],{"class":4255},[3946,10725,10726],{"class":3952}," });\n",[3946,10728,10729,10732,10735],{"class":3948,"line":6530},[3946,10730,10731],{"class":3952},"  }, [",[3946,10733,10734],{"class":4262},"updateState",[3946,10736,10737],{"class":3952},"]);\n",[3946,10739,10740],{"class":3948,"line":6545},[3946,10741,4278],{"emptyLinePlaceholder":4277},[3946,10743,10744],{"class":3948,"line":6550},[3946,10745,6908],{"class":4342},[3946,10747,10748],{"class":3948,"line":6555},[3946,10749,10750],{"class":4342},"   * Встановлення автентифікації\n",[3946,10752,10753],{"class":3948,"line":6560},[3946,10754,6918],{"class":4342},[3946,10756,10757,10759,10762,10764,10766],{"class":3948,"line":6566},[3946,10758,5018],{"class":4255},[3946,10760,10761],{"class":4286}," setAuthenticated",[3946,10763,4290],{"class":3952},[3946,10765,10623],{"class":4224},[3946,10767,6594],{"class":3952},[3946,10769,10770,10773,10776,10778,10780,10782,10784],{"class":3948,"line":6571},[3946,10771,10772],{"class":3952},"    (",[3946,10774,10775],{"class":4262},"user",[3946,10777,3963],{"class":3952},[3946,10779,6257],{"class":4403},[3946,10781,5783],{"class":3952},[3946,10783,6453],{"class":4255},[3946,10785,4427],{"class":3952},[3946,10787,10788,10791],{"class":3948,"line":6588},[3946,10789,10790],{"class":4224},"      updateState",[3946,10792,8512],{"class":3952},[3946,10794,10795,10798],{"class":3948,"line":6597},[3946,10796,10797],{"class":4262},"        user",[3946,10799,3970],{"class":3952},[3946,10801,10802,10805,10807],{"class":3948,"line":6609},[3946,10803,10804],{"class":4262},"        isAuthenticated:",[3946,10806,4960],{"class":4255},[3946,10808,3970],{"class":3952},[3946,10810,10811,10814,10816],{"class":3948,"line":6640},[3946,10812,10813],{"class":4262},"        isLoading:",[3946,10815,7628],{"class":4255},[3946,10817,3970],{"class":3952},[3946,10819,10820,10823,10825],{"class":3948,"line":6653},[3946,10821,10822],{"class":4262},"        error:",[3946,10824,4648],{"class":4255},[3946,10826,3970],{"class":3952},[3946,10828,10829],{"class":3948,"line":6659},[3946,10830,10831],{"class":3952},"      });\n",[3946,10833,10834,10836,10838,10840,10842,10845,10847,10849,10851,10854],{"class":3948,"line":6671},[3946,10835,5525],{"class":4262},[3946,10837,4298],{"class":3952},[3946,10839,4461],{"class":4224},[3946,10841,4331],{"class":3952},[3946,10843,10844],{"class":3966},"'✅ Користувач автентифікований:'",[3946,10846,4447],{"class":3952},[3946,10848,10775],{"class":4262},[3946,10850,4298],{"class":3952},[3946,10852,10853],{"class":4262},"email",[3946,10855,4337],{"class":3952},[3946,10857,10858],{"class":3948,"line":6689},[3946,10859,10860],{"class":3952},"    },\n",[3946,10862,10863,10866,10868],{"class":3948,"line":6694},[3946,10864,10865],{"class":3952},"    [",[3946,10867,10734],{"class":4262},[3946,10869,10870],{"class":3952},"]\n",[3946,10872,10873],{"class":3948,"line":6699},[3946,10874,10875],{"class":3952},"  );\n",[3946,10877,10878],{"class":3948,"line":6704},[3946,10879,4278],{"emptyLinePlaceholder":4277},[3946,10881,10882],{"class":3948,"line":6709},[3946,10883,6908],{"class":4342},[3946,10885,10886],{"class":3948,"line":6715},[3946,10887,10888],{"class":4342},"   * Скидання автентифікації\n",[3946,10890,10891],{"class":3948,"line":6720},[3946,10892,6918],{"class":4342},[3946,10894,10895,10897,10900,10902,10904,10906,10908],{"class":3948,"line":6732},[3946,10896,5018],{"class":4255},[3946,10898,10899],{"class":4286}," setUnauthenticated",[3946,10901,4290],{"class":3952},[3946,10903,10623],{"class":4224},[3946,10905,10707],{"class":3952},[3946,10907,6453],{"class":4255},[3946,10909,4427],{"class":3952},[3946,10911,10912,10914],{"class":3948,"line":6743},[3946,10913,10716],{"class":4224},[3946,10915,8512],{"class":3952},[3946,10917,10918,10921,10923],{"class":3948,"line":6754},[3946,10919,10920],{"class":4262},"      user:",[3946,10922,4648],{"class":4255},[3946,10924,3970],{"class":3952},[3946,10926,10927,10930,10932],{"class":3948,"line":6768},[3946,10928,10929],{"class":4262},"      isAuthenticated:",[3946,10931,7628],{"class":4255},[3946,10933,3970],{"class":3952},[3946,10935,10936,10939,10941],{"class":3948,"line":7572},[3946,10937,10938],{"class":4262},"      isLoading:",[3946,10940,7628],{"class":4255},[3946,10942,3970],{"class":3952},[3946,10944,10945],{"class":3948,"line":7590},[3946,10946,8560],{"class":3952},[3946,10948,10949,10951,10953,10955,10957,10960],{"class":3948,"line":7609},[3946,10950,4456],{"class":4262},[3946,10952,4298],{"class":3952},[3946,10954,4461],{"class":4224},[3946,10956,4331],{"class":3952},[3946,10958,10959],{"class":3966},"'🔓 Користувач деавтентифікований'",[3946,10961,4337],{"class":3952},[3946,10963,10964,10966,10968],{"class":3948,"line":7615},[3946,10965,10731],{"class":3952},[3946,10967,10734],{"class":4262},[3946,10969,10737],{"class":3952},[3946,10971,10972],{"class":3948,"line":7633},[3946,10973,4278],{"emptyLinePlaceholder":4277},[3946,10975,10976],{"class":3948,"line":7638},[3946,10977,6908],{"class":4342},[3946,10979,10980],{"class":3948,"line":7644},[3946,10981,10982],{"class":4342},"   * Відновлення сесії з SecureStore\n",[3946,10984,10985],{"class":3948,"line":7677},[3946,10986,6918],{"class":4342},[3946,10988,10989,10991,10994,10996,10998,11000,11002,11005,11007],{"class":3948,"line":7682},[3946,10990,5018],{"class":4255},[3946,10992,10993],{"class":4286}," restoreSession",[3946,10995,4290],{"class":3952},[3946,10997,10623],{"class":4224},[3946,10999,4331],{"class":3952},[3946,11001,4387],{"class":4255},[3946,11003,11004],{"class":3952}," () ",[3946,11006,6453],{"class":4255},[3946,11008,4427],{"class":3952},[3946,11010,11011,11013,11015,11017,11019,11022],{"class":3948,"line":7694},[3946,11012,4456],{"class":4262},[3946,11014,4298],{"class":3952},[3946,11016,4461],{"class":4224},[3946,11018,4331],{"class":3952},[3946,11020,11021],{"class":3966},"'🔄 Спроба відновлення сесії...'",[3946,11023,4337],{"class":3952},[3946,11025,11026],{"class":3948,"line":7710},[3946,11027,7612],{"class":3952},[3946,11029,11030,11032],{"class":3948,"line":7715},[3946,11031,6977],{"class":4251},[3946,11033,4427],{"class":3952},[3946,11035,11036],{"class":3948,"line":7720},[3946,11037,11038],{"class":4342},"      \u002F\u002F Перевіряємо наявність токенів\n",[3946,11040,11041,11043,11045,11047,11049,11051,11053,11055],{"class":3948,"line":7729},[3946,11042,6984],{"class":4255},[3946,11044,6987],{"class":4286},[3946,11046,4290],{"class":3952},[3946,11048,4293],{"class":4251},[3946,11050,8213],{"class":4262},[3946,11052,4298],{"class":3952},[3946,11054,7528],{"class":4224},[3946,11056,4304],{"class":3952},[3946,11058,11059],{"class":3948,"line":7734},[3946,11060,7095],{"class":3952},[3946,11062,11063,11065,11067,11069],{"class":3948,"line":7739},[3946,11064,7246],{"class":4251},[3946,11066,4312],{"class":3952},[3946,11068,7062],{"class":4262},[3946,11070,4318],{"class":3952},[3946,11072,11073,11075,11077,11079,11081,11083],{"class":3948,"line":7744},[3946,11074,7257],{"class":4262},[3946,11076,4298],{"class":3952},[3946,11078,4461],{"class":4224},[3946,11080,4331],{"class":3952},[3946,11082,7266],{"class":3966},[3946,11084,4337],{"class":3952},[3946,11086,11087,11090],{"class":3948,"line":7750},[3946,11088,11089],{"class":4224},"        setUnauthenticated",[3946,11091,4304],{"class":3952},[3946,11093,11094,11096],{"class":3948,"line":7755},[3946,11095,7273],{"class":4251},[3946,11097,4272],{"class":3952},[3946,11099,11100],{"class":3948,"line":7765},[3946,11101,7282],{"class":3952},[3946,11103,11104],{"class":3948,"line":7777},[3946,11105,4278],{"emptyLinePlaceholder":4277},[3946,11107,11108],{"class":3948,"line":7786},[3946,11109,11110],{"class":4342},"      \u002F\u002F Перевіряємо валідність токену\n",[3946,11112,11113,11115,11117,11119,11121,11123,11125,11128],{"class":3948,"line":7799},[3946,11114,6984],{"class":4255},[3946,11116,7649],{"class":4286},[3946,11118,4290],{"class":3952},[3946,11120,4293],{"class":4251},[3946,11122,8213],{"class":4262},[3946,11124,4298],{"class":3952},[3946,11126,11127],{"class":4224},"isTokenValid",[3946,11129,4304],{"class":3952},[3946,11131,11132],{"class":3948,"line":7818},[3946,11133,7095],{"class":3952},[3946,11135,11136,11138,11140,11142],{"class":3948,"line":7823},[3946,11137,7246],{"class":4251},[3946,11139,4312],{"class":3952},[3946,11141,7689],{"class":4262},[3946,11143,4318],{"class":3952},[3946,11145,11146,11148,11150,11152,11154,11156],{"class":3948,"line":7834},[3946,11147,7257],{"class":4262},[3946,11149,4298],{"class":3952},[3946,11151,4461],{"class":4224},[3946,11153,4331],{"class":3952},[3946,11155,7705],{"class":3966},[3946,11157,4337],{"class":3952},[3946,11159,11160,11162,11164,11166,11168],{"class":3948,"line":7850},[3946,11161,7374],{"class":4251},[3946,11163,8213],{"class":4262},[3946,11165,4298],{"class":3952},[3946,11167,7382],{"class":4224},[3946,11169,4304],{"class":3952},[3946,11171,11172,11174],{"class":3948,"line":7855},[3946,11173,11089],{"class":4224},[3946,11175,4304],{"class":3952},[3946,11177,11178,11180],{"class":3948,"line":7860},[3946,11179,7273],{"class":4251},[3946,11181,4272],{"class":3952},[3946,11183,11184],{"class":3948,"line":7891},[3946,11185,7282],{"class":3952},[3946,11187,11188],{"class":3948,"line":7896},[3946,11189,4278],{"emptyLinePlaceholder":4277},[3946,11191,11192],{"class":3948,"line":7901},[3946,11193,11194],{"class":4342},"      \u002F\u002F Отримуємо дані користувача з сервера\n",[3946,11196,11197,11199,11202,11204,11206,11208,11210,11213],{"class":3948,"line":7906},[3946,11198,6984],{"class":4255},[3946,11200,11201],{"class":4286}," user",[3946,11203,4290],{"class":3952},[3946,11205,4293],{"class":4251},[3946,11207,10106],{"class":4262},[3946,11209,4298],{"class":3952},[3946,11211,11212],{"class":4224},"getCurrentUser",[3946,11214,4304],{"class":3952},[3946,11216,11217],{"class":3948,"line":7912},[3946,11218,7095],{"class":3952},[3946,11220,11221,11224,11226,11228],{"class":3948,"line":7917},[3946,11222,11223],{"class":4224},"      setAuthenticated",[3946,11225,4331],{"class":3952},[3946,11227,10775],{"class":4262},[3946,11229,4337],{"class":3952},[3946,11231,11232,11234,11236,11238,11240],{"class":3948,"line":7935},[3946,11233,7115],{"class":3952},[3946,11235,4476],{"class":4251},[3946,11237,4479],{"class":3952},[3946,11239,4482],{"class":4262},[3946,11241,4318],{"class":3952},[3946,11243,11244,11246,11248,11250,11252,11255,11257,11259],{"class":3948,"line":7942},[3946,11245,5525],{"class":4262},[3946,11247,4298],{"class":3952},[3946,11249,4482],{"class":4224},[3946,11251,4331],{"class":3952},[3946,11253,11254],{"class":3966},"'❌ Помилка відновлення сесії:'",[3946,11256,4447],{"class":3952},[3946,11258,4482],{"class":4262},[3946,11260,4337],{"class":3952},[3946,11262,11263],{"class":3948,"line":7963},[3946,11264,11265],{"class":4342},"      \u002F\u002F Очищаємо невалідні токени\n",[3946,11267,11268,11270,11272,11274,11276],{"class":3948,"line":7979},[3946,11269,7069],{"class":4251},[3946,11271,8213],{"class":4262},[3946,11273,4298],{"class":3952},[3946,11275,7382],{"class":4224},[3946,11277,4304],{"class":3952},[3946,11279,11280,11283],{"class":3948,"line":7992},[3946,11281,11282],{"class":4224},"      setUnauthenticated",[3946,11284,4304],{"class":3952},[3946,11286,11287],{"class":3948,"line":8012},[3946,11288,5550],{"class":3952},[3946,11290,11291,11293,11296,11298,11301],{"class":3948,"line":8018},[3946,11292,10731],{"class":3952},[3946,11294,11295],{"class":4262},"setAuthenticated",[3946,11297,4447],{"class":3952},[3946,11299,11300],{"class":4262},"setUnauthenticated",[3946,11302,10737],{"class":3952},[3946,11304,11305],{"class":3948,"line":8023},[3946,11306,4278],{"emptyLinePlaceholder":4277},[3946,11308,11309],{"class":3948,"line":8028},[3946,11310,6908],{"class":4342},[3946,11312,11313],{"class":3948,"line":8033},[3946,11314,8903],{"class":4342},[3946,11316,11317],{"class":3948,"line":8038},[3946,11318,6918],{"class":4342},[3946,11320,11321,11323,11325,11327,11329],{"class":3948,"line":8044},[3946,11322,5018],{"class":4255},[3946,11324,8914],{"class":4286},[3946,11326,4290],{"class":3952},[3946,11328,10623],{"class":4224},[3946,11330,6594],{"class":3952},[3946,11332,11333,11336,11338,11340,11342,11344,11346,11348],{"class":3948,"line":8049},[3946,11334,11335],{"class":4255},"    async",[3946,11337,4479],{"class":3952},[3946,11339,6443],{"class":4262},[3946,11341,3963],{"class":3952},[3946,11343,6448],{"class":4403},[3946,11345,5783],{"class":3952},[3946,11347,6453],{"class":4255},[3946,11349,4427],{"class":3952},[3946,11351,11352,11355],{"class":3948,"line":8071},[3946,11353,11354],{"class":4251},"      try",[3946,11356,4427],{"class":3952},[3946,11358,11359,11362,11364,11367,11369,11371,11373,11375],{"class":3948,"line":8090},[3946,11360,11361],{"class":4224},"        updateState",[3946,11363,10506],{"class":3952},[3946,11365,11366],{"class":4262},"isLoading:",[3946,11368,4960],{"class":4255},[3946,11370,4447],{"class":3952},[3946,11372,10721],{"class":4262},[3946,11374,4648],{"class":4255},[3946,11376,10726],{"class":3952},[3946,11378,11379],{"class":3948,"line":8095},[3946,11380,4278],{"emptyLinePlaceholder":4277},[3946,11382,11383],{"class":3948,"line":8112},[3946,11384,11385],{"class":4342},"        \u002F\u002F Запит до API\n",[3946,11387,11388,11390,11392,11394,11396,11398,11400,11403,11405,11407],{"class":3948,"line":8117},[3946,11389,8615],{"class":4255},[3946,11391,8776],{"class":4286},[3946,11393,4290],{"class":3952},[3946,11395,4293],{"class":4251},[3946,11397,10106],{"class":4262},[3946,11399,4298],{"class":3952},[3946,11401,11402],{"class":4224},"login",[3946,11404,4331],{"class":3952},[3946,11406,6443],{"class":4262},[3946,11408,4337],{"class":3952},[3946,11410,11411],{"class":3948,"line":8160},[3946,11412,4278],{"emptyLinePlaceholder":4277},[3946,11414,11415],{"class":3948,"line":8185},[3946,11416,11417],{"class":4342},"        \u002F\u002F Зберігаємо токени\n",[3946,11419,11420,11422,11424,11426,11428],{"class":3948,"line":8190},[3946,11421,7374],{"class":4251},[3946,11423,8213],{"class":4262},[3946,11425,4298],{"class":3952},[3946,11427,7869],{"class":4224},[3946,11429,6594],{"class":3952},[3946,11431,11432,11435,11437,11439],{"class":3948,"line":8195},[3946,11433,11434],{"class":4262},"          response",[3946,11436,4298],{"class":3952},[3946,11438,7334],{"class":4262},[3946,11440,3970],{"class":3952},[3946,11442,11443,11445,11447,11449],{"class":3948,"line":8200},[3946,11444,11434],{"class":4262},[3946,11446,4298],{"class":3952},[3946,11448,5363],{"class":4262},[3946,11450,3970],{"class":3952},[3946,11452,11453,11455,11457],{"class":3948,"line":8206},[3946,11454,11434],{"class":4262},[3946,11456,4298],{"class":3952},[3946,11458,11459],{"class":4262},"expiresIn\n",[3946,11461,11462],{"class":3948,"line":9571},[3946,11463,11464],{"class":3952},"        );\n",[3946,11466,11467],{"class":3948,"line":9589},[3946,11468,4278],{"emptyLinePlaceholder":4277},[3946,11470,11471],{"class":3948,"line":9596},[3946,11472,11473],{"class":4342},"        \u002F\u002F Оновлюємо стан\n",[3946,11475,11476,11479,11481,11483,11485,11487],{"class":3948,"line":9618},[3946,11477,11478],{"class":4224},"        setAuthenticated",[3946,11480,4331],{"class":3952},[3946,11482,8757],{"class":4262},[3946,11484,4298],{"class":3952},[3946,11486,10775],{"class":4262},[3946,11488,4337],{"class":3952},[3946,11490,11491,11494,11496,11498,11500],{"class":3948,"line":9627},[3946,11492,11493],{"class":3952},"      } ",[3946,11495,4476],{"class":4251},[3946,11497,4479],{"class":3952},[3946,11499,4482],{"class":4262},[3946,11501,4318],{"class":3952},[3946,11503,11504,11506,11509],{"class":3948,"line":9636},[3946,11505,8615],{"class":4255},[3946,11507,11508],{"class":4286}," errorMessage",[3946,11510,11511],{"class":3952}," =\n",[3946,11513,11514,11517,11519,11521,11524,11526,11528,11530,11533,11536],{"class":3948,"line":9645},[3946,11515,11516],{"class":4262},"          error",[3946,11518,5510],{"class":4255},[3946,11520,5513],{"class":4403},[3946,11522,11523],{"class":3952}," ? ",[3946,11525,4482],{"class":4262},[3946,11527,4298],{"class":3952},[3946,11529,5543],{"class":4262},[3946,11531,11532],{"class":3952}," : ",[3946,11534,11535],{"class":3966},"'Помилка входу в систему'",[3946,11537,4272],{"class":3952},[3946,11539,11540],{"class":3948,"line":9650},[3946,11541,8635],{"class":3952},[3946,11543,11544,11546],{"class":3948,"line":9655},[3946,11545,11361],{"class":4224},[3946,11547,8512],{"class":3952},[3946,11549,11550,11553,11555],{"class":3948,"line":9660},[3946,11551,11552],{"class":4262},"          error:",[3946,11554,11508],{"class":4262},[3946,11556,3970],{"class":3952},[3946,11558,11559,11562,11564],{"class":3948,"line":9665},[3946,11560,11561],{"class":4262},"          isLoading:",[3946,11563,7628],{"class":4255},[3946,11565,3970],{"class":3952},[3946,11567,11568],{"class":3948,"line":9671},[3946,11569,11570],{"class":3952},"        });\n",[3946,11572,11573],{"class":3948,"line":9676},[3946,11574,8635],{"class":3952},[3946,11576,11577,11580,11582],{"class":3948,"line":9700},[3946,11578,11579],{"class":4251},"        throw",[3946,11581,4513],{"class":4262},[3946,11583,4272],{"class":3952},[3946,11585,11586],{"class":3948,"line":9721},[3946,11587,7282],{"class":3952},[3946,11589,11590],{"class":3948,"line":9756},[3946,11591,10860],{"class":3952},[3946,11593,11594,11596,11598,11600,11602],{"class":3948,"line":9778},[3946,11595,10865],{"class":3952},[3946,11597,10734],{"class":4262},[3946,11599,4447],{"class":3952},[3946,11601,11295],{"class":4262},[3946,11603,10870],{"class":3952},[3946,11605,11606],{"class":3948,"line":9783},[3946,11607,10875],{"class":3952},[3946,11609,11610],{"class":3948,"line":9789},[3946,11611,4278],{"emptyLinePlaceholder":4277},[3946,11613,11614],{"class":3948,"line":9801},[3946,11615,6908],{"class":4342},[3946,11617,11618],{"class":3948,"line":9813},[3946,11619,9050],{"class":4342},[3946,11621,11622],{"class":3948,"line":9830},[3946,11623,6918],{"class":4342},[3946,11625,11626,11628,11630,11632,11634],{"class":3948,"line":9840},[3946,11627,5018],{"class":4255},[3946,11629,9061],{"class":4286},[3946,11631,4290],{"class":3952},[3946,11633,10623],{"class":4224},[3946,11635,6594],{"class":3952},[3946,11637,11638,11640,11642,11644,11646,11648,11650,11652],{"class":3948,"line":9856},[3946,11639,11335],{"class":4255},[3946,11641,4479],{"class":3952},[3946,11643,6443],{"class":4262},[3946,11645,3963],{"class":3952},[3946,11647,6478],{"class":4403},[3946,11649,5783],{"class":3952},[3946,11651,6453],{"class":4255},[3946,11653,4427],{"class":3952},[3946,11655,11656,11658],{"class":3948,"line":9866},[3946,11657,11354],{"class":4251},[3946,11659,4427],{"class":3952},[3946,11661,11662,11664,11666,11668,11670,11672,11674,11676],{"class":3948,"line":9882},[3946,11663,11361],{"class":4224},[3946,11665,10506],{"class":3952},[3946,11667,11366],{"class":4262},[3946,11669,4960],{"class":4255},[3946,11671,4447],{"class":3952},[3946,11673,10721],{"class":4262},[3946,11675,4648],{"class":4255},[3946,11677,10726],{"class":3952},[3946,11679,11680],{"class":3948,"line":9892},[3946,11681,4278],{"emptyLinePlaceholder":4277},[3946,11683,11684],{"class":3948,"line":9908},[3946,11685,11385],{"class":4342},[3946,11687,11688,11690,11692,11694,11696,11698,11700,11703,11705,11707],{"class":3948,"line":9918},[3946,11689,8615],{"class":4255},[3946,11691,8776],{"class":4286},[3946,11693,4290],{"class":3952},[3946,11695,4293],{"class":4251},[3946,11697,10106],{"class":4262},[3946,11699,4298],{"class":3952},[3946,11701,11702],{"class":4224},"register",[3946,11704,4331],{"class":3952},[3946,11706,6443],{"class":4262},[3946,11708,4337],{"class":3952},[3946,11710,11711],{"class":3948,"line":9934},[3946,11712,4278],{"emptyLinePlaceholder":4277},[3946,11714,11715],{"class":3948,"line":9944},[3946,11716,11417],{"class":4342},[3946,11718,11719,11721,11723,11725,11727],{"class":3948,"line":9960},[3946,11720,7374],{"class":4251},[3946,11722,8213],{"class":4262},[3946,11724,4298],{"class":3952},[3946,11726,7869],{"class":4224},[3946,11728,6594],{"class":3952},[3946,11730,11731,11733,11735,11737],{"class":3948,"line":9970},[3946,11732,11434],{"class":4262},[3946,11734,4298],{"class":3952},[3946,11736,7334],{"class":4262},[3946,11738,3970],{"class":3952},[3946,11740,11741,11743,11745,11747],{"class":3948,"line":9986},[3946,11742,11434],{"class":4262},[3946,11744,4298],{"class":3952},[3946,11746,5363],{"class":4262},[3946,11748,3970],{"class":3952},[3946,11750,11751,11753,11755],{"class":3948,"line":9994},[3946,11752,11434],{"class":4262},[3946,11754,4298],{"class":3952},[3946,11756,11459],{"class":4262},[3946,11758,11759],{"class":3948,"line":10014},[3946,11760,11464],{"class":3952},[3946,11762,11763],{"class":3948,"line":10019},[3946,11764,4278],{"emptyLinePlaceholder":4277},[3946,11766,11767],{"class":3948,"line":10024},[3946,11768,11473],{"class":4342},[3946,11770,11771,11773,11775,11777,11779,11781],{"class":3948,"line":10029},[3946,11772,11478],{"class":4224},[3946,11774,4331],{"class":3952},[3946,11776,8757],{"class":4262},[3946,11778,4298],{"class":3952},[3946,11780,10775],{"class":4262},[3946,11782,4337],{"class":3952},[3946,11784,11785,11787,11789,11791,11793],{"class":3948,"line":10044},[3946,11786,11493],{"class":3952},[3946,11788,4476],{"class":4251},[3946,11790,4479],{"class":3952},[3946,11792,4482],{"class":4262},[3946,11794,4318],{"class":3952},[3946,11796,11797,11799,11801],{"class":3948,"line":10053},[3946,11798,8615],{"class":4255},[3946,11800,11508],{"class":4286},[3946,11802,11511],{"class":3952},[3946,11804,11805,11807,11809,11811,11813,11815,11817,11819,11821,11824],{"class":3948,"line":10058},[3946,11806,11516],{"class":4262},[3946,11808,5510],{"class":4255},[3946,11810,5513],{"class":4403},[3946,11812,11523],{"class":3952},[3946,11814,4482],{"class":4262},[3946,11816,4298],{"class":3952},[3946,11818,5543],{"class":4262},[3946,11820,11532],{"class":3952},[3946,11822,11823],{"class":3966},"'Помилка реєстрації'",[3946,11825,4272],{"class":3952},[3946,11827,11828],{"class":3948,"line":10063},[3946,11829,8635],{"class":3952},[3946,11831,11832,11834],{"class":3948,"line":10079},[3946,11833,11361],{"class":4224},[3946,11835,8512],{"class":3952},[3946,11837,11838,11840,11842],{"class":3948,"line":10084},[3946,11839,11552],{"class":4262},[3946,11841,11508],{"class":4262},[3946,11843,3970],{"class":3952},[3946,11845,11846,11848,11850],{"class":3948,"line":10089},[3946,11847,11561],{"class":4262},[3946,11849,7628],{"class":4255},[3946,11851,3970],{"class":3952},[3946,11853,11854],{"class":3948,"line":10094},[3946,11855,11570],{"class":3952},[3946,11857,11858],{"class":3948,"line":10099},[3946,11859,8635],{"class":3952},[3946,11861,11863,11865,11867],{"class":3948,"line":11862},190,[3946,11864,11579],{"class":4251},[3946,11866,4513],{"class":4262},[3946,11868,4272],{"class":3952},[3946,11870,11872],{"class":3948,"line":11871},191,[3946,11873,7282],{"class":3952},[3946,11875,11877],{"class":3948,"line":11876},192,[3946,11878,10860],{"class":3952},[3946,11880,11882,11884,11886,11888,11890],{"class":3948,"line":11881},193,[3946,11883,10865],{"class":3952},[3946,11885,10734],{"class":4262},[3946,11887,4447],{"class":3952},[3946,11889,11295],{"class":4262},[3946,11891,10870],{"class":3952},[3946,11893,11895],{"class":3948,"line":11894},194,[3946,11896,10875],{"class":3952},[3946,11898,11900],{"class":3948,"line":11899},195,[3946,11901,4278],{"emptyLinePlaceholder":4277},[3946,11903,11905],{"class":3948,"line":11904},196,[3946,11906,6908],{"class":4342},[3946,11908,11910],{"class":3948,"line":11909},197,[3946,11911,11912],{"class":4342},"   * Вихід з системи\n",[3946,11914,11916],{"class":3948,"line":11915},198,[3946,11917,6918],{"class":4342},[3946,11919,11921,11923,11925,11927,11929,11931,11933,11935,11937],{"class":3948,"line":11920},199,[3946,11922,5018],{"class":4255},[3946,11924,9202],{"class":4286},[3946,11926,4290],{"class":3952},[3946,11928,10623],{"class":4224},[3946,11930,4331],{"class":3952},[3946,11932,4387],{"class":4255},[3946,11934,11004],{"class":3952},[3946,11936,6453],{"class":4255},[3946,11938,4427],{"class":3952},[3946,11940,11942,11944],{"class":3948,"line":11941},200,[3946,11943,6977],{"class":4251},[3946,11945,4427],{"class":3952},[3946,11947,11949,11951,11953,11955,11957],{"class":3948,"line":11948},201,[3946,11950,10790],{"class":4224},[3946,11952,10506],{"class":3952},[3946,11954,11366],{"class":4262},[3946,11956,4960],{"class":4255},[3946,11958,10726],{"class":3952},[3946,11960,11962],{"class":3948,"line":11961},202,[3946,11963,4278],{"emptyLinePlaceholder":4277},[3946,11965,11967],{"class":3948,"line":11966},203,[3946,11968,11969],{"class":4342},"      \u002F\u002F Інвалідуємо токен на сервері\n",[3946,11971,11973,11975,11977,11979,11982],{"class":3948,"line":11972},204,[3946,11974,7069],{"class":4251},[3946,11976,10106],{"class":4262},[3946,11978,4298],{"class":3952},[3946,11980,11981],{"class":4224},"logout",[3946,11983,4304],{"class":3952},[3946,11985,11987,11989,11991,11993,11995],{"class":3948,"line":11986},205,[3946,11988,7115],{"class":3952},[3946,11990,4476],{"class":4251},[3946,11992,4479],{"class":3952},[3946,11994,4482],{"class":4262},[3946,11996,4318],{"class":3952},[3946,11998,12000,12002,12004,12006,12008,12010,12012,12014],{"class":3948,"line":11999},206,[3946,12001,5525],{"class":4262},[3946,12003,4298],{"class":3952},[3946,12005,4482],{"class":4224},[3946,12007,4331],{"class":3952},[3946,12009,9269],{"class":3966},[3946,12011,4447],{"class":3952},[3946,12013,4482],{"class":4262},[3946,12015,4337],{"class":3952},[3946,12017,12019],{"class":3948,"line":12018},207,[3946,12020,12021],{"class":4342},"      \u002F\u002F Продовжуємо logout локально навіть при помилці\n",[3946,12023,12025,12027,12030],{"class":3948,"line":12024},208,[3946,12026,7115],{"class":3952},[3946,12028,12029],{"class":4251},"finally",[3946,12031,4427],{"class":3952},[3946,12033,12035],{"class":3948,"line":12034},209,[3946,12036,12037],{"class":4342},"      \u002F\u002F Видаляємо токени з SecureStore\n",[3946,12039,12041,12043,12045,12047,12049],{"class":3948,"line":12040},210,[3946,12042,7069],{"class":4251},[3946,12044,8213],{"class":4262},[3946,12046,4298],{"class":3952},[3946,12048,7382],{"class":4224},[3946,12050,4304],{"class":3952},[3946,12052,12054],{"class":3948,"line":12053},211,[3946,12055,7095],{"class":3952},[3946,12057,12059],{"class":3948,"line":12058},212,[3946,12060,12061],{"class":4342},"      \u002F\u002F Оновлюємо стан\n",[3946,12063,12065,12067],{"class":3948,"line":12064},213,[3946,12066,11282],{"class":4224},[3946,12068,4304],{"class":3952},[3946,12070,12072],{"class":3948,"line":12071},214,[3946,12073,5550],{"class":3952},[3946,12075,12077,12079,12081,12083,12085],{"class":3948,"line":12076},215,[3946,12078,10731],{"class":3952},[3946,12080,10734],{"class":4262},[3946,12082,4447],{"class":3952},[3946,12084,11300],{"class":4262},[3946,12086,10737],{"class":3952},[3946,12088,12090],{"class":3948,"line":12089},216,[3946,12091,4278],{"emptyLinePlaceholder":4277},[3946,12093,12095],{"class":3948,"line":12094},217,[3946,12096,6908],{"class":4342},[3946,12098,12100],{"class":3948,"line":12099},218,[3946,12101,12102],{"class":4342},"   * Оновлення сесії (refresh token)\n",[3946,12104,12106],{"class":3948,"line":12105},219,[3946,12107,6918],{"class":4342},[3946,12109,12111,12113,12116,12118,12120,12122,12124,12126,12128],{"class":3948,"line":12110},220,[3946,12112,5018],{"class":4255},[3946,12114,12115],{"class":4286}," refreshSession",[3946,12117,4290],{"class":3952},[3946,12119,10623],{"class":4224},[3946,12121,4331],{"class":3952},[3946,12123,4387],{"class":4255},[3946,12125,11004],{"class":3952},[3946,12127,6453],{"class":4255},[3946,12129,4427],{"class":3952},[3946,12131,12133,12135],{"class":3948,"line":12132},221,[3946,12134,6977],{"class":4251},[3946,12136,4427],{"class":3952},[3946,12138,12140,12142,12144,12146,12148,12150,12152,12154],{"class":3948,"line":12139},222,[3946,12141,6984],{"class":4255},[3946,12143,6987],{"class":4286},[3946,12145,4290],{"class":3952},[3946,12147,4293],{"class":4251},[3946,12149,8213],{"class":4262},[3946,12151,4298],{"class":3952},[3946,12153,7528],{"class":4224},[3946,12155,4304],{"class":3952},[3946,12157,12159],{"class":3948,"line":12158},223,[3946,12160,7095],{"class":3952},[3946,12162,12164,12166,12168,12170,12172,12174],{"class":3948,"line":12163},224,[3946,12165,7246],{"class":4251},[3946,12167,4312],{"class":3952},[3946,12169,7062],{"class":4262},[3946,12171,7539],{"class":3952},[3946,12173,5363],{"class":4262},[3946,12175,4318],{"class":3952},[3946,12177,12179,12181,12183,12185,12187,12190],{"class":3948,"line":12178},225,[3946,12180,11579],{"class":4251},[3946,12182,7150],{"class":4255},[3946,12184,5513],{"class":4224},[3946,12186,4331],{"class":3952},[3946,12188,12189],{"class":3966},"'Refresh token не знайдено'",[3946,12191,4337],{"class":3952},[3946,12193,12195],{"class":3948,"line":12194},226,[3946,12196,7282],{"class":3952},[3946,12198,12200],{"class":3948,"line":12199},227,[3946,12201,4278],{"emptyLinePlaceholder":4277},[3946,12203,12205,12207,12209,12211,12213,12215,12217,12219,12221,12223,12225,12227],{"class":3948,"line":12204},228,[3946,12206,6984],{"class":4255},[3946,12208,8776],{"class":4286},[3946,12210,4290],{"class":3952},[3946,12212,4293],{"class":4251},[3946,12214,10106],{"class":4262},[3946,12216,4298],{"class":3952},[3946,12218,5363],{"class":4224},[3946,12220,4331],{"class":3952},[3946,12222,7062],{"class":4262},[3946,12224,4298],{"class":3952},[3946,12226,5363],{"class":4262},[3946,12228,4337],{"class":3952},[3946,12230,12232],{"class":3948,"line":12231},229,[3946,12233,4278],{"emptyLinePlaceholder":4277},[3946,12235,12237,12239,12241,12243,12245],{"class":3948,"line":12236},230,[3946,12238,7069],{"class":4251},[3946,12240,8213],{"class":4262},[3946,12242,4298],{"class":3952},[3946,12244,7869],{"class":4224},[3946,12246,6594],{"class":3952},[3946,12248,12250,12253,12255,12257],{"class":3948,"line":12249},231,[3946,12251,12252],{"class":4262},"        response",[3946,12254,4298],{"class":3952},[3946,12256,7334],{"class":4262},[3946,12258,3970],{"class":3952},[3946,12260,12262,12264,12266,12268],{"class":3948,"line":12261},232,[3946,12263,12252],{"class":4262},[3946,12265,4298],{"class":3952},[3946,12267,5363],{"class":4262},[3946,12269,3970],{"class":3952},[3946,12271,12273,12275,12277],{"class":3948,"line":12272},233,[3946,12274,12252],{"class":4262},[3946,12276,4298],{"class":3952},[3946,12278,11459],{"class":4262},[3946,12280,12282],{"class":3948,"line":12281},234,[3946,12283,8984],{"class":3952},[3946,12285,12287],{"class":3948,"line":12286},235,[3946,12288,4278],{"emptyLinePlaceholder":4277},[3946,12290,12292,12294,12296,12298,12300,12302],{"class":3948,"line":12291},236,[3946,12293,11223],{"class":4224},[3946,12295,4331],{"class":3952},[3946,12297,8757],{"class":4262},[3946,12299,4298],{"class":3952},[3946,12301,10775],{"class":4262},[3946,12303,4337],{"class":3952},[3946,12305,12307,12309,12311,12313,12315],{"class":3948,"line":12306},237,[3946,12308,7115],{"class":3952},[3946,12310,4476],{"class":4251},[3946,12312,4479],{"class":3952},[3946,12314,4482],{"class":4262},[3946,12316,4318],{"class":3952},[3946,12318,12320,12322,12324,12326,12328,12331,12333,12335],{"class":3948,"line":12319},238,[3946,12321,5525],{"class":4262},[3946,12323,4298],{"class":3952},[3946,12325,4482],{"class":4224},[3946,12327,4331],{"class":3952},[3946,12329,12330],{"class":3966},"'❌ Помилка оновлення сесії:'",[3946,12332,4447],{"class":3952},[3946,12334,4482],{"class":4262},[3946,12336,4337],{"class":3952},[3946,12338,12340,12342,12344,12346,12348],{"class":3948,"line":12339},239,[3946,12341,7069],{"class":4251},[3946,12343,8213],{"class":4262},[3946,12345,4298],{"class":3952},[3946,12347,7382],{"class":4224},[3946,12349,4304],{"class":3952},[3946,12351,12353,12355],{"class":3948,"line":12352},240,[3946,12354,11282],{"class":4224},[3946,12356,4304],{"class":3952},[3946,12358,12360,12362,12364],{"class":3948,"line":12359},241,[3946,12361,7147],{"class":4251},[3946,12363,4513],{"class":4262},[3946,12365,4272],{"class":3952},[3946,12367,12369],{"class":3948,"line":12368},242,[3946,12370,5550],{"class":3952},[3946,12372,12374,12376,12378,12380,12382],{"class":3948,"line":12373},243,[3946,12375,10731],{"class":3952},[3946,12377,11295],{"class":4262},[3946,12379,4447],{"class":3952},[3946,12381,11300],{"class":4262},[3946,12383,10737],{"class":3952},[3946,12385,12387],{"class":3948,"line":12386},244,[3946,12388,4278],{"emptyLinePlaceholder":4277},[3946,12390,12392],{"class":3948,"line":12391},245,[3946,12393,6908],{"class":4342},[3946,12395,12397],{"class":3948,"line":12396},246,[3946,12398,12399],{"class":4342},"   * Відновлення сесії при старті додатку\n",[3946,12401,12403],{"class":3948,"line":12402},247,[3946,12404,6918],{"class":4342},[3946,12406,12408,12410,12412,12414],{"class":3948,"line":12407},248,[3946,12409,10265],{"class":4224},[3946,12411,10707],{"class":3952},[3946,12413,6453],{"class":4255},[3946,12415,4427],{"class":3952},[3946,12417,12419,12422],{"class":3948,"line":12418},249,[3946,12420,12421],{"class":4224},"    restoreSession",[3946,12423,4304],{"class":3952},[3946,12425,12427,12429,12432],{"class":3948,"line":12426},250,[3946,12428,10731],{"class":3952},[3946,12430,12431],{"class":4262},"restoreSession",[3946,12433,10737],{"class":3952},[3946,12435,12437],{"class":3948,"line":12436},251,[3946,12438,4278],{"emptyLinePlaceholder":4277},[3946,12440,12442],{"class":3948,"line":12441},252,[3946,12443,6908],{"class":4342},[3946,12445,12447],{"class":3948,"line":12446},253,[3946,12448,12449],{"class":4342},"   * Мемоїзоване значення контексту\n",[3946,12451,12453],{"class":3948,"line":12452},254,[3946,12454,6918],{"class":4342},[3946,12456,12458,12460,12463,12465,12468,12470,12472],{"class":3948,"line":12457},255,[3946,12459,5018],{"class":4255},[3946,12461,12462],{"class":4286}," value",[3946,12464,4290],{"class":3952},[3946,12466,12467],{"class":4224},"useMemo",[3946,12469,4413],{"class":3952},[3946,12471,10424],{"class":4403},[3946,12473,8967],{"class":3952},[3946,12475,12477,12480,12482],{"class":3948,"line":12476},256,[3946,12478,12479],{"class":3952},"    () ",[3946,12481,6453],{"class":4255},[3946,12483,12484],{"class":3952}," ({\n",[3946,12486,12488,12491,12493],{"class":3948,"line":12487},257,[3946,12489,12490],{"class":3952},"      ...",[3946,12492,10532],{"class":4262},[3946,12494,3970],{"class":3952},[3946,12496,12498,12501],{"class":3948,"line":12497},258,[3946,12499,12500],{"class":4262},"      login",[3946,12502,3970],{"class":3952},[3946,12504,12506,12509],{"class":3948,"line":12505},259,[3946,12507,12508],{"class":4262},"      register",[3946,12510,3970],{"class":3952},[3946,12512,12514,12517],{"class":3948,"line":12513},260,[3946,12515,12516],{"class":4262},"      logout",[3946,12518,3970],{"class":3952},[3946,12520,12522,12525],{"class":3948,"line":12521},261,[3946,12523,12524],{"class":4262},"      refreshSession",[3946,12526,3970],{"class":3952},[3946,12528,12530,12533],{"class":3948,"line":12529},262,[3946,12531,12532],{"class":4262},"      clearError",[3946,12534,3970],{"class":3952},[3946,12536,12538],{"class":3948,"line":12537},263,[3946,12539,12540],{"class":3952},"    }),\n",[3946,12542,12544,12546,12548,12550,12552,12554,12556,12558,12560,12562,12565,12567,12570],{"class":3948,"line":12543},264,[3946,12545,10865],{"class":3952},[3946,12547,10532],{"class":4262},[3946,12549,4447],{"class":3952},[3946,12551,11402],{"class":4262},[3946,12553,4447],{"class":3952},[3946,12555,11702],{"class":4262},[3946,12557,4447],{"class":3952},[3946,12559,11981],{"class":4262},[3946,12561,4447],{"class":3952},[3946,12563,12564],{"class":4262},"refreshSession",[3946,12566,4447],{"class":3952},[3946,12568,12569],{"class":4262},"clearError",[3946,12571,10870],{"class":3952},[3946,12573,12575],{"class":3948,"line":12574},265,[3946,12576,10875],{"class":3952},[3946,12578,12580],{"class":3948,"line":12579},266,[3946,12581,4278],{"emptyLinePlaceholder":4277},[3946,12583,12585,12587,12590,12593,12595,12598,12600,12603,12606,12609,12611,12614,12616,12618,12620],{"class":3948,"line":12584},267,[3946,12586,5062],{"class":4251},[3946,12588,12589],{"class":3952}," \u003C",[3946,12591,12592],{"class":4403},"AuthContext",[3946,12594,4298],{"class":3952},[3946,12596,12597],{"class":4403},"Provider",[3946,12599,12462],{"class":4403},[3946,12601,12602],{"class":3952},"={",[3946,12604,12605],{"class":4262},"value",[3946,12607,12608],{"class":3952},"}>{",[3946,12610,10509],{"class":4262},[3946,12612,12613],{"class":3952},"}\u003C\u002F",[3946,12615,12592],{"class":4262},[3946,12617,4298],{"class":3952},[3946,12619,12597],{"class":4262},[3946,12621,6463],{"class":3952},[3946,12623,12625],{"class":3948,"line":12624},268,[3946,12626,4040],{"class":3952},[3946,12628,12630],{"class":3948,"line":12629},269,[3946,12631,4278],{"emptyLinePlaceholder":4277},[3946,12633,12635],{"class":3948,"line":12634},270,[3946,12636,6015],{"class":4342},[3946,12638,12640],{"class":3948,"line":12639},271,[3946,12641,12642],{"class":4342}," * Hook для використання Auth Context\n",[3946,12644,12646],{"class":3948,"line":12645},272,[3946,12647,6025],{"class":4342},[3946,12649,12651,12653,12655,12658,12660,12662],{"class":3948,"line":12650},273,[3946,12652,6030],{"class":4251},[3946,12654,4390],{"class":4255},[3946,12656,12657],{"class":4224}," useAuth",[3946,12659,4550],{"class":3952},[3946,12661,10424],{"class":4403},[3946,12663,4427],{"class":3952},[3946,12665,12667,12669,12672,12674,12677,12679,12681],{"class":3948,"line":12666},274,[3946,12668,5018],{"class":4255},[3946,12670,12671],{"class":4286}," context",[3946,12673,4290],{"class":3952},[3946,12675,12676],{"class":4224},"useContext",[3946,12678,4331],{"class":3952},[3946,12680,12592],{"class":4262},[3946,12682,4337],{"class":3952},[3946,12684,12686],{"class":3948,"line":12685},275,[3946,12687,4278],{"emptyLinePlaceholder":4277},[3946,12689,12691,12693,12695,12698],{"class":3948,"line":12690},276,[3946,12692,5776],{"class":4251},[3946,12694,4312],{"class":3952},[3946,12696,12697],{"class":4262},"context",[3946,12699,4318],{"class":3952},[3946,12701,12703,12705,12707,12709,12711,12714],{"class":3948,"line":12702},277,[3946,12704,4510],{"class":4251},[3946,12706,7150],{"class":4255},[3946,12708,5513],{"class":4224},[3946,12710,4331],{"class":3952},[3946,12712,12713],{"class":3966},"'useAuth must be used within AuthProvider'",[3946,12715,4337],{"class":3952},[3946,12717,12719],{"class":3948,"line":12718},278,[3946,12720,4521],{"class":3952},[3946,12722,12724],{"class":3948,"line":12723},279,[3946,12725,4278],{"emptyLinePlaceholder":4277},[3946,12727,12729,12731,12733],{"class":3948,"line":12728},280,[3946,12730,5062],{"class":4251},[3946,12732,12671],{"class":4262},[3946,12734,4272],{"class":3952},[3946,12736,12738],{"class":3948,"line":12737},281,[3946,12739,4040],{"class":3952},[3743,12741,12742],{},[3771,12743,12744],{},"Ключові моменти реалізації:",[3765,12746,12747,12763,12779,12799,12815],{},[3768,12748,12749,12752],{},[3771,12750,12751],{},"Initial Loading State:",[3878,12753,12754,12760],{},[3768,12755,12756,12759],{},[3782,12757,12758],{},"isLoading: true"," при старті",[3768,12761,12762],{},"Запобігає миготінню екранів під час перевірки токенів",[3768,12764,12765,12768],{},[3771,12766,12767],{},"Error Handling:",[3878,12769,12770,12773],{},[3768,12771,12772],{},"Помилки зберігаються в стані",[3768,12774,12775,12776,12778],{},"Метод ",[3782,12777,12569],{}," для очищення",[3768,12780,12781,12784],{},[3771,12782,12783],{},"Memoization:",[3878,12785,12786,12794],{},[3768,12787,12788,12790,12791,12793],{},[3782,12789,12467],{}," для ",[3782,12792,12605],{}," — запобігає зайвим рендерам",[3768,12795,12796,12798],{},[3782,12797,10623],{}," для всіх методів",[3768,12800,12801,12804],{},[3771,12802,12803],{},"Token Lifecycle:",[3878,12805,12806,12809,12812],{},[3768,12807,12808],{},"Автоматичне відновлення при старті",[3768,12810,12811],{},"Очищення при logout або помилках",[3768,12813,12814],{},"Refresh mechanism",[3768,12816,12817,12820],{},[3771,12818,12819],{},"Custom Hook:",[3878,12821,12822,12828],{},[3768,12823,12824,12827],{},[3782,12825,12826],{},"useAuth()"," з перевіркою наявності Provider",[3768,12829,12830],{},"Type-safe доступ до контексту",[3811,12832],{},[3738,12834,12836],{"id":12835},"розділ-5-navigation-guards-захищені-маршрути","Розділ 5: Navigation Guards — Захищені Маршрути",[3750,12838,12840],{"id":12839},"_51-архітектура-навігації-з-автентифікацією","5.1. Архітектура Навігації з Автентифікацією",[3743,12842,12843],{},"У застосунках з автентифікацією зазвичай існує два окремі навігаційні стеки:",[3878,12845,12846,12852],{},[3768,12847,12848,12851],{},[3771,12849,12850],{},"Auth Stack"," — екрани для неавторизованих користувачів (Login, Register, ForgotPassword)",[3768,12853,12854,12857],{},[3771,12855,12856],{},"App Stack"," — екрани основного функціоналу (доступні лише після входу)",[3743,12859,12860,12863],{},[3771,12861,12862],{},"Root Navigator"," вибирає, який стек показувати, базуючись на стані автентифікації:",[3857,12865,12868],{"className":12866,"code":12867,"language":3862},[3860],"RootNavigator\n   ↓\nisAuthenticated?\n   ├─ YES → AppNavigator\n   │           ├─ HomeScreen\n   │           ├─ NotesListScreen\n   │           ├─ NoteDetailScreen\n   │           └─ ProfileScreen\n   │\n   └─ NO  → AuthNavigator\n               ├─ LoginScreen\n               ├─ RegisterScreen\n               └─ ForgotPasswordScreen\n",[3782,12869,12867],{"__ignoreMap":3865},[3750,12871,12873],{"id":12872},"_52-реалізація-root-navigator","5.2. Реалізація Root Navigator",[3857,12875,12877],{"className":4242,"code":12876,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fnavigation\u002FRootNavigator.tsx\n\nimport React from 'react';\nimport { NavigationContainer } from '@react-navigation\u002Fnative';\nimport { View, ActivityIndicator, StyleSheet } from 'react-native';\nimport { useAuth } from '..\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext';\nimport { AuthNavigator } from '.\u002FAuthNavigator';\nimport { AppNavigator } from '.\u002FAppNavigator';\n\n\u002F**\n * Головний навігатор додатку\n * Вирішує, який стек показувати на основі стану автентифікації\n *\u002F\nexport function RootNavigator() {\n  const { isAuthenticated, isLoading } = useAuth();\n\n  \u002F\u002F Показуємо загрузочний екран поки перевіряємо токени\n  if (isLoading) {\n    return (\n      \u003CView style={styles.loadingContainer}>\n        \u003CActivityIndicator size=\"large\" color=\"#007AFF\" \u002F>\n      \u003C\u002FView>\n    );\n  }\n\n  return (\n    \u003CNavigationContainer>\n      {isAuthenticated ? \u003CAppNavigator \u002F> : \u003CAuthNavigator \u002F>}\n    \u003C\u002FNavigationContainer>\n  );\n}\n\nconst styles = StyleSheet.create({\n  loadingContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: '#FFFFFF',\n  },\n});\n",[3782,12878,12879,12884,12888,12900,12918,12946,12964,12982,13000,13004,13008,13013,13018,13022,13033,13054,13058,13063,13073,13080,13099,13126,13136,13140,13144,13148,13154,13163,13183,13192,13196,13200,13204,13221,13228,13238,13248,13257,13267,13272],{"__ignoreMap":3865},[3946,12880,12881],{"class":3948,"line":3949},[3946,12882,12883],{"class":4342},"\u002F\u002F src\u002Fnavigation\u002FRootNavigator.tsx\n",[3946,12885,12886],{"class":3948,"line":3956},[3946,12887,4278],{"emptyLinePlaceholder":4277},[3946,12889,12890,12892,12894,12896,12898],{"class":3948,"line":3973},[3946,12891,4252],{"class":4251},[3946,12893,10244],{"class":4262},[3946,12895,4266],{"class":4251},[3946,12897,10304],{"class":3966},[3946,12899,4272],{"class":3952},[3946,12901,12902,12904,12906,12909,12911,12913,12916],{"class":3948,"line":3986},[3946,12903,4252],{"class":4251},[3946,12905,6817],{"class":3952},[3946,12907,12908],{"class":4262},"NavigationContainer",[3946,12910,6823],{"class":3952},[3946,12912,6826],{"class":4251},[3946,12914,12915],{"class":3966}," '@react-navigation\u002Fnative'",[3946,12917,4272],{"class":3952},[3946,12919,12920,12922,12924,12927,12929,12932,12934,12937,12939,12941,12944],{"class":3948,"line":3999},[3946,12921,4252],{"class":4251},[3946,12923,6817],{"class":3952},[3946,12925,12926],{"class":4262},"View",[3946,12928,4447],{"class":3952},[3946,12930,12931],{"class":4262},"ActivityIndicator",[3946,12933,4447],{"class":3952},[3946,12935,12936],{"class":4262},"StyleSheet",[3946,12938,6823],{"class":3952},[3946,12940,6826],{"class":4251},[3946,12942,12943],{"class":3966}," 'react-native'",[3946,12945,4272],{"class":3952},[3946,12947,12948,12950,12952,12955,12957,12959,12962],{"class":3948,"line":4012},[3946,12949,4252],{"class":4251},[3946,12951,6817],{"class":3952},[3946,12953,12954],{"class":4262},"useAuth",[3946,12956,6823],{"class":3952},[3946,12958,6826],{"class":4251},[3946,12960,12961],{"class":3966}," '..\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext'",[3946,12963,4272],{"class":3952},[3946,12965,12966,12968,12970,12973,12975,12977,12980],{"class":3948,"line":4026},[3946,12967,4252],{"class":4251},[3946,12969,6817],{"class":3952},[3946,12971,12972],{"class":4262},"AuthNavigator",[3946,12974,6823],{"class":3952},[3946,12976,6826],{"class":4251},[3946,12978,12979],{"class":3966}," '.\u002FAuthNavigator'",[3946,12981,4272],{"class":3952},[3946,12983,12984,12986,12988,12991,12993,12995,12998],{"class":3948,"line":4037},[3946,12985,4252],{"class":4251},[3946,12987,6817],{"class":3952},[3946,12989,12990],{"class":4262},"AppNavigator",[3946,12992,6823],{"class":3952},[3946,12994,6826],{"class":4251},[3946,12996,12997],{"class":3966}," '.\u002FAppNavigator'",[3946,12999,4272],{"class":3952},[3946,13001,13002],{"class":3948,"line":4487},[3946,13003,4278],{"emptyLinePlaceholder":4277},[3946,13005,13006],{"class":3948,"line":4507},[3946,13007,6015],{"class":4342},[3946,13009,13010],{"class":3948,"line":4518},[3946,13011,13012],{"class":4342}," * Головний навігатор додатку\n",[3946,13014,13015],{"class":3948,"line":4524},[3946,13016,13017],{"class":4342}," * Вирішує, який стек показувати на основі стану автентифікації\n",[3946,13019,13020],{"class":3948,"line":4529},[3946,13021,6025],{"class":4342},[3946,13023,13024,13026,13028,13031],{"class":3948,"line":4534},[3946,13025,6030],{"class":4251},[3946,13027,4390],{"class":4255},[3946,13029,13030],{"class":4224}," RootNavigator",[3946,13032,8490],{"class":3952},[3946,13034,13035,13037,13039,13042,13044,13047,13050,13052],{"class":3948,"line":4540},[3946,13036,5018],{"class":4255},[3946,13038,6817],{"class":3952},[3946,13040,13041],{"class":4286},"isAuthenticated",[3946,13043,4447],{"class":3952},[3946,13045,13046],{"class":4286},"isLoading",[3946,13048,13049],{"class":3952}," } = ",[3946,13051,12954],{"class":4224},[3946,13053,4304],{"class":3952},[3946,13055,13056],{"class":3948,"line":4567},[3946,13057,4278],{"emptyLinePlaceholder":4277},[3946,13059,13060],{"class":3948,"line":4574},[3946,13061,13062],{"class":4342},"  \u002F\u002F Показуємо загрузочний екран поки перевіряємо токени\n",[3946,13064,13065,13067,13069,13071],{"class":3948,"line":4600},[3946,13066,5776],{"class":4251},[3946,13068,4479],{"class":3952},[3946,13070,13046],{"class":4262},[3946,13072,4318],{"class":3952},[3946,13074,13075,13077],{"class":3948,"line":4610},[3946,13076,4603],{"class":4251},[3946,13078,13079],{"class":3952}," (\n",[3946,13081,13082,13085,13087,13090,13093,13096],{"class":3948,"line":4623},[3946,13083,13084],{"class":3952},"      \u003C",[3946,13086,12926],{"class":4262},[3946,13088,13089],{"class":4262}," style",[3946,13091,13092],{"class":3952},"={styles.",[3946,13094,13095],{"class":4262},"loadingContainer",[3946,13097,13098],{"class":3952},"}>\n",[3946,13100,13101,13104,13106,13109,13112,13115,13118,13120,13123],{"class":3948,"line":4643},[3946,13102,13103],{"class":3952},"        \u003C",[3946,13105,12931],{"class":4262},[3946,13107,13108],{"class":4262}," size",[3946,13110,13111],{"class":3952},"=",[3946,13113,13114],{"class":3966},"\"large\"",[3946,13116,13117],{"class":4262}," color",[3946,13119,13111],{"class":3952},[3946,13121,13122],{"class":3966},"\"#007AFF\"",[3946,13124,13125],{"class":3952}," \u002F>\n",[3946,13127,13128,13131,13133],{"class":3948,"line":4653},[3946,13129,13130],{"class":3952},"      \u003C\u002F",[3946,13132,12926],{"class":4262},[3946,13134,13135],{"class":3952},">\n",[3946,13137,13138],{"class":3948,"line":4658},[3946,13139,8731],{"class":3952},[3946,13141,13142],{"class":3948,"line":4663},[3946,13143,4521],{"class":3952},[3946,13145,13146],{"class":3948,"line":4668},[3946,13147,4278],{"emptyLinePlaceholder":4277},[3946,13149,13150,13152],{"class":3948,"line":4674},[3946,13151,5062],{"class":4251},[3946,13153,13079],{"class":3952},[3946,13155,13156,13159,13161],{"class":3948,"line":4694},[3946,13157,13158],{"class":3952},"    \u003C",[3946,13160,12908],{"class":4403},[3946,13162,13135],{"class":3952},[3946,13164,13165,13168,13170,13173,13175,13178,13180],{"class":3948,"line":4701},[3946,13166,13167],{"class":3952},"      {",[3946,13169,13041],{"class":4262},[3946,13171,13172],{"class":3952}," ? \u003C",[3946,13174,12990],{"class":4262},[3946,13176,13177],{"class":3952}," \u002F> : \u003C",[3946,13179,12972],{"class":4262},[3946,13181,13182],{"class":3952}," \u002F>}\n",[3946,13184,13185,13188,13190],{"class":3948,"line":4719},[3946,13186,13187],{"class":3952},"    \u003C\u002F",[3946,13189,12908],{"class":4262},[3946,13191,13135],{"class":3952},[3946,13193,13194],{"class":3948,"line":4735},[3946,13195,10875],{"class":3952},[3946,13197,13198],{"class":3948,"line":4748},[3946,13199,4040],{"class":3952},[3946,13201,13202],{"class":3948,"line":4768},[3946,13203,4278],{"emptyLinePlaceholder":4277},[3946,13205,13206,13208,13211,13213,13215,13217,13219],{"class":3948,"line":4777},[3946,13207,4283],{"class":4255},[3946,13209,13210],{"class":4286}," styles",[3946,13212,4290],{"class":3952},[3946,13214,12936],{"class":4262},[3946,13216,4298],{"class":3952},[3946,13218,8509],{"class":4224},[3946,13220,8512],{"class":3952},[3946,13222,13223,13226],{"class":3948,"line":4782},[3946,13224,13225],{"class":4262},"  loadingContainer:",[3946,13227,4427],{"class":3952},[3946,13229,13230,13233,13236],{"class":3948,"line":6262},[3946,13231,13232],{"class":4262},"    flex:",[3946,13234,13235],{"class":4020}," 1",[3946,13237,3970],{"class":3952},[3946,13239,13240,13243,13246],{"class":3948,"line":6273},[3946,13241,13242],{"class":4262},"    justifyContent:",[3946,13244,13245],{"class":3966}," 'center'",[3946,13247,3970],{"class":3952},[3946,13249,13250,13253,13255],{"class":3948,"line":6284},[3946,13251,13252],{"class":4262},"    alignItems:",[3946,13254,13245],{"class":3966},[3946,13256,3970],{"class":3952},[3946,13258,13259,13262,13265],{"class":3948,"line":6299},[3946,13260,13261],{"class":4262},"    backgroundColor:",[3946,13263,13264],{"class":3966}," '#FFFFFF'",[3946,13266,3970],{"class":3952},[3946,13268,13269],{"class":3948,"line":6304},[3946,13270,13271],{"class":3952},"  },\n",[3946,13273,13274],{"class":3948,"line":6309},[3946,13275,13276],{"class":3952},"});\n",[3743,13278,13279],{},[3771,13280,13281],{},"Чому це працює:",[3765,13283,13284,13293,13302],{},[3768,13285,13286,13289,13290,13292],{},[3771,13287,13288],{},"Автоматичний редірект:"," Коли ",[3782,13291,13041],{}," змінюється, React автоматично перемикає стеки",[3768,13294,13295,13298,13299,13301],{},[3771,13296,13297],{},"No flash:"," ",[3782,13300,13046],{}," запобігає миготінню екранів під час початкової перевірки",[3768,13303,13304,13307,13308],{},[3771,13305,13306],{},"Simple logic:"," Вся складна логіка інкапсульована в ",[3782,13309,12592],{},[3750,13311,13313],{"id":13312},"_53-auth-navigator-стек-для-неавторизованих","5.3. Auth Navigator — Стек для Неавторизованих",[3857,13315,13317],{"className":4242,"code":13316,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fnavigation\u002FAuthNavigator.tsx\n\nimport React from 'react';\nimport { createNativeStackNavigator } from '@react-navigation\u002Fnative-stack';\nimport { LoginScreen } from '..\u002Fscreens\u002Fauth\u002FLoginScreen';\nimport { RegisterScreen } from '..\u002Fscreens\u002Fauth\u002FRegisterScreen';\nimport { ForgotPasswordScreen } from '..\u002Fscreens\u002Fauth\u002FForgotPasswordScreen';\n\n\u002F**\n * Типізація параметрів навігації\n *\u002F\nexport type AuthStackParamList = {\n  Login: undefined;\n  Register: undefined;\n  ForgotPassword: undefined;\n};\n\nconst Stack = createNativeStackNavigator\u003CAuthStackParamList>();\n\n\u002F**\n * Навігаційний стек для неавторизованих користувачів\n *\u002F\nexport function AuthNavigator() {\n  return (\n    \u003CStack.Navigator\n      initialRouteName=\"Login\"\n      screenOptions={{\n        headerShown: false, \u002F\u002F Приховуємо header для кастомного дизайну\n        animation: 'slide_from_right',\n      }}\n    >\n      \u003CStack.Screen name=\"Login\" component={LoginScreen} \u002F>\n      \u003CStack.Screen name=\"Register\" component={RegisterScreen} \u002F>\n      \u003CStack.Screen name=\"ForgotPassword\" component={ForgotPasswordScreen} \u002F>\n    \u003C\u002FStack.Navigator>\n  );\n}\n",[3782,13318,13319,13324,13328,13340,13358,13376,13394,13412,13416,13420,13425,13429,13440,13451,13462,13473,13478,13482,13501,13505,13509,13514,13518,13529,13535,13547,13557,13565,13581,13593,13598,13603,13632,13657,13682,13695,13699],{"__ignoreMap":3865},[3946,13320,13321],{"class":3948,"line":3949},[3946,13322,13323],{"class":4342},"\u002F\u002F src\u002Fnavigation\u002FAuthNavigator.tsx\n",[3946,13325,13326],{"class":3948,"line":3956},[3946,13327,4278],{"emptyLinePlaceholder":4277},[3946,13329,13330,13332,13334,13336,13338],{"class":3948,"line":3973},[3946,13331,4252],{"class":4251},[3946,13333,10244],{"class":4262},[3946,13335,4266],{"class":4251},[3946,13337,10304],{"class":3966},[3946,13339,4272],{"class":3952},[3946,13341,13342,13344,13346,13349,13351,13353,13356],{"class":3948,"line":3986},[3946,13343,4252],{"class":4251},[3946,13345,6817],{"class":3952},[3946,13347,13348],{"class":4262},"createNativeStackNavigator",[3946,13350,6823],{"class":3952},[3946,13352,6826],{"class":4251},[3946,13354,13355],{"class":3966}," '@react-navigation\u002Fnative-stack'",[3946,13357,4272],{"class":3952},[3946,13359,13360,13362,13364,13367,13369,13371,13374],{"class":3948,"line":3999},[3946,13361,4252],{"class":4251},[3946,13363,6817],{"class":3952},[3946,13365,13366],{"class":4262},"LoginScreen",[3946,13368,6823],{"class":3952},[3946,13370,6826],{"class":4251},[3946,13372,13373],{"class":3966}," '..\u002Fscreens\u002Fauth\u002FLoginScreen'",[3946,13375,4272],{"class":3952},[3946,13377,13378,13380,13382,13385,13387,13389,13392],{"class":3948,"line":4012},[3946,13379,4252],{"class":4251},[3946,13381,6817],{"class":3952},[3946,13383,13384],{"class":4262},"RegisterScreen",[3946,13386,6823],{"class":3952},[3946,13388,6826],{"class":4251},[3946,13390,13391],{"class":3966}," '..\u002Fscreens\u002Fauth\u002FRegisterScreen'",[3946,13393,4272],{"class":3952},[3946,13395,13396,13398,13400,13403,13405,13407,13410],{"class":3948,"line":4026},[3946,13397,4252],{"class":4251},[3946,13399,6817],{"class":3952},[3946,13401,13402],{"class":4262},"ForgotPasswordScreen",[3946,13404,6823],{"class":3952},[3946,13406,6826],{"class":4251},[3946,13408,13409],{"class":3966}," '..\u002Fscreens\u002Fauth\u002FForgotPasswordScreen'",[3946,13411,4272],{"class":3952},[3946,13413,13414],{"class":3948,"line":4037},[3946,13415,4278],{"emptyLinePlaceholder":4277},[3946,13417,13418],{"class":3948,"line":4487},[3946,13419,6015],{"class":4342},[3946,13421,13422],{"class":3948,"line":4507},[3946,13423,13424],{"class":4342}," * Типізація параметрів навігації\n",[3946,13426,13427],{"class":3948,"line":4518},[3946,13428,6025],{"class":4342},[3946,13430,13431,13433,13435,13438],{"class":3948,"line":4524},[3946,13432,6030],{"class":4251},[3946,13434,6814],{"class":4255},[3946,13436,13437],{"class":4403}," AuthStackParamList",[3946,13439,5893],{"class":3952},[3946,13441,13442,13445,13447,13449],{"class":3948,"line":4529},[3946,13443,13444],{"class":4262},"  Login",[3946,13446,3963],{"class":3952},[3946,13448,10429],{"class":4403},[3946,13450,4272],{"class":3952},[3946,13452,13453,13456,13458,13460],{"class":3948,"line":4534},[3946,13454,13455],{"class":4262},"  Register",[3946,13457,3963],{"class":3952},[3946,13459,10429],{"class":4403},[3946,13461,4272],{"class":3952},[3946,13463,13464,13467,13469,13471],{"class":3948,"line":4540},[3946,13465,13466],{"class":4262},"  ForgotPassword",[3946,13468,3963],{"class":3952},[3946,13470,10429],{"class":4403},[3946,13472,4272],{"class":3952},[3946,13474,13475],{"class":3948,"line":4567},[3946,13476,13477],{"class":3952},"};\n",[3946,13479,13480],{"class":3948,"line":4574},[3946,13481,4278],{"emptyLinePlaceholder":4277},[3946,13483,13484,13486,13489,13491,13493,13495,13498],{"class":3948,"line":4600},[3946,13485,4283],{"class":4255},[3946,13487,13488],{"class":4286}," Stack",[3946,13490,4290],{"class":3952},[3946,13492,13348],{"class":4224},[3946,13494,4413],{"class":3952},[3946,13496,13497],{"class":4403},"AuthStackParamList",[3946,13499,13500],{"class":3952},">();\n",[3946,13502,13503],{"class":3948,"line":4610},[3946,13504,4278],{"emptyLinePlaceholder":4277},[3946,13506,13507],{"class":3948,"line":4623},[3946,13508,6015],{"class":4342},[3946,13510,13511],{"class":3948,"line":4643},[3946,13512,13513],{"class":4342}," * Навігаційний стек для неавторизованих користувачів\n",[3946,13515,13516],{"class":3948,"line":4653},[3946,13517,6025],{"class":4342},[3946,13519,13520,13522,13524,13527],{"class":3948,"line":4658},[3946,13521,6030],{"class":4251},[3946,13523,4390],{"class":4255},[3946,13525,13526],{"class":4224}," AuthNavigator",[3946,13528,8490],{"class":3952},[3946,13530,13531,13533],{"class":3948,"line":4663},[3946,13532,5062],{"class":4251},[3946,13534,13079],{"class":3952},[3946,13536,13537,13539,13542,13544],{"class":3948,"line":4668},[3946,13538,13158],{"class":3952},[3946,13540,13541],{"class":4262},"Stack",[3946,13543,4298],{"class":3952},[3946,13545,13546],{"class":4262},"Navigator\n",[3946,13548,13549,13552,13554],{"class":3948,"line":4674},[3946,13550,13551],{"class":4262},"      initialRouteName",[3946,13553,13111],{"class":3952},[3946,13555,13556],{"class":3966},"\"Login\"\n",[3946,13558,13559,13562],{"class":3948,"line":4694},[3946,13560,13561],{"class":4262},"      screenOptions",[3946,13563,13564],{"class":3952},"={{\n",[3946,13566,13567,13571,13573,13576,13578],{"class":3948,"line":4701},[3946,13568,13570],{"class":13569},"s5IvJ","        headerShown",[3946,13572,3963],{"class":3952},[3946,13574,13575],{"class":4255},"false",[3946,13577,4447],{"class":3952},[3946,13579,13580],{"class":4342},"\u002F\u002F Приховуємо header для кастомного дизайну\n",[3946,13582,13583,13586,13588,13591],{"class":3948,"line":4719},[3946,13584,13585],{"class":13569},"        animation",[3946,13587,3963],{"class":3952},[3946,13589,13590],{"class":3966},"'slide_from_right'",[3946,13592,3970],{"class":3952},[3946,13594,13595],{"class":3948,"line":4735},[3946,13596,13597],{"class":3952},"      }}\n",[3946,13599,13600],{"class":3948,"line":4748},[3946,13601,13602],{"class":3952},"    >\n",[3946,13604,13605,13607,13609,13611,13614,13617,13619,13622,13625,13627,13629],{"class":3948,"line":4768},[3946,13606,13084],{"class":3952},[3946,13608,13541],{"class":4262},[3946,13610,4298],{"class":3952},[3946,13612,13613],{"class":4262},"Screen",[3946,13615,13616],{"class":4262}," name",[3946,13618,13111],{"class":3952},[3946,13620,13621],{"class":3966},"\"Login\"",[3946,13623,13624],{"class":4262}," component",[3946,13626,12602],{"class":3952},[3946,13628,13366],{"class":4262},[3946,13630,13631],{"class":3952},"} \u002F>\n",[3946,13633,13634,13636,13638,13640,13642,13644,13646,13649,13651,13653,13655],{"class":3948,"line":4777},[3946,13635,13084],{"class":3952},[3946,13637,13541],{"class":4262},[3946,13639,4298],{"class":3952},[3946,13641,13613],{"class":4262},[3946,13643,13616],{"class":4262},[3946,13645,13111],{"class":3952},[3946,13647,13648],{"class":3966},"\"Register\"",[3946,13650,13624],{"class":4262},[3946,13652,12602],{"class":3952},[3946,13654,13384],{"class":4262},[3946,13656,13631],{"class":3952},[3946,13658,13659,13661,13663,13665,13667,13669,13671,13674,13676,13678,13680],{"class":3948,"line":4782},[3946,13660,13084],{"class":3952},[3946,13662,13541],{"class":4262},[3946,13664,4298],{"class":3952},[3946,13666,13613],{"class":4262},[3946,13668,13616],{"class":4262},[3946,13670,13111],{"class":3952},[3946,13672,13673],{"class":3966},"\"ForgotPassword\"",[3946,13675,13624],{"class":4262},[3946,13677,12602],{"class":3952},[3946,13679,13402],{"class":4262},[3946,13681,13631],{"class":3952},[3946,13683,13684,13686,13688,13690,13693],{"class":3948,"line":6262},[3946,13685,13187],{"class":3952},[3946,13687,13541],{"class":4262},[3946,13689,4298],{"class":3952},[3946,13691,13692],{"class":4262},"Navigator",[3946,13694,13135],{"class":3952},[3946,13696,13697],{"class":3948,"line":6273},[3946,13698,10875],{"class":3952},[3946,13700,13701],{"class":3948,"line":6284},[3946,13702,4040],{"class":3952},[3750,13704,13706],{"id":13705},"_54-app-navigator-стек-для-авторизованих","5.4. App Navigator — Стек для Авторизованих",[3857,13708,13710],{"className":4242,"code":13709,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fnavigation\u002FAppNavigator.tsx\n\nimport React from 'react';\nimport { createNativeStackNavigator } from '@react-navigation\u002Fnative-stack';\nimport { createBottomTabNavigator } from '@react-navigation\u002Fbottom-tabs';\nimport { Ionicons } from '@expo\u002Fvector-icons';\nimport { HomeScreen } from '..\u002Fscreens\u002Fapp\u002FHomeScreen';\nimport { NotesListScreen } from '..\u002Fscreens\u002Fapp\u002FNotesListScreen';\nimport { NoteDetailScreen } from '..\u002Fscreens\u002Fapp\u002FNoteDetailScreen';\nimport { ProfileScreen } from '..\u002Fscreens\u002Fapp\u002FProfileScreen';\n\n\u002F**\n * Типізація параметрів навігації\n *\u002F\nexport type AppStackParamList = {\n  MainTabs: undefined;\n  NoteDetail: { noteId: string };\n};\n\nexport type MainTabsParamList = {\n  Home: undefined;\n  Notes: undefined;\n  Profile: undefined;\n};\n\nconst Stack = createNativeStackNavigator\u003CAppStackParamList>();\nconst Tab = createBottomTabNavigator\u003CMainTabsParamList>();\n\n\u002F**\n * Bottom Tab Navigator\n *\u002F\nfunction MainTabs() {\n  return (\n    \u003CTab.Navigator\n      screenOptions={({ route }) => ({\n        tabBarIcon: ({ focused, color, size }) => {\n          let iconName: keyof typeof Ionicons.glyphMap;\n\n          switch (route.name) {\n            case 'Home':\n              iconName = focused ? 'home' : 'home-outline';\n              break;\n            case 'Notes':\n              iconName = focused ? 'document-text' : 'document-text-outline';\n              break;\n            case 'Profile':\n              iconName = focused ? 'person' : 'person-outline';\n              break;\n            default:\n              iconName = 'help-outline';\n          }\n\n          return \u003CIonicons name={iconName} size={size} color={color} \u002F>;\n        },\n        tabBarActiveTintColor: '#007AFF',\n        tabBarInactiveTintColor: '#8E8E93',\n        headerShown: false,\n      })}\n    >\n      \u003CTab.Screen\n        name=\"Home\"\n        component={HomeScreen}\n        options={{ tabBarLabel: 'Головна' }}\n      \u002F>\n      \u003CTab.Screen\n        name=\"Notes\"\n        component={NotesListScreen}\n        options={{ tabBarLabel: 'Нотатки' }}\n      \u002F>\n      \u003CTab.Screen\n        name=\"Profile\"\n        component={ProfileScreen}\n        options={{ tabBarLabel: 'Профіль' }}\n      \u002F>\n    \u003C\u002FTab.Navigator>\n  );\n}\n\n\u002F**\n * Навігаційний стек для авторизованих користувачів\n *\u002F\nexport function AppNavigator() {\n  return (\n    \u003CStack.Navigator>\n      \u003CStack.Screen\n        name=\"MainTabs\"\n        component={MainTabs}\n        options={{ headerShown: false }}\n      \u002F>\n      \u003CStack.Screen\n        name=\"NoteDetail\"\n        component={NoteDetailScreen}\n        options={{\n          title: 'Деталі нотатки',\n          headerBackTitle: 'Назад',\n        }}\n      \u002F>\n    \u003C\u002FStack.Navigator>\n  );\n}\n",[3782,13711,13712,13717,13721,13733,13749,13767,13785,13803,13821,13839,13857,13861,13865,13869,13873,13884,13895,13913,13917,13921,13932,13943,13954,13965,13969,13973,13990,14008,14012,14016,14021,14025,14035,14041,14052,14065,14093,14119,14123,14138,14148,14169,14176,14185,14205,14211,14220,14240,14246,14253,14264,14269,14273,14307,14312,14324,14336,14346,14351,14355,14366,14376,14387,14406,14411,14421,14430,14440,14455,14459,14469,14478,14488,14503,14507,14519,14523,14527,14531,14535,14540,14544,14555,14561,14573,14583,14592,14603,14618,14622,14632,14641,14651,14657,14669,14681,14686,14690,14702,14706],{"__ignoreMap":3865},[3946,13713,13714],{"class":3948,"line":3949},[3946,13715,13716],{"class":4342},"\u002F\u002F src\u002Fnavigation\u002FAppNavigator.tsx\n",[3946,13718,13719],{"class":3948,"line":3956},[3946,13720,4278],{"emptyLinePlaceholder":4277},[3946,13722,13723,13725,13727,13729,13731],{"class":3948,"line":3973},[3946,13724,4252],{"class":4251},[3946,13726,10244],{"class":4262},[3946,13728,4266],{"class":4251},[3946,13730,10304],{"class":3966},[3946,13732,4272],{"class":3952},[3946,13734,13735,13737,13739,13741,13743,13745,13747],{"class":3948,"line":3986},[3946,13736,4252],{"class":4251},[3946,13738,6817],{"class":3952},[3946,13740,13348],{"class":4262},[3946,13742,6823],{"class":3952},[3946,13744,6826],{"class":4251},[3946,13746,13355],{"class":3966},[3946,13748,4272],{"class":3952},[3946,13750,13751,13753,13755,13758,13760,13762,13765],{"class":3948,"line":3999},[3946,13752,4252],{"class":4251},[3946,13754,6817],{"class":3952},[3946,13756,13757],{"class":4262},"createBottomTabNavigator",[3946,13759,6823],{"class":3952},[3946,13761,6826],{"class":4251},[3946,13763,13764],{"class":3966}," '@react-navigation\u002Fbottom-tabs'",[3946,13766,4272],{"class":3952},[3946,13768,13769,13771,13773,13776,13778,13780,13783],{"class":3948,"line":4012},[3946,13770,4252],{"class":4251},[3946,13772,6817],{"class":3952},[3946,13774,13775],{"class":4262},"Ionicons",[3946,13777,6823],{"class":3952},[3946,13779,6826],{"class":4251},[3946,13781,13782],{"class":3966}," '@expo\u002Fvector-icons'",[3946,13784,4272],{"class":3952},[3946,13786,13787,13789,13791,13794,13796,13798,13801],{"class":3948,"line":4026},[3946,13788,4252],{"class":4251},[3946,13790,6817],{"class":3952},[3946,13792,13793],{"class":4262},"HomeScreen",[3946,13795,6823],{"class":3952},[3946,13797,6826],{"class":4251},[3946,13799,13800],{"class":3966}," '..\u002Fscreens\u002Fapp\u002FHomeScreen'",[3946,13802,4272],{"class":3952},[3946,13804,13805,13807,13809,13812,13814,13816,13819],{"class":3948,"line":4037},[3946,13806,4252],{"class":4251},[3946,13808,6817],{"class":3952},[3946,13810,13811],{"class":4262},"NotesListScreen",[3946,13813,6823],{"class":3952},[3946,13815,6826],{"class":4251},[3946,13817,13818],{"class":3966}," '..\u002Fscreens\u002Fapp\u002FNotesListScreen'",[3946,13820,4272],{"class":3952},[3946,13822,13823,13825,13827,13830,13832,13834,13837],{"class":3948,"line":4487},[3946,13824,4252],{"class":4251},[3946,13826,6817],{"class":3952},[3946,13828,13829],{"class":4262},"NoteDetailScreen",[3946,13831,6823],{"class":3952},[3946,13833,6826],{"class":4251},[3946,13835,13836],{"class":3966}," '..\u002Fscreens\u002Fapp\u002FNoteDetailScreen'",[3946,13838,4272],{"class":3952},[3946,13840,13841,13843,13845,13848,13850,13852,13855],{"class":3948,"line":4507},[3946,13842,4252],{"class":4251},[3946,13844,6817],{"class":3952},[3946,13846,13847],{"class":4262},"ProfileScreen",[3946,13849,6823],{"class":3952},[3946,13851,6826],{"class":4251},[3946,13853,13854],{"class":3966}," '..\u002Fscreens\u002Fapp\u002FProfileScreen'",[3946,13856,4272],{"class":3952},[3946,13858,13859],{"class":3948,"line":4518},[3946,13860,4278],{"emptyLinePlaceholder":4277},[3946,13862,13863],{"class":3948,"line":4524},[3946,13864,6015],{"class":4342},[3946,13866,13867],{"class":3948,"line":4529},[3946,13868,13424],{"class":4342},[3946,13870,13871],{"class":3948,"line":4534},[3946,13872,6025],{"class":4342},[3946,13874,13875,13877,13879,13882],{"class":3948,"line":4540},[3946,13876,6030],{"class":4251},[3946,13878,6814],{"class":4255},[3946,13880,13881],{"class":4403}," AppStackParamList",[3946,13883,5893],{"class":3952},[3946,13885,13886,13889,13891,13893],{"class":3948,"line":4567},[3946,13887,13888],{"class":4262},"  MainTabs",[3946,13890,3963],{"class":3952},[3946,13892,10429],{"class":4403},[3946,13894,4272],{"class":3952},[3946,13896,13897,13900,13903,13906,13908,13910],{"class":3948,"line":4574},[3946,13898,13899],{"class":4262},"  NoteDetail",[3946,13901,13902],{"class":3952},": { ",[3946,13904,13905],{"class":4262},"noteId",[3946,13907,3963],{"class":3952},[3946,13909,4404],{"class":4403},[3946,13911,13912],{"class":3952}," };\n",[3946,13914,13915],{"class":3948,"line":4600},[3946,13916,13477],{"class":3952},[3946,13918,13919],{"class":3948,"line":4610},[3946,13920,4278],{"emptyLinePlaceholder":4277},[3946,13922,13923,13925,13927,13930],{"class":3948,"line":4623},[3946,13924,6030],{"class":4251},[3946,13926,6814],{"class":4255},[3946,13928,13929],{"class":4403}," MainTabsParamList",[3946,13931,5893],{"class":3952},[3946,13933,13934,13937,13939,13941],{"class":3948,"line":4643},[3946,13935,13936],{"class":4262},"  Home",[3946,13938,3963],{"class":3952},[3946,13940,10429],{"class":4403},[3946,13942,4272],{"class":3952},[3946,13944,13945,13948,13950,13952],{"class":3948,"line":4653},[3946,13946,13947],{"class":4262},"  Notes",[3946,13949,3963],{"class":3952},[3946,13951,10429],{"class":4403},[3946,13953,4272],{"class":3952},[3946,13955,13956,13959,13961,13963],{"class":3948,"line":4658},[3946,13957,13958],{"class":4262},"  Profile",[3946,13960,3963],{"class":3952},[3946,13962,10429],{"class":4403},[3946,13964,4272],{"class":3952},[3946,13966,13967],{"class":3948,"line":4663},[3946,13968,13477],{"class":3952},[3946,13970,13971],{"class":3948,"line":4668},[3946,13972,4278],{"emptyLinePlaceholder":4277},[3946,13974,13975,13977,13979,13981,13983,13985,13988],{"class":3948,"line":4674},[3946,13976,4283],{"class":4255},[3946,13978,13488],{"class":4286},[3946,13980,4290],{"class":3952},[3946,13982,13348],{"class":4224},[3946,13984,4413],{"class":3952},[3946,13986,13987],{"class":4403},"AppStackParamList",[3946,13989,13500],{"class":3952},[3946,13991,13992,13994,13997,13999,14001,14003,14006],{"class":3948,"line":4694},[3946,13993,4283],{"class":4255},[3946,13995,13996],{"class":4286}," Tab",[3946,13998,4290],{"class":3952},[3946,14000,13757],{"class":4224},[3946,14002,4413],{"class":3952},[3946,14004,14005],{"class":4403},"MainTabsParamList",[3946,14007,13500],{"class":3952},[3946,14009,14010],{"class":3948,"line":4701},[3946,14011,4278],{"emptyLinePlaceholder":4277},[3946,14013,14014],{"class":3948,"line":4719},[3946,14015,6015],{"class":4342},[3946,14017,14018],{"class":3948,"line":4735},[3946,14019,14020],{"class":4342}," * Bottom Tab Navigator\n",[3946,14022,14023],{"class":3948,"line":4748},[3946,14024,6025],{"class":4342},[3946,14026,14027,14030,14033],{"class":3948,"line":4768},[3946,14028,14029],{"class":4255},"function",[3946,14031,14032],{"class":4224}," MainTabs",[3946,14034,8490],{"class":3952},[3946,14036,14037,14039],{"class":3948,"line":4777},[3946,14038,5062],{"class":4251},[3946,14040,13079],{"class":3952},[3946,14042,14043,14045,14048,14050],{"class":3948,"line":4782},[3946,14044,13158],{"class":3952},[3946,14046,14047],{"class":4262},"Tab",[3946,14049,4298],{"class":3952},[3946,14051,13546],{"class":4262},[3946,14053,14054,14056,14059,14062],{"class":3948,"line":6262},[3946,14055,13561],{"class":4262},[3946,14057,14058],{"class":3952},"={({ ",[3946,14060,14061],{"class":4262},"route",[3946,14063,14064],{"class":3952}," }) => ({\n",[3946,14066,14067,14070,14073,14076,14078,14081,14083,14086,14089,14091],{"class":3948,"line":6273},[3946,14068,14069],{"class":13569},"        tabBarIcon",[3946,14071,14072],{"class":3952},": ({ ",[3946,14074,14075],{"class":4262},"focused",[3946,14077,4447],{"class":3952},[3946,14079,14080],{"class":4262},"color",[3946,14082,4447],{"class":3952},[3946,14084,14085],{"class":4262},"size",[3946,14087,14088],{"class":3952}," }) ",[3946,14090,6453],{"class":4255},[3946,14092,4427],{"class":3952},[3946,14094,14095,14098,14101,14103,14106,14109,14112,14114,14117],{"class":3948,"line":6284},[3946,14096,14097],{"class":4255},"          let",[3946,14099,14100],{"class":4262}," iconName",[3946,14102,3963],{"class":3952},[3946,14104,14105],{"class":4255},"keyof",[3946,14107,14108],{"class":4255}," typeof",[3946,14110,14111],{"class":4262}," Ionicons",[3946,14113,4298],{"class":3952},[3946,14115,14116],{"class":4262},"glyphMap",[3946,14118,4272],{"class":3952},[3946,14120,14121],{"class":3948,"line":6299},[3946,14122,4278],{"emptyLinePlaceholder":4277},[3946,14124,14125,14128,14130,14132,14134,14136],{"class":3948,"line":6304},[3946,14126,14127],{"class":4251},"          switch",[3946,14129,4479],{"class":3952},[3946,14131,14061],{"class":4262},[3946,14133,4298],{"class":3952},[3946,14135,6679],{"class":4262},[3946,14137,4318],{"class":3952},[3946,14139,14140,14143,14146],{"class":3948,"line":6309},[3946,14141,14142],{"class":4251},"            case",[3946,14144,14145],{"class":3966}," 'Home'",[3946,14147,9810],{"class":3952},[3946,14149,14150,14153,14155,14157,14159,14162,14164,14167],{"class":3948,"line":6314},[3946,14151,14152],{"class":4262},"              iconName",[3946,14154,4290],{"class":3952},[3946,14156,14075],{"class":4262},[3946,14158,11523],{"class":3952},[3946,14160,14161],{"class":3966},"'home'",[3946,14163,11532],{"class":3952},[3946,14165,14166],{"class":3966},"'home-outline'",[3946,14168,4272],{"class":3952},[3946,14170,14171,14174],{"class":3948,"line":6320},[3946,14172,14173],{"class":4251},"              break",[3946,14175,4272],{"class":3952},[3946,14177,14178,14180,14183],{"class":3948,"line":6325},[3946,14179,14142],{"class":4251},[3946,14181,14182],{"class":3966}," 'Notes'",[3946,14184,9810],{"class":3952},[3946,14186,14187,14189,14191,14193,14195,14198,14200,14203],{"class":3948,"line":6337},[3946,14188,14152],{"class":4262},[3946,14190,4290],{"class":3952},[3946,14192,14075],{"class":4262},[3946,14194,11523],{"class":3952},[3946,14196,14197],{"class":3966},"'document-text'",[3946,14199,11532],{"class":3952},[3946,14201,14202],{"class":3966},"'document-text-outline'",[3946,14204,4272],{"class":3952},[3946,14206,14207,14209],{"class":3948,"line":6352},[3946,14208,14173],{"class":4251},[3946,14210,4272],{"class":3952},[3946,14212,14213,14215,14218],{"class":3948,"line":6364},[3946,14214,14142],{"class":4251},[3946,14216,14217],{"class":3966}," 'Profile'",[3946,14219,9810],{"class":3952},[3946,14221,14222,14224,14226,14228,14230,14233,14235,14238],{"class":3948,"line":6376},[3946,14223,14152],{"class":4262},[3946,14225,4290],{"class":3952},[3946,14227,14075],{"class":4262},[3946,14229,11523],{"class":3952},[3946,14231,14232],{"class":3966},"'person'",[3946,14234,11532],{"class":3952},[3946,14236,14237],{"class":3966},"'person-outline'",[3946,14239,4272],{"class":3952},[3946,14241,14242,14244],{"class":3948,"line":6392},[3946,14243,14173],{"class":4251},[3946,14245,4272],{"class":3952},[3946,14247,14248,14251],{"class":3948,"line":6397},[3946,14249,14250],{"class":4251},"            default",[3946,14252,9810],{"class":3952},[3946,14254,14255,14257,14259,14262],{"class":3948,"line":6402},[3946,14256,14152],{"class":4262},[3946,14258,4290],{"class":3952},[3946,14260,14261],{"class":3966},"'help-outline'",[3946,14263,4272],{"class":3952},[3946,14265,14266],{"class":3948,"line":6407},[3946,14267,14268],{"class":3952},"          }\n",[3946,14270,14271],{"class":3948,"line":6413},[3946,14272,4278],{"emptyLinePlaceholder":4277},[3946,14274,14275,14277,14279,14281,14283,14285,14288,14290,14292,14294,14296,14298,14300,14302,14304],{"class":3948,"line":6418},[3946,14276,9816],{"class":4251},[3946,14278,12589],{"class":3952},[3946,14280,13775],{"class":4403},[3946,14282,13616],{"class":4403},[3946,14284,12602],{"class":3952},[3946,14286,14287],{"class":4262},"iconName",[3946,14289,5928],{"class":3952},[3946,14291,14085],{"class":4403},[3946,14293,12602],{"class":3952},[3946,14295,14085],{"class":4262},[3946,14297,5928],{"class":3952},[3946,14299,14080],{"class":4403},[3946,14301,12602],{"class":3952},[3946,14303,14080],{"class":4262},[3946,14305,14306],{"class":3952},"} \u002F>;\n",[3946,14308,14309],{"class":3948,"line":6434},[3946,14310,14311],{"class":3952},"        },\n",[3946,14313,14314,14317,14319,14322],{"class":3948,"line":6466},[3946,14315,14316],{"class":13569},"        tabBarActiveTintColor",[3946,14318,3963],{"class":3952},[3946,14320,14321],{"class":3966},"'#007AFF'",[3946,14323,3970],{"class":3952},[3946,14325,14326,14329,14331,14334],{"class":3948,"line":6493},[3946,14327,14328],{"class":13569},"        tabBarInactiveTintColor",[3946,14330,3963],{"class":3952},[3946,14332,14333],{"class":3966},"'#8E8E93'",[3946,14335,3970],{"class":3952},[3946,14337,14338,14340,14342,14344],{"class":3948,"line":6512},[3946,14339,13570],{"class":13569},[3946,14341,3963],{"class":3952},[3946,14343,13575],{"class":4255},[3946,14345,3970],{"class":3952},[3946,14347,14348],{"class":3948,"line":6530},[3946,14349,14350],{"class":3952},"      })}\n",[3946,14352,14353],{"class":3948,"line":6545},[3946,14354,13602],{"class":3952},[3946,14356,14357,14359,14361,14363],{"class":3948,"line":6550},[3946,14358,13084],{"class":3952},[3946,14360,14047],{"class":4262},[3946,14362,4298],{"class":3952},[3946,14364,14365],{"class":4262},"Screen\n",[3946,14367,14368,14371,14373],{"class":3948,"line":6555},[3946,14369,14370],{"class":4262},"        name",[3946,14372,13111],{"class":3952},[3946,14374,14375],{"class":3966},"\"Home\"\n",[3946,14377,14378,14381,14383,14385],{"class":3948,"line":6560},[3946,14379,14380],{"class":4262},"        component",[3946,14382,12602],{"class":3952},[3946,14384,13793],{"class":4262},[3946,14386,4040],{"class":3952},[3946,14388,14389,14392,14395,14398,14400,14403],{"class":3948,"line":6566},[3946,14390,14391],{"class":4262},"        options",[3946,14393,14394],{"class":3952},"={{ ",[3946,14396,14397],{"class":13569},"tabBarLabel",[3946,14399,3963],{"class":3952},[3946,14401,14402],{"class":3966},"'Головна'",[3946,14404,14405],{"class":3952}," }}\n",[3946,14407,14408],{"class":3948,"line":6571},[3946,14409,14410],{"class":3952},"      \u002F>\n",[3946,14412,14413,14415,14417,14419],{"class":3948,"line":6588},[3946,14414,13084],{"class":3952},[3946,14416,14047],{"class":4262},[3946,14418,4298],{"class":3952},[3946,14420,14365],{"class":4262},[3946,14422,14423,14425,14427],{"class":3948,"line":6597},[3946,14424,14370],{"class":4262},[3946,14426,13111],{"class":3952},[3946,14428,14429],{"class":3966},"\"Notes\"\n",[3946,14431,14432,14434,14436,14438],{"class":3948,"line":6609},[3946,14433,14380],{"class":4262},[3946,14435,12602],{"class":3952},[3946,14437,13811],{"class":4262},[3946,14439,4040],{"class":3952},[3946,14441,14442,14444,14446,14448,14450,14453],{"class":3948,"line":6640},[3946,14443,14391],{"class":4262},[3946,14445,14394],{"class":3952},[3946,14447,14397],{"class":13569},[3946,14449,3963],{"class":3952},[3946,14451,14452],{"class":3966},"'Нотатки'",[3946,14454,14405],{"class":3952},[3946,14456,14457],{"class":3948,"line":6653},[3946,14458,14410],{"class":3952},[3946,14460,14461,14463,14465,14467],{"class":3948,"line":6659},[3946,14462,13084],{"class":3952},[3946,14464,14047],{"class":4262},[3946,14466,4298],{"class":3952},[3946,14468,14365],{"class":4262},[3946,14470,14471,14473,14475],{"class":3948,"line":6671},[3946,14472,14370],{"class":4262},[3946,14474,13111],{"class":3952},[3946,14476,14477],{"class":3966},"\"Profile\"\n",[3946,14479,14480,14482,14484,14486],{"class":3948,"line":6689},[3946,14481,14380],{"class":4262},[3946,14483,12602],{"class":3952},[3946,14485,13847],{"class":4262},[3946,14487,4040],{"class":3952},[3946,14489,14490,14492,14494,14496,14498,14501],{"class":3948,"line":6694},[3946,14491,14391],{"class":4262},[3946,14493,14394],{"class":3952},[3946,14495,14397],{"class":13569},[3946,14497,3963],{"class":3952},[3946,14499,14500],{"class":3966},"'Профіль'",[3946,14502,14405],{"class":3952},[3946,14504,14505],{"class":3948,"line":6699},[3946,14506,14410],{"class":3952},[3946,14508,14509,14511,14513,14515,14517],{"class":3948,"line":6704},[3946,14510,13187],{"class":3952},[3946,14512,14047],{"class":4262},[3946,14514,4298],{"class":3952},[3946,14516,13692],{"class":4262},[3946,14518,13135],{"class":3952},[3946,14520,14521],{"class":3948,"line":6709},[3946,14522,10875],{"class":3952},[3946,14524,14525],{"class":3948,"line":6715},[3946,14526,4040],{"class":3952},[3946,14528,14529],{"class":3948,"line":6720},[3946,14530,4278],{"emptyLinePlaceholder":4277},[3946,14532,14533],{"class":3948,"line":6732},[3946,14534,6015],{"class":4342},[3946,14536,14537],{"class":3948,"line":6743},[3946,14538,14539],{"class":4342}," * Навігаційний стек для авторизованих користувачів\n",[3946,14541,14542],{"class":3948,"line":6754},[3946,14543,6025],{"class":4342},[3946,14545,14546,14548,14550,14553],{"class":3948,"line":6768},[3946,14547,6030],{"class":4251},[3946,14549,4390],{"class":4255},[3946,14551,14552],{"class":4224}," AppNavigator",[3946,14554,8490],{"class":3952},[3946,14556,14557,14559],{"class":3948,"line":7572},[3946,14558,5062],{"class":4251},[3946,14560,13079],{"class":3952},[3946,14562,14563,14565,14567,14569,14571],{"class":3948,"line":7590},[3946,14564,13158],{"class":3952},[3946,14566,13541],{"class":4262},[3946,14568,4298],{"class":3952},[3946,14570,13692],{"class":4262},[3946,14572,13135],{"class":3952},[3946,14574,14575,14577,14579,14581],{"class":3948,"line":7609},[3946,14576,13084],{"class":3952},[3946,14578,13541],{"class":4262},[3946,14580,4298],{"class":3952},[3946,14582,14365],{"class":4262},[3946,14584,14585,14587,14589],{"class":3948,"line":7615},[3946,14586,14370],{"class":4262},[3946,14588,13111],{"class":3952},[3946,14590,14591],{"class":3966},"\"MainTabs\"\n",[3946,14593,14594,14596,14598,14601],{"class":3948,"line":7633},[3946,14595,14380],{"class":4262},[3946,14597,12602],{"class":3952},[3946,14599,14600],{"class":4262},"MainTabs",[3946,14602,4040],{"class":3952},[3946,14604,14605,14607,14609,14612,14614,14616],{"class":3948,"line":7638},[3946,14606,14391],{"class":4262},[3946,14608,14394],{"class":3952},[3946,14610,14611],{"class":13569},"headerShown",[3946,14613,3963],{"class":3952},[3946,14615,13575],{"class":4255},[3946,14617,14405],{"class":3952},[3946,14619,14620],{"class":3948,"line":7644},[3946,14621,14410],{"class":3952},[3946,14623,14624,14626,14628,14630],{"class":3948,"line":7677},[3946,14625,13084],{"class":3952},[3946,14627,13541],{"class":4262},[3946,14629,4298],{"class":3952},[3946,14631,14365],{"class":4262},[3946,14633,14634,14636,14638],{"class":3948,"line":7682},[3946,14635,14370],{"class":4262},[3946,14637,13111],{"class":3952},[3946,14639,14640],{"class":3966},"\"NoteDetail\"\n",[3946,14642,14643,14645,14647,14649],{"class":3948,"line":7694},[3946,14644,14380],{"class":4262},[3946,14646,12602],{"class":3952},[3946,14648,13829],{"class":4262},[3946,14650,4040],{"class":3952},[3946,14652,14653,14655],{"class":3948,"line":7710},[3946,14654,14391],{"class":4262},[3946,14656,13564],{"class":3952},[3946,14658,14659,14662,14664,14667],{"class":3948,"line":7715},[3946,14660,14661],{"class":13569},"          title",[3946,14663,3963],{"class":3952},[3946,14665,14666],{"class":3966},"'Деталі нотатки'",[3946,14668,3970],{"class":3952},[3946,14670,14671,14674,14676,14679],{"class":3948,"line":7720},[3946,14672,14673],{"class":13569},"          headerBackTitle",[3946,14675,3963],{"class":3952},[3946,14677,14678],{"class":3966},"'Назад'",[3946,14680,3970],{"class":3952},[3946,14682,14683],{"class":3948,"line":7729},[3946,14684,14685],{"class":3952},"        }}\n",[3946,14687,14688],{"class":3948,"line":7734},[3946,14689,14410],{"class":3952},[3946,14691,14692,14694,14696,14698,14700],{"class":3948,"line":7739},[3946,14693,13187],{"class":3952},[3946,14695,13541],{"class":4262},[3946,14697,4298],{"class":3952},[3946,14699,13692],{"class":4262},[3946,14701,13135],{"class":3952},[3946,14703,14704],{"class":3948,"line":7744},[3946,14705,10875],{"class":3952},[3946,14707,14708],{"class":3948,"line":7750},[3946,14709,4040],{"class":3952},[3750,14711,14713],{"id":14712},"_55-protected-route-component-додатковий-захист","5.5. Protected Route Component — Додатковий Захист",[3743,14715,14716],{},"Іноді потрібен додатковий захист всередині App Stack (наприклад, admin-екрани). Створимо HOC:",[3857,14718,14720],{"className":4242,"code":14719,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FProtectedRoute.tsx\n\nimport React, { ComponentType } from 'react';\nimport { View, Text, StyleSheet, TouchableOpacity } from 'react-native';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\nimport { useNavigation } from '@react-navigation\u002Fnative';\n\n\u002F**\n * Опції для ProtectedRoute\n *\u002F\ninterface ProtectedRouteOptions {\n  requiredRole?: 'user' | 'admin' | 'moderator';\n  fallback?: ComponentType;\n  redirectTo?: string;\n}\n\n\u002F**\n * HOC для захисту окремих екранів\n *\u002F\nexport function withProtectedRoute\u003CP extends object>(\n  Component: ComponentType\u003CP>,\n  options: ProtectedRouteOptions = {}\n) {\n  return function ProtectedRoute(props: P) {\n    const { user, isAuthenticated, logout } = useAuth();\n    const navigation = useNavigation();\n\n    \u002F\u002F Перевірка автентифікації\n    if (!isAuthenticated || !user) {\n      if (options.fallback) {\n        const FallbackComponent = options.fallback;\n        return \u003CFallbackComponent \u002F>;\n      }\n\n      return (\n        \u003CView style={styles.container}>\n          \u003CText style={styles.title}>Доступ заборонено\u003C\u002FText>\n          \u003CText style={styles.message}>\n            Для перегляду цієї сторінки необхідно увійти в систему\n          \u003C\u002FText>\n          \u003CTouchableOpacity style={styles.button} onPress={() => logout()}>\n            \u003CText style={styles.buttonText}>Повернутися до входу\u003C\u002FText>\n          \u003C\u002FTouchableOpacity>\n        \u003C\u002FView>\n      );\n    }\n\n    \u002F\u002F Перевірка ролі\n    if (options.requiredRole && user.role !== options.requiredRole) {\n      return (\n        \u003CView style={styles.container}>\n          \u003CText style={styles.title}>Недостатньо прав\u003C\u002FText>\n          \u003CText style={styles.message}>\n            У вас немає доступу до цієї сторінки. Необхідна роль:{' '}\n            {options.requiredRole}\n          \u003C\u002FText>\n          \u003CTouchableOpacity\n            style={styles.button}\n            onPress={() => navigation.goBack()}\n          >\n            \u003CText style={styles.buttonText}>Повернутися назад\u003C\u002FText>\n          \u003C\u002FTouchableOpacity>\n        \u003C\u002FView>\n      );\n    }\n\n    \u002F\u002F Все ОК — рендеримо компонент\n    return \u003CComponent {...props} \u002F>;\n  };\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    padding: 20,\n    backgroundColor: '#FFFFFF',\n  },\n  title: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#000000',\n    marginBottom: 12,\n  },\n  message: {\n    fontSize: 16,\n    color: '#666666',\n    textAlign: 'center',\n    marginBottom: 24,\n  },\n  button: {\n    backgroundColor: '#007AFF',\n    paddingHorizontal: 24,\n    paddingVertical: 12,\n    borderRadius: 8,\n  },\n  buttonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n});\n",[3782,14721,14722,14727,14731,14750,14780,14797,14814,14818,14822,14827,14831,14840,14859,14870,14881,14885,14889,14893,14898,14902,14923,14939,14952,14956,14976,14998,15011,15015,15020,15034,15050,15067,15079,15083,15087,15093,15108,15138,15152,15178,15187,15213,15244,15252,15261,15265,15269,15273,15278,15312,15318,15332,15358,15372,15409,15422,15430,15437,15448,15456,15461,15486,15494,15502,15506,15510,15514,15519,15535,15540,15544,15548,15564,15571,15579,15587,15595,15605,15613,15617,15624,15634,15644,15654,15664,15668,15675,15684,15693,15702,15710,15714,15721,15730,15739,15748,15758,15762,15769,15777,15785,15794,15798],{"__ignoreMap":3865},[3946,14723,14724],{"class":3948,"line":3949},[3946,14725,14726],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FProtectedRoute.tsx\n",[3946,14728,14729],{"class":3948,"line":3956},[3946,14730,4278],{"emptyLinePlaceholder":4277},[3946,14732,14733,14735,14737,14739,14742,14744,14746,14748],{"class":3948,"line":3973},[3946,14734,4252],{"class":4251},[3946,14736,10244],{"class":4262},[3946,14738,8290],{"class":3952},[3946,14740,14741],{"class":4262},"ComponentType",[3946,14743,6823],{"class":3952},[3946,14745,6826],{"class":4251},[3946,14747,10304],{"class":3966},[3946,14749,4272],{"class":3952},[3946,14751,14752,14754,14756,14758,14760,14763,14765,14767,14769,14772,14774,14776,14778],{"class":3948,"line":3986},[3946,14753,4252],{"class":4251},[3946,14755,6817],{"class":3952},[3946,14757,12926],{"class":4262},[3946,14759,4447],{"class":3952},[3946,14761,14762],{"class":4262},"Text",[3946,14764,4447],{"class":3952},[3946,14766,12936],{"class":4262},[3946,14768,4447],{"class":3952},[3946,14770,14771],{"class":4262},"TouchableOpacity",[3946,14773,6823],{"class":3952},[3946,14775,6826],{"class":4251},[3946,14777,12943],{"class":3966},[3946,14779,4272],{"class":3952},[3946,14781,14782,14784,14786,14788,14790,14792,14795],{"class":3948,"line":3999},[3946,14783,4252],{"class":4251},[3946,14785,6817],{"class":3952},[3946,14787,12954],{"class":4262},[3946,14789,6823],{"class":3952},[3946,14791,6826],{"class":4251},[3946,14793,14794],{"class":3966}," '..\u002Fcontext\u002FAuthContext'",[3946,14796,4272],{"class":3952},[3946,14798,14799,14801,14803,14806,14808,14810,14812],{"class":3948,"line":4012},[3946,14800,4252],{"class":4251},[3946,14802,6817],{"class":3952},[3946,14804,14805],{"class":4262},"useNavigation",[3946,14807,6823],{"class":3952},[3946,14809,6826],{"class":4251},[3946,14811,12915],{"class":3966},[3946,14813,4272],{"class":3952},[3946,14815,14816],{"class":3948,"line":4026},[3946,14817,4278],{"emptyLinePlaceholder":4277},[3946,14819,14820],{"class":3948,"line":4037},[3946,14821,6015],{"class":4342},[3946,14823,14824],{"class":3948,"line":4487},[3946,14825,14826],{"class":4342}," * Опції для ProtectedRoute\n",[3946,14828,14829],{"class":3948,"line":4507},[3946,14830,6025],{"class":4342},[3946,14832,14833,14835,14838],{"class":3948,"line":4518},[3946,14834,4801],{"class":4255},[3946,14836,14837],{"class":4403}," ProtectedRouteOptions",[3946,14839,4427],{"class":3952},[3946,14841,14842,14845,14847,14849,14851,14853,14855,14857],{"class":3948,"line":4524},[3946,14843,14844],{"class":4262},"  requiredRole",[3946,14846,4814],{"class":3952},[3946,14848,6092],{"class":3966},[3946,14850,4559],{"class":3952},[3946,14852,6097],{"class":3966},[3946,14854,4559],{"class":3952},[3946,14856,6102],{"class":3966},[3946,14858,4272],{"class":3952},[3946,14860,14861,14864,14866,14868],{"class":3948,"line":4529},[3946,14862,14863],{"class":4262},"  fallback",[3946,14865,4814],{"class":3952},[3946,14867,14741],{"class":4403},[3946,14869,4272],{"class":3952},[3946,14871,14872,14875,14877,14879],{"class":3948,"line":4534},[3946,14873,14874],{"class":4262},"  redirectTo",[3946,14876,4814],{"class":3952},[3946,14878,4404],{"class":4403},[3946,14880,4272],{"class":3952},[3946,14882,14883],{"class":3948,"line":4540},[3946,14884,4040],{"class":3952},[3946,14886,14887],{"class":3948,"line":4567},[3946,14888,4278],{"emptyLinePlaceholder":4277},[3946,14890,14891],{"class":3948,"line":4574},[3946,14892,6015],{"class":4342},[3946,14894,14895],{"class":3948,"line":4600},[3946,14896,14897],{"class":4342}," * HOC для захисту окремих екранів\n",[3946,14899,14900],{"class":3948,"line":4610},[3946,14901,6025],{"class":4342},[3946,14903,14904,14906,14908,14911,14913,14916,14918,14921],{"class":3948,"line":4623},[3946,14905,6030],{"class":4251},[3946,14907,4390],{"class":4255},[3946,14909,14910],{"class":4224}," withProtectedRoute",[3946,14912,4413],{"class":3952},[3946,14914,14915],{"class":4403},"P",[3946,14917,6190],{"class":4255},[3946,14919,14920],{"class":4403}," object",[3946,14922,8967],{"class":3952},[3946,14924,14925,14928,14930,14932,14934,14936],{"class":3948,"line":4643},[3946,14926,14927],{"class":4262},"  Component",[3946,14929,3963],{"class":3952},[3946,14931,14741],{"class":4403},[3946,14933,4413],{"class":3952},[3946,14935,14915],{"class":4403},[3946,14937,14938],{"class":3952},">,\n",[3946,14940,14941,14944,14946,14949],{"class":3948,"line":4653},[3946,14942,14943],{"class":4262},"  options",[3946,14945,3963],{"class":3952},[3946,14947,14948],{"class":4403},"ProtectedRouteOptions",[3946,14950,14951],{"class":3952}," = {}\n",[3946,14953,14954],{"class":3948,"line":4658},[3946,14955,4318],{"class":3952},[3946,14957,14958,14960,14962,14965,14967,14970,14972,14974],{"class":3948,"line":4663},[3946,14959,5062],{"class":4251},[3946,14961,4390],{"class":4255},[3946,14963,14964],{"class":4224}," ProtectedRoute",[3946,14966,4331],{"class":3952},[3946,14968,14969],{"class":4262},"props",[3946,14971,3963],{"class":3952},[3946,14973,14915],{"class":4403},[3946,14975,4318],{"class":3952},[3946,14977,14978,14980,14982,14984,14986,14988,14990,14992,14994,14996],{"class":3948,"line":4668},[3946,14979,4577],{"class":4255},[3946,14981,6817],{"class":3952},[3946,14983,10775],{"class":4286},[3946,14985,4447],{"class":3952},[3946,14987,13041],{"class":4286},[3946,14989,4447],{"class":3952},[3946,14991,11981],{"class":4286},[3946,14993,13049],{"class":3952},[3946,14995,12954],{"class":4224},[3946,14997,4304],{"class":3952},[3946,14999,15000,15002,15005,15007,15009],{"class":3948,"line":4674},[3946,15001,4577],{"class":4255},[3946,15003,15004],{"class":4286}," navigation",[3946,15006,4290],{"class":3952},[3946,15008,14805],{"class":4224},[3946,15010,4304],{"class":3952},[3946,15012,15013],{"class":3948,"line":4694},[3946,15014,4278],{"emptyLinePlaceholder":4277},[3946,15016,15017],{"class":3948,"line":4701},[3946,15018,15019],{"class":4342},"    \u002F\u002F Перевірка автентифікації\n",[3946,15021,15022,15024,15026,15028,15030,15032],{"class":3948,"line":4719},[3946,15023,5503],{"class":4251},[3946,15025,4312],{"class":3952},[3946,15027,13041],{"class":4262},[3946,15029,7337],{"class":3952},[3946,15031,10775],{"class":4262},[3946,15033,4318],{"class":3952},[3946,15035,15036,15038,15040,15043,15045,15048],{"class":3948,"line":4735},[3946,15037,7246],{"class":4251},[3946,15039,4479],{"class":3952},[3946,15041,15042],{"class":4262},"options",[3946,15044,4298],{"class":3952},[3946,15046,15047],{"class":4262},"fallback",[3946,15049,4318],{"class":3952},[3946,15051,15052,15054,15057,15059,15061,15063,15065],{"class":3948,"line":4748},[3946,15053,8615],{"class":4255},[3946,15055,15056],{"class":4286}," FallbackComponent",[3946,15058,4290],{"class":3952},[3946,15060,15042],{"class":4262},[3946,15062,4298],{"class":3952},[3946,15064,15047],{"class":4262},[3946,15066,4272],{"class":3952},[3946,15068,15069,15071,15073,15076],{"class":3948,"line":4768},[3946,15070,7273],{"class":4251},[3946,15072,12589],{"class":3952},[3946,15074,15075],{"class":4403},"FallbackComponent",[3946,15077,15078],{"class":3952}," \u002F>;\n",[3946,15080,15081],{"class":3948,"line":4777},[3946,15082,7282],{"class":3952},[3946,15084,15085],{"class":3948,"line":4782},[3946,15086,4278],{"emptyLinePlaceholder":4277},[3946,15088,15089,15091],{"class":3948,"line":6262},[3946,15090,7405],{"class":4251},[3946,15092,13079],{"class":3952},[3946,15094,15095,15097,15099,15101,15103,15106],{"class":3948,"line":6273},[3946,15096,13103],{"class":3952},[3946,15098,12926],{"class":4262},[3946,15100,13089],{"class":4262},[3946,15102,13092],{"class":3952},[3946,15104,15105],{"class":4262},"container",[3946,15107,13098],{"class":3952},[3946,15109,15110,15113,15115,15117,15119,15122,15125,15128,15131,15134,15136],{"class":3948,"line":6284},[3946,15111,15112],{"class":3952},"          \u003C",[3946,15114,14762],{"class":4262},[3946,15116,13089],{"class":4262},[3946,15118,13092],{"class":3952},[3946,15120,15121],{"class":4262},"title",[3946,15123,15124],{"class":3952},"}>",[3946,15126,15127],{"class":4262},"Доступ",[3946,15129,15130],{"class":4262}," заборонено",[3946,15132,15133],{"class":3952},"\u003C\u002F",[3946,15135,14762],{"class":4262},[3946,15137,13135],{"class":3952},[3946,15139,15140,15142,15144,15146,15148,15150],{"class":3948,"line":6299},[3946,15141,15112],{"class":3952},[3946,15143,14762],{"class":4262},[3946,15145,13089],{"class":4262},[3946,15147,13092],{"class":3952},[3946,15149,5543],{"class":4262},[3946,15151,13098],{"class":3952},[3946,15153,15154,15157,15160,15163,15166,15169,15172,15175],{"class":3948,"line":6304},[3946,15155,15156],{"class":4262},"            Для",[3946,15158,15159],{"class":4262}," перегляду",[3946,15161,15162],{"class":4262}," цієї",[3946,15164,15165],{"class":4262}," сторінки",[3946,15167,15168],{"class":4262}," необхідно",[3946,15170,15171],{"class":4262}," увійти",[3946,15173,15174],{"class":4262}," в",[3946,15176,15177],{"class":4262}," систему\n",[3946,15179,15180,15183,15185],{"class":3948,"line":6309},[3946,15181,15182],{"class":3952},"          \u003C\u002F",[3946,15184,14762],{"class":4262},[3946,15186,13135],{"class":3952},[3946,15188,15189,15191,15193,15195,15197,15200,15202,15205,15208,15210],{"class":3948,"line":6314},[3946,15190,15112],{"class":3952},[3946,15192,14771],{"class":4262},[3946,15194,13089],{"class":4262},[3946,15196,13092],{"class":3952},[3946,15198,15199],{"class":4262},"button",[3946,15201,5928],{"class":3952},[3946,15203,15204],{"class":4262},"onPress",[3946,15206,15207],{"class":3952},"={() => ",[3946,15209,11981],{"class":4224},[3946,15211,15212],{"class":3952},"()}>\n",[3946,15214,15215,15218,15220,15222,15224,15227,15229,15232,15235,15238,15240,15242],{"class":3948,"line":6320},[3946,15216,15217],{"class":3952},"            \u003C",[3946,15219,14762],{"class":4262},[3946,15221,13089],{"class":4262},[3946,15223,13092],{"class":3952},[3946,15225,15226],{"class":4262},"buttonText",[3946,15228,15124],{"class":3952},[3946,15230,15231],{"class":4262},"Повернутися",[3946,15233,15234],{"class":4262}," до",[3946,15236,15237],{"class":4262}," входу",[3946,15239,15133],{"class":3952},[3946,15241,14762],{"class":4262},[3946,15243,13135],{"class":3952},[3946,15245,15246,15248,15250],{"class":3948,"line":6325},[3946,15247,15182],{"class":3952},[3946,15249,14771],{"class":4262},[3946,15251,13135],{"class":3952},[3946,15253,15254,15257,15259],{"class":3948,"line":6337},[3946,15255,15256],{"class":3952},"        \u003C\u002F",[3946,15258,12926],{"class":4262},[3946,15260,13135],{"class":3952},[3946,15262,15263],{"class":3948,"line":6352},[3946,15264,8984],{"class":3952},[3946,15266,15267],{"class":3948,"line":6364},[3946,15268,5550],{"class":3952},[3946,15270,15271],{"class":3948,"line":6376},[3946,15272,4278],{"emptyLinePlaceholder":4277},[3946,15274,15275],{"class":3948,"line":6392},[3946,15276,15277],{"class":4342},"    \u002F\u002F Перевірка ролі\n",[3946,15279,15280,15282,15284,15286,15288,15291,15294,15296,15298,15301,15304,15306,15308,15310],{"class":3948,"line":6397},[3946,15281,5503],{"class":4251},[3946,15283,4479],{"class":3952},[3946,15285,15042],{"class":4262},[3946,15287,4298],{"class":3952},[3946,15289,15290],{"class":4262},"requiredRole",[3946,15292,15293],{"class":3952}," && ",[3946,15295,10775],{"class":4262},[3946,15297,4298],{"class":3952},[3946,15299,15300],{"class":4262},"role",[3946,15302,15303],{"class":3952}," !== ",[3946,15305,15042],{"class":4262},[3946,15307,4298],{"class":3952},[3946,15309,15290],{"class":4262},[3946,15311,4318],{"class":3952},[3946,15313,15314,15316],{"class":3948,"line":6402},[3946,15315,7405],{"class":4251},[3946,15317,13079],{"class":3952},[3946,15319,15320,15322,15324,15326,15328,15330],{"class":3948,"line":6407},[3946,15321,13103],{"class":3952},[3946,15323,12926],{"class":4262},[3946,15325,13089],{"class":4262},[3946,15327,13092],{"class":3952},[3946,15329,15105],{"class":4262},[3946,15331,13098],{"class":3952},[3946,15333,15334,15336,15338,15340,15342,15344,15346,15349,15352,15354,15356],{"class":3948,"line":6413},[3946,15335,15112],{"class":3952},[3946,15337,14762],{"class":4262},[3946,15339,13089],{"class":4262},[3946,15341,13092],{"class":3952},[3946,15343,15121],{"class":4262},[3946,15345,15124],{"class":3952},[3946,15347,15348],{"class":4262},"Недостатньо",[3946,15350,15351],{"class":4262}," прав",[3946,15353,15133],{"class":3952},[3946,15355,14762],{"class":4262},[3946,15357,13135],{"class":3952},[3946,15359,15360,15362,15364,15366,15368,15370],{"class":3948,"line":6418},[3946,15361,15112],{"class":3952},[3946,15363,14762],{"class":4262},[3946,15365,13089],{"class":4262},[3946,15367,13092],{"class":3952},[3946,15369,5543],{"class":4262},[3946,15371,13098],{"class":3952},[3946,15373,15374,15377,15380,15383,15386,15388,15390,15392,15395,15398,15401,15404,15407],{"class":3948,"line":6434},[3946,15375,15376],{"class":4286},"            У",[3946,15378,15379],{"class":4262}," вас",[3946,15381,15382],{"class":4262}," немає",[3946,15384,15385],{"class":4262}," доступу",[3946,15387,15234],{"class":4262},[3946,15389,15162],{"class":4262},[3946,15391,15165],{"class":4262},[3946,15393,15394],{"class":3952},". ",[3946,15396,15397],{"class":4262},"Необхідна",[3946,15399,15400],{"class":4262}," роль",[3946,15402,15403],{"class":3952},":{",[3946,15405,15406],{"class":3966},"' '",[3946,15408,4040],{"class":3952},[3946,15410,15411,15414,15416,15418,15420],{"class":3948,"line":6466},[3946,15412,15413],{"class":3952},"            {",[3946,15415,15042],{"class":4262},[3946,15417,4298],{"class":3952},[3946,15419,15290],{"class":4262},[3946,15421,4040],{"class":3952},[3946,15423,15424,15426,15428],{"class":3948,"line":6493},[3946,15425,15182],{"class":3952},[3946,15427,14762],{"class":4262},[3946,15429,13135],{"class":3952},[3946,15431,15432,15434],{"class":3948,"line":6512},[3946,15433,15112],{"class":3952},[3946,15435,15436],{"class":4262},"TouchableOpacity\n",[3946,15438,15439,15442,15444,15446],{"class":3948,"line":6530},[3946,15440,15441],{"class":4262},"            style",[3946,15443,13092],{"class":3952},[3946,15445,15199],{"class":4262},[3946,15447,4040],{"class":3952},[3946,15449,15450,15453],{"class":3948,"line":6545},[3946,15451,15452],{"class":4262},"            onPress",[3946,15454,15455],{"class":3952},"={() => navigation.goBack()}\n",[3946,15457,15458],{"class":3948,"line":6550},[3946,15459,15460],{"class":3952},"          >\n",[3946,15462,15463,15465,15467,15469,15471,15473,15475,15477,15480,15482,15484],{"class":3948,"line":6555},[3946,15464,15217],{"class":3952},[3946,15466,14762],{"class":4262},[3946,15468,13089],{"class":4262},[3946,15470,13092],{"class":3952},[3946,15472,15226],{"class":4262},[3946,15474,15124],{"class":3952},[3946,15476,15231],{"class":4262},[3946,15478,15479],{"class":4262}," назад",[3946,15481,15133],{"class":3952},[3946,15483,14762],{"class":4262},[3946,15485,13135],{"class":3952},[3946,15487,15488,15490,15492],{"class":3948,"line":6560},[3946,15489,15182],{"class":3952},[3946,15491,14771],{"class":4262},[3946,15493,13135],{"class":3952},[3946,15495,15496,15498,15500],{"class":3948,"line":6566},[3946,15497,15256],{"class":3952},[3946,15499,12926],{"class":4262},[3946,15501,13135],{"class":3952},[3946,15503,15504],{"class":3948,"line":6571},[3946,15505,8984],{"class":3952},[3946,15507,15508],{"class":3948,"line":6588},[3946,15509,5550],{"class":3952},[3946,15511,15512],{"class":3948,"line":6597},[3946,15513,4278],{"emptyLinePlaceholder":4277},[3946,15515,15516],{"class":3948,"line":6609},[3946,15517,15518],{"class":4342},"    \u002F\u002F Все ОК — рендеримо компонент\n",[3946,15520,15521,15523,15525,15528,15531,15533],{"class":3948,"line":6640},[3946,15522,4603],{"class":4251},[3946,15524,12589],{"class":3952},[3946,15526,15527],{"class":4403},"Component",[3946,15529,15530],{"class":3952}," {...",[3946,15532,14969],{"class":4403},[3946,15534,14306],{"class":3952},[3946,15536,15537],{"class":3948,"line":6653},[3946,15538,15539],{"class":3952},"  };\n",[3946,15541,15542],{"class":3948,"line":6659},[3946,15543,4040],{"class":3952},[3946,15545,15546],{"class":3948,"line":6671},[3946,15547,4278],{"emptyLinePlaceholder":4277},[3946,15549,15550,15552,15554,15556,15558,15560,15562],{"class":3948,"line":6689},[3946,15551,4283],{"class":4255},[3946,15553,13210],{"class":4286},[3946,15555,4290],{"class":3952},[3946,15557,12936],{"class":4262},[3946,15559,4298],{"class":3952},[3946,15561,8509],{"class":4224},[3946,15563,8512],{"class":3952},[3946,15565,15566,15569],{"class":3948,"line":6694},[3946,15567,15568],{"class":4262},"  container:",[3946,15570,4427],{"class":3952},[3946,15572,15573,15575,15577],{"class":3948,"line":6699},[3946,15574,13232],{"class":4262},[3946,15576,13235],{"class":4020},[3946,15578,3970],{"class":3952},[3946,15580,15581,15583,15585],{"class":3948,"line":6704},[3946,15582,13242],{"class":4262},[3946,15584,13245],{"class":3966},[3946,15586,3970],{"class":3952},[3946,15588,15589,15591,15593],{"class":3948,"line":6709},[3946,15590,13252],{"class":4262},[3946,15592,13245],{"class":3966},[3946,15594,3970],{"class":3952},[3946,15596,15597,15600,15603],{"class":3948,"line":6715},[3946,15598,15599],{"class":4262},"    padding:",[3946,15601,15602],{"class":4020}," 20",[3946,15604,3970],{"class":3952},[3946,15606,15607,15609,15611],{"class":3948,"line":6720},[3946,15608,13261],{"class":4262},[3946,15610,13264],{"class":3966},[3946,15612,3970],{"class":3952},[3946,15614,15615],{"class":3948,"line":6732},[3946,15616,13271],{"class":3952},[3946,15618,15619,15622],{"class":3948,"line":6743},[3946,15620,15621],{"class":4262},"  title:",[3946,15623,4427],{"class":3952},[3946,15625,15626,15629,15632],{"class":3948,"line":6754},[3946,15627,15628],{"class":4262},"    fontSize:",[3946,15630,15631],{"class":4020}," 24",[3946,15633,3970],{"class":3952},[3946,15635,15636,15639,15642],{"class":3948,"line":6768},[3946,15637,15638],{"class":4262},"    fontWeight:",[3946,15640,15641],{"class":3966}," 'bold'",[3946,15643,3970],{"class":3952},[3946,15645,15646,15649,15652],{"class":3948,"line":7572},[3946,15647,15648],{"class":4262},"    color:",[3946,15650,15651],{"class":3966}," '#000000'",[3946,15653,3970],{"class":3952},[3946,15655,15656,15659,15662],{"class":3948,"line":7590},[3946,15657,15658],{"class":4262},"    marginBottom:",[3946,15660,15661],{"class":4020}," 12",[3946,15663,3970],{"class":3952},[3946,15665,15666],{"class":3948,"line":7609},[3946,15667,13271],{"class":3952},[3946,15669,15670,15673],{"class":3948,"line":7615},[3946,15671,15672],{"class":4262},"  message:",[3946,15674,4427],{"class":3952},[3946,15676,15677,15679,15682],{"class":3948,"line":7633},[3946,15678,15628],{"class":4262},[3946,15680,15681],{"class":4020}," 16",[3946,15683,3970],{"class":3952},[3946,15685,15686,15688,15691],{"class":3948,"line":7638},[3946,15687,15648],{"class":4262},[3946,15689,15690],{"class":3966}," '#666666'",[3946,15692,3970],{"class":3952},[3946,15694,15695,15698,15700],{"class":3948,"line":7644},[3946,15696,15697],{"class":4262},"    textAlign:",[3946,15699,13245],{"class":3966},[3946,15701,3970],{"class":3952},[3946,15703,15704,15706,15708],{"class":3948,"line":7677},[3946,15705,15658],{"class":4262},[3946,15707,15631],{"class":4020},[3946,15709,3970],{"class":3952},[3946,15711,15712],{"class":3948,"line":7682},[3946,15713,13271],{"class":3952},[3946,15715,15716,15719],{"class":3948,"line":7694},[3946,15717,15718],{"class":4262},"  button:",[3946,15720,4427],{"class":3952},[3946,15722,15723,15725,15728],{"class":3948,"line":7710},[3946,15724,13261],{"class":4262},[3946,15726,15727],{"class":3966}," '#007AFF'",[3946,15729,3970],{"class":3952},[3946,15731,15732,15735,15737],{"class":3948,"line":7715},[3946,15733,15734],{"class":4262},"    paddingHorizontal:",[3946,15736,15631],{"class":4020},[3946,15738,3970],{"class":3952},[3946,15740,15741,15744,15746],{"class":3948,"line":7720},[3946,15742,15743],{"class":4262},"    paddingVertical:",[3946,15745,15661],{"class":4020},[3946,15747,3970],{"class":3952},[3946,15749,15750,15753,15756],{"class":3948,"line":7729},[3946,15751,15752],{"class":4262},"    borderRadius:",[3946,15754,15755],{"class":4020}," 8",[3946,15757,3970],{"class":3952},[3946,15759,15760],{"class":3948,"line":7734},[3946,15761,13271],{"class":3952},[3946,15763,15764,15767],{"class":3948,"line":7739},[3946,15765,15766],{"class":4262},"  buttonText:",[3946,15768,4427],{"class":3952},[3946,15770,15771,15773,15775],{"class":3948,"line":7744},[3946,15772,15648],{"class":4262},[3946,15774,13264],{"class":3966},[3946,15776,3970],{"class":3952},[3946,15778,15779,15781,15783],{"class":3948,"line":7750},[3946,15780,15628],{"class":4262},[3946,15782,15681],{"class":4020},[3946,15784,3970],{"class":3952},[3946,15786,15787,15789,15792],{"class":3948,"line":7755},[3946,15788,15638],{"class":4262},[3946,15790,15791],{"class":3966}," '600'",[3946,15793,3970],{"class":3952},[3946,15795,15796],{"class":3948,"line":7765},[3946,15797,13271],{"class":3952},[3946,15799,15800],{"class":3948,"line":7777},[3946,15801,13276],{"class":3952},[3743,15803,15804],{},[3771,15805,15806],{},"Використання:",[3857,15808,15810],{"className":4242,"code":15809,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Звичайний екран (доступний всім авторизованим)\nexport const NotesListScreen = withProtectedRoute(NotesListScreenComponent);\n\n\u002F\u002F Admin-екран\nexport const AdminDashboard = withProtectedRoute(AdminDashboardComponent, {\n  requiredRole: 'admin',\n});\n\n\u002F\u002F З кастомним fallback\nexport const PremiumFeature = withProtectedRoute(PremiumFeatureComponent, {\n  fallback: PremiumPaywall,\n});\n",[3782,15811,15812,15817,15838,15842,15847,15867,15877,15881,15885,15890,15910,15920],{"__ignoreMap":3865},[3946,15813,15814],{"class":3948,"line":3949},[3946,15815,15816],{"class":4342},"\u002F\u002F Звичайний екран (доступний всім авторизованим)\n",[3946,15818,15819,15821,15823,15826,15828,15831,15833,15836],{"class":3948,"line":3956},[3946,15820,6030],{"class":4251},[3946,15822,5933],{"class":4255},[3946,15824,15825],{"class":4286}," NotesListScreen",[3946,15827,4290],{"class":3952},[3946,15829,15830],{"class":4224},"withProtectedRoute",[3946,15832,4331],{"class":3952},[3946,15834,15835],{"class":4262},"NotesListScreenComponent",[3946,15837,4337],{"class":3952},[3946,15839,15840],{"class":3948,"line":3973},[3946,15841,4278],{"emptyLinePlaceholder":4277},[3946,15843,15844],{"class":3948,"line":3986},[3946,15845,15846],{"class":4342},"\u002F\u002F Admin-екран\n",[3946,15848,15849,15851,15853,15856,15858,15860,15862,15865],{"class":3948,"line":3999},[3946,15850,6030],{"class":4251},[3946,15852,5933],{"class":4255},[3946,15854,15855],{"class":4286}," AdminDashboard",[3946,15857,4290],{"class":3952},[3946,15859,15830],{"class":4224},[3946,15861,4331],{"class":3952},[3946,15863,15864],{"class":4262},"AdminDashboardComponent",[3946,15866,4952],{"class":3952},[3946,15868,15869,15872,15875],{"class":3948,"line":4012},[3946,15870,15871],{"class":4262},"  requiredRole:",[3946,15873,15874],{"class":3966}," 'admin'",[3946,15876,3970],{"class":3952},[3946,15878,15879],{"class":3948,"line":4026},[3946,15880,13276],{"class":3952},[3946,15882,15883],{"class":3948,"line":4037},[3946,15884,4278],{"emptyLinePlaceholder":4277},[3946,15886,15887],{"class":3948,"line":4487},[3946,15888,15889],{"class":4342},"\u002F\u002F З кастомним fallback\n",[3946,15891,15892,15894,15896,15899,15901,15903,15905,15908],{"class":3948,"line":4507},[3946,15893,6030],{"class":4251},[3946,15895,5933],{"class":4255},[3946,15897,15898],{"class":4286}," PremiumFeature",[3946,15900,4290],{"class":3952},[3946,15902,15830],{"class":4224},[3946,15904,4331],{"class":3952},[3946,15906,15907],{"class":4262},"PremiumFeatureComponent",[3946,15909,4952],{"class":3952},[3946,15911,15912,15915,15918],{"class":3948,"line":4518},[3946,15913,15914],{"class":4262},"  fallback:",[3946,15916,15917],{"class":4262}," PremiumPaywall",[3946,15919,3970],{"class":3952},[3946,15921,15922],{"class":3948,"line":4524},[3946,15923,13276],{"class":3952},[3750,15925,15927],{"id":15926},"_56-useprotectedroute-hook-альтернативний-підхід","5.6. useProtectedRoute Hook — Альтернативний Підхід",[3743,15929,15930],{},"Для випадків, коли потрібна більша гнучкість:",[3857,15932,15934],{"className":4242,"code":15933,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fhooks\u002FuseProtectedRoute.ts\n\nimport { useEffect } from 'react';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\nimport { useNavigation } from '@react-navigation\u002Fnative';\n\n\u002F**\n * Hook для захисту маршрутів\n *\u002F\nexport function useProtectedRoute(requiredRole?: 'user' | 'admin' | 'moderator') {\n  const { isAuthenticated, user, logout } = useAuth();\n  const navigation = useNavigation();\n\n  useEffect(() => {\n    \u002F\u002F Перевірка автентифікації\n    if (!isAuthenticated) {\n      \u002F\u002F Logout автоматично перенаправить на Auth Stack\n      logout();\n      return;\n    }\n\n    \u002F\u002F Перевірка ролі\n    if (requiredRole && user?.role !== requiredRole) {\n      console.warn(`Access denied: required role ${requiredRole}, got ${user?.role}`);\n      navigation.goBack();\n    }\n  }, [isAuthenticated, user, requiredRole, logout, navigation]);\n\n  return {\n    isAuthorized: isAuthenticated && (!requiredRole || user?.role === requiredRole),\n    user,\n  };\n}\n",[3782,15935,15936,15941,15945,15962,15978,15994,15998,16002,16007,16011,16038,16060,16072,16076,16086,16090,16100,16105,16111,16117,16121,16125,16129,16151,16188,16200,16204,16229,16233,16239,16267,16274,16278],{"__ignoreMap":3865},[3946,15937,15938],{"class":3948,"line":3949},[3946,15939,15940],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fhooks\u002FuseProtectedRoute.ts\n",[3946,15942,15943],{"class":3948,"line":3956},[3946,15944,4278],{"emptyLinePlaceholder":4277},[3946,15946,15947,15949,15951,15954,15956,15958,15960],{"class":3948,"line":3973},[3946,15948,4252],{"class":4251},[3946,15950,6817],{"class":3952},[3946,15952,15953],{"class":4262},"useEffect",[3946,15955,6823],{"class":3952},[3946,15957,6826],{"class":4251},[3946,15959,10304],{"class":3966},[3946,15961,4272],{"class":3952},[3946,15963,15964,15966,15968,15970,15972,15974,15976],{"class":3948,"line":3986},[3946,15965,4252],{"class":4251},[3946,15967,6817],{"class":3952},[3946,15969,12954],{"class":4262},[3946,15971,6823],{"class":3952},[3946,15973,6826],{"class":4251},[3946,15975,14794],{"class":3966},[3946,15977,4272],{"class":3952},[3946,15979,15980,15982,15984,15986,15988,15990,15992],{"class":3948,"line":3999},[3946,15981,4252],{"class":4251},[3946,15983,6817],{"class":3952},[3946,15985,14805],{"class":4262},[3946,15987,6823],{"class":3952},[3946,15989,6826],{"class":4251},[3946,15991,12915],{"class":3966},[3946,15993,4272],{"class":3952},[3946,15995,15996],{"class":3948,"line":4012},[3946,15997,4278],{"emptyLinePlaceholder":4277},[3946,15999,16000],{"class":3948,"line":4026},[3946,16001,6015],{"class":4342},[3946,16003,16004],{"class":3948,"line":4037},[3946,16005,16006],{"class":4342}," * Hook для захисту маршрутів\n",[3946,16008,16009],{"class":3948,"line":4487},[3946,16010,6025],{"class":4342},[3946,16012,16013,16015,16017,16020,16022,16024,16026,16028,16030,16032,16034,16036],{"class":3948,"line":4507},[3946,16014,6030],{"class":4251},[3946,16016,4390],{"class":4255},[3946,16018,16019],{"class":4224}," useProtectedRoute",[3946,16021,4331],{"class":3952},[3946,16023,15290],{"class":4262},[3946,16025,4814],{"class":3952},[3946,16027,6092],{"class":3966},[3946,16029,4559],{"class":3952},[3946,16031,6097],{"class":3966},[3946,16033,4559],{"class":3952},[3946,16035,6102],{"class":3966},[3946,16037,4318],{"class":3952},[3946,16039,16040,16042,16044,16046,16048,16050,16052,16054,16056,16058],{"class":3948,"line":4518},[3946,16041,5018],{"class":4255},[3946,16043,6817],{"class":3952},[3946,16045,13041],{"class":4286},[3946,16047,4447],{"class":3952},[3946,16049,10775],{"class":4286},[3946,16051,4447],{"class":3952},[3946,16053,11981],{"class":4286},[3946,16055,13049],{"class":3952},[3946,16057,12954],{"class":4224},[3946,16059,4304],{"class":3952},[3946,16061,16062,16064,16066,16068,16070],{"class":3948,"line":4524},[3946,16063,5018],{"class":4255},[3946,16065,15004],{"class":4286},[3946,16067,4290],{"class":3952},[3946,16069,14805],{"class":4224},[3946,16071,4304],{"class":3952},[3946,16073,16074],{"class":3948,"line":4529},[3946,16075,4278],{"emptyLinePlaceholder":4277},[3946,16077,16078,16080,16082,16084],{"class":3948,"line":4534},[3946,16079,10265],{"class":4224},[3946,16081,10707],{"class":3952},[3946,16083,6453],{"class":4255},[3946,16085,4427],{"class":3952},[3946,16087,16088],{"class":3948,"line":4540},[3946,16089,15019],{"class":4342},[3946,16091,16092,16094,16096,16098],{"class":3948,"line":4567},[3946,16093,5503],{"class":4251},[3946,16095,4312],{"class":3952},[3946,16097,13041],{"class":4262},[3946,16099,4318],{"class":3952},[3946,16101,16102],{"class":3948,"line":4574},[3946,16103,16104],{"class":4342},"      \u002F\u002F Logout автоматично перенаправить на Auth Stack\n",[3946,16106,16107,16109],{"class":3948,"line":4600},[3946,16108,12516],{"class":4224},[3946,16110,4304],{"class":3952},[3946,16112,16113,16115],{"class":3948,"line":4610},[3946,16114,7405],{"class":4251},[3946,16116,4272],{"class":3952},[3946,16118,16119],{"class":3948,"line":4623},[3946,16120,5550],{"class":3952},[3946,16122,16123],{"class":3948,"line":4643},[3946,16124,4278],{"emptyLinePlaceholder":4277},[3946,16126,16127],{"class":3948,"line":4653},[3946,16128,15277],{"class":4342},[3946,16130,16131,16133,16135,16137,16139,16141,16143,16145,16147,16149],{"class":3948,"line":4658},[3946,16132,5503],{"class":4251},[3946,16134,4479],{"class":3952},[3946,16136,15290],{"class":4262},[3946,16138,15293],{"class":3952},[3946,16140,10775],{"class":4262},[3946,16142,7539],{"class":3952},[3946,16144,15300],{"class":4262},[3946,16146,15303],{"class":3952},[3946,16148,15290],{"class":4262},[3946,16150,4318],{"class":3952},[3946,16152,16153,16155,16157,16159,16161,16164,16166,16168,16170,16173,16175,16177,16180,16182,16184,16186],{"class":3948,"line":4663},[3946,16154,5525],{"class":4262},[3946,16156,4298],{"class":3952},[3946,16158,4328],{"class":4224},[3946,16160,4331],{"class":3952},[3946,16162,16163],{"class":3966},"`Access denied: required role ",[3946,16165,8669],{"class":4255},[3946,16167,15290],{"class":4262},[3946,16169,8674],{"class":4255},[3946,16171,16172],{"class":3966},", got ",[3946,16174,8669],{"class":4255},[3946,16176,10775],{"class":4262},[3946,16178,7539],{"class":16179},"sD7JJ",[3946,16181,15300],{"class":4262},[3946,16183,8674],{"class":4255},[3946,16185,8677],{"class":3966},[3946,16187,4337],{"class":3952},[3946,16189,16190,16193,16195,16198],{"class":3948,"line":4668},[3946,16191,16192],{"class":4262},"      navigation",[3946,16194,4298],{"class":3952},[3946,16196,16197],{"class":4224},"goBack",[3946,16199,4304],{"class":3952},[3946,16201,16202],{"class":3948,"line":4674},[3946,16203,5550],{"class":3952},[3946,16205,16206,16208,16210,16212,16214,16216,16218,16220,16222,16224,16227],{"class":3948,"line":4694},[3946,16207,10731],{"class":3952},[3946,16209,13041],{"class":4262},[3946,16211,4447],{"class":3952},[3946,16213,10775],{"class":4262},[3946,16215,4447],{"class":3952},[3946,16217,15290],{"class":4262},[3946,16219,4447],{"class":3952},[3946,16221,11981],{"class":4262},[3946,16223,4447],{"class":3952},[3946,16225,16226],{"class":4262},"navigation",[3946,16228,10737],{"class":3952},[3946,16230,16231],{"class":3948,"line":4701},[3946,16232,4278],{"emptyLinePlaceholder":4277},[3946,16234,16235,16237],{"class":3948,"line":4719},[3946,16236,5062],{"class":4251},[3946,16238,4427],{"class":3952},[3946,16240,16241,16244,16247,16250,16252,16254,16256,16258,16260,16262,16264],{"class":3948,"line":4735},[3946,16242,16243],{"class":4262},"    isAuthorized:",[3946,16245,16246],{"class":4262}," isAuthenticated",[3946,16248,16249],{"class":3952}," && (!",[3946,16251,15290],{"class":4262},[3946,16253,9745],{"class":3952},[3946,16255,10775],{"class":4262},[3946,16257,7539],{"class":3952},[3946,16259,15300],{"class":4262},[3946,16261,8816],{"class":3952},[3946,16263,15290],{"class":4262},[3946,16265,16266],{"class":3952},"),\n",[3946,16268,16269,16272],{"class":3948,"line":4748},[3946,16270,16271],{"class":4262},"    user",[3946,16273,3970],{"class":3952},[3946,16275,16276],{"class":3948,"line":4768},[3946,16277,15539],{"class":3952},[3946,16279,16280],{"class":3948,"line":4777},[3946,16281,4040],{"class":3952},[3743,16283,16284],{},[3771,16285,16286],{},"Використання в компоненті:",[3857,16288,16290],{"className":4242,"code":16289,"language":4244,"meta":3865,"style":3865},"function AdminScreen() {\n  const { isAuthorized, user } = useProtectedRoute('admin');\n\n  if (!isAuthorized) {\n    return (\n      \u003CView>\n        \u003CText>Завантаження...\u003C\u002FText>\n      \u003C\u002FView>\n    );\n  }\n\n  return (\n    \u003CView>\n      \u003CText>Вітаємо, адміністратор {user?.name}!\u003C\u002FText>\n    \u003C\u002FView>\n  );\n}\n",[3782,16291,16292,16301,16325,16329,16339,16345,16353,16372,16380,16384,16388,16392,16398,16406,16438,16446,16450],{"__ignoreMap":3865},[3946,16293,16294,16296,16299],{"class":3948,"line":3949},[3946,16295,14029],{"class":4255},[3946,16297,16298],{"class":4224}," AdminScreen",[3946,16300,8490],{"class":3952},[3946,16302,16303,16305,16307,16310,16312,16314,16316,16319,16321,16323],{"class":3948,"line":3956},[3946,16304,5018],{"class":4255},[3946,16306,6817],{"class":3952},[3946,16308,16309],{"class":4286},"isAuthorized",[3946,16311,4447],{"class":3952},[3946,16313,10775],{"class":4286},[3946,16315,13049],{"class":3952},[3946,16317,16318],{"class":4224},"useProtectedRoute",[3946,16320,4331],{"class":3952},[3946,16322,6097],{"class":3966},[3946,16324,4337],{"class":3952},[3946,16326,16327],{"class":3948,"line":3973},[3946,16328,4278],{"emptyLinePlaceholder":4277},[3946,16330,16331,16333,16335,16337],{"class":3948,"line":3986},[3946,16332,5776],{"class":4251},[3946,16334,4312],{"class":3952},[3946,16336,16309],{"class":4262},[3946,16338,4318],{"class":3952},[3946,16340,16341,16343],{"class":3948,"line":3999},[3946,16342,4603],{"class":4251},[3946,16344,13079],{"class":3952},[3946,16346,16347,16349,16351],{"class":3948,"line":4012},[3946,16348,13084],{"class":3952},[3946,16350,12926],{"class":4403},[3946,16352,13135],{"class":3952},[3946,16354,16355,16357,16359,16362,16365,16368,16370],{"class":3948,"line":4026},[3946,16356,13103],{"class":3952},[3946,16358,14762],{"class":4403},[3946,16360,16361],{"class":3952},">",[3946,16363,16364],{"class":4262},"Завантаження",[3946,16366,16367],{"class":3952},"...\u003C\u002F",[3946,16369,14762],{"class":4262},[3946,16371,13135],{"class":3952},[3946,16373,16374,16376,16378],{"class":3948,"line":4037},[3946,16375,13130],{"class":3952},[3946,16377,12926],{"class":4262},[3946,16379,13135],{"class":3952},[3946,16381,16382],{"class":3948,"line":4487},[3946,16383,8731],{"class":3952},[3946,16385,16386],{"class":3948,"line":4507},[3946,16387,4521],{"class":3952},[3946,16389,16390],{"class":3948,"line":4518},[3946,16391,4278],{"emptyLinePlaceholder":4277},[3946,16393,16394,16396],{"class":3948,"line":4524},[3946,16395,5062],{"class":4251},[3946,16397,13079],{"class":3952},[3946,16399,16400,16402,16404],{"class":3948,"line":4529},[3946,16401,13158],{"class":3952},[3946,16403,12926],{"class":4403},[3946,16405,13135],{"class":3952},[3946,16407,16408,16410,16412,16414,16417,16419,16422,16425,16427,16429,16431,16434,16436],{"class":3948,"line":4534},[3946,16409,13084],{"class":3952},[3946,16411,14762],{"class":4403},[3946,16413,16361],{"class":3952},[3946,16415,16416],{"class":4262},"Вітаємо",[3946,16418,4447],{"class":3952},[3946,16420,16421],{"class":4262},"адміністратор",[3946,16423,16424],{"class":3952}," {",[3946,16426,10775],{"class":4262},[3946,16428,7539],{"class":3952},[3946,16430,6679],{"class":4262},[3946,16432,16433],{"class":3952},"}!\u003C\u002F",[3946,16435,14762],{"class":4262},[3946,16437,13135],{"class":3952},[3946,16439,16440,16442,16444],{"class":3948,"line":4540},[3946,16441,13187],{"class":3952},[3946,16443,12926],{"class":4262},[3946,16445,13135],{"class":3952},[3946,16447,16448],{"class":3948,"line":4567},[3946,16449,10875],{"class":3952},[3946,16451,16452],{"class":3948,"line":4574},[3946,16453,4040],{"class":3952},[3811,16455],{},[3738,16457,16459],{"id":16458},"розділ-6-обробка-http-статусів-та-помилок","Розділ 6: Обробка HTTP Статусів та Помилок",[3750,16461,16463],{"id":16462},"_61-статуси-автентифікації-та-авторизації","6.1. Статуси Автентифікації та Авторизації",[3743,16465,16466,16469],{},[3771,16467,16468],{},"401 Unauthorized"," — користувач не автентифікований або токен невалідний:",[3878,16471,16472,16478],{},[3768,16473,16474,16477],{},[3771,16475,16476],{},"Коли виникає:"," токен закінчився, токен підроблений, токен відкликаний",[3768,16479,16480,16483],{},[3771,16481,16482],{},"Як обробляти:",[3765,16484,16485,16488,16491],{},[3768,16486,16487],{},"Спробувати refresh token",[3768,16489,16490],{},"Якщо refresh не спрацював — logout користувача",[3768,16492,16493],{},"Редірект на Login screen",[3743,16495,16496,16499],{},[3771,16497,16498],{},"403 Forbidden"," — користувач автентифікований, але не має прав:",[3878,16501,16502,16507],{},[3768,16503,16504,16506],{},[3771,16505,16476],{}," доступ до admin-ресурсів, недостатня роль",[3768,16508,16509,16511],{},[3771,16510,16482],{},[3765,16512,16513,16516,16519],{},[3768,16514,16515],{},"Показати повідомлення про помилку",[3768,16517,16518],{},"Не робити logout (користувач валідний)",[3768,16520,16521],{},"Редірект на попередній екран або home",[3743,16523,16524,16527],{},[3771,16525,16526],{},"419 Token Expired"," (нестандартний) — деякі API використовують цей статус:",[3878,16529,16530],{},[3768,16531,16532,16534],{},[3771,16533,16482],{}," аналогічно 401, спроба refresh",[3750,16536,16538],{"id":16537},"_62-automatic-token-refresh-strategy","6.2. Automatic Token Refresh Strategy",[3743,16540,16541],{},"Існує кілька стратегій оновлення токенів:",[3847,16543,16545],{"id":16544},"стратегія-1-проактивний-refresh-перед-закінченням","Стратегія 1: Проактивний Refresh (перед закінченням)",[3857,16547,16549],{"className":4242,"code":16548,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fhooks\u002FuseTokenRefresh.ts\n\nimport { useEffect, useRef } from 'react';\nimport { AppState, AppStateStatus } from 'react-native';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\nimport { tokenService } from '..\u002Fservices\u002FtokenService';\n\n\u002F**\n * Hook для автоматичного оновлення токену\n *\u002F\nexport function useTokenRefresh() {\n  const { refreshSession, logout, isAuthenticated } = useAuth();\n  const intervalRef = useRef\u003CNodeJS.Timeout | null>(null);\n  const appState = useRef(AppState.currentState);\n\n  \u002F**\n   * Перевірка та оновлення токену\n   *\u002F\n  const checkAndRefresh = async () => {\n    try {\n      const timeLeft = await tokenService.getTimeUntilExpiry();\n      \n      if (timeLeft === null) return;\n\n      \u002F\u002F Якщо до закінчення менше 5 хвилин — оновлюємо\n      if (timeLeft \u003C 300) {\n        console.log('⚠️ Токен скоро закінчиться, оновлюємо...');\n        await refreshSession();\n      }\n    } catch (error) {\n      console.error('❌ Помилка refresh токену:', error);\n      \u002F\u002F При помилці робимо logout\n      await logout();\n    }\n  };\n\n  \u002F**\n   * Обробка зміни стану додатку\n   *\u002F\n  const handleAppStateChange = async (nextAppState: AppStateStatus) => {\n    \u002F\u002F Додаток повернувся на передній план\n    if (\n      appState.current.match(\u002Finactive|background\u002F) &&\n      nextAppState === 'active'\n    ) {\n      console.log('📱 Додаток активований, перевіряємо токен...');\n      await checkAndRefresh();\n    }\n    \n    appState.current = nextAppState;\n  };\n\n  useEffect(() => {\n    if (!isAuthenticated) return;\n\n    \u002F\u002F Перевірка кожні 60 секунд\n    intervalRef.current = setInterval(checkAndRefresh, 60000);\n\n    \u002F\u002F Слухач стану додатку\n    const subscription = AppState.addEventListener(\n      'change',\n      handleAppStateChange\n    );\n\n    \u002F\u002F Initial check\n    checkAndRefresh();\n\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n      subscription.remove();\n    };\n  }, [isAuthenticated]);\n}\n",[3782,16550,16551,16556,16560,16581,16603,16619,16635,16639,16643,16648,16652,16663,16685,16716,16738,16742,16746,16751,16755,16772,16778,16797,16801,16819,16823,16828,16844,16859,16867,16871,16883,16902,16907,16915,16919,16923,16927,16931,16936,16940,16966,16971,16977,17008,17018,17023,17038,17046,17050,17054,17069,17073,17077,17087,17101,17105,17110,17135,17139,17144,17162,17169,17174,17178,17182,17187,17194,17198,17208,17223,17238,17242,17254,17259,17267],{"__ignoreMap":3865},[3946,16552,16553],{"class":3948,"line":3949},[3946,16554,16555],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fhooks\u002FuseTokenRefresh.ts\n",[3946,16557,16558],{"class":3948,"line":3956},[3946,16559,4278],{"emptyLinePlaceholder":4277},[3946,16561,16562,16564,16566,16568,16570,16573,16575,16577,16579],{"class":3948,"line":3973},[3946,16563,4252],{"class":4251},[3946,16565,6817],{"class":3952},[3946,16567,15953],{"class":4262},[3946,16569,4447],{"class":3952},[3946,16571,16572],{"class":4262},"useRef",[3946,16574,6823],{"class":3952},[3946,16576,6826],{"class":4251},[3946,16578,10304],{"class":3966},[3946,16580,4272],{"class":3952},[3946,16582,16583,16585,16587,16590,16592,16595,16597,16599,16601],{"class":3948,"line":3986},[3946,16584,4252],{"class":4251},[3946,16586,6817],{"class":3952},[3946,16588,16589],{"class":4262},"AppState",[3946,16591,4447],{"class":3952},[3946,16593,16594],{"class":4262},"AppStateStatus",[3946,16596,6823],{"class":3952},[3946,16598,6826],{"class":4251},[3946,16600,12943],{"class":3966},[3946,16602,4272],{"class":3952},[3946,16604,16605,16607,16609,16611,16613,16615,16617],{"class":3948,"line":3999},[3946,16606,4252],{"class":4251},[3946,16608,6817],{"class":3952},[3946,16610,12954],{"class":4262},[3946,16612,6823],{"class":3952},[3946,16614,6826],{"class":4251},[3946,16616,14794],{"class":3966},[3946,16618,4272],{"class":3952},[3946,16620,16621,16623,16625,16627,16629,16631,16633],{"class":3948,"line":4012},[3946,16622,4252],{"class":4251},[3946,16624,6817],{"class":3952},[3946,16626,8362],{"class":4262},[3946,16628,6823],{"class":3952},[3946,16630,6826],{"class":4251},[3946,16632,8369],{"class":3966},[3946,16634,4272],{"class":3952},[3946,16636,16637],{"class":3948,"line":4026},[3946,16638,4278],{"emptyLinePlaceholder":4277},[3946,16640,16641],{"class":3948,"line":4037},[3946,16642,6015],{"class":4342},[3946,16644,16645],{"class":3948,"line":4487},[3946,16646,16647],{"class":4342}," * Hook для автоматичного оновлення токену\n",[3946,16649,16650],{"class":3948,"line":4507},[3946,16651,6025],{"class":4342},[3946,16653,16654,16656,16658,16661],{"class":3948,"line":4518},[3946,16655,6030],{"class":4251},[3946,16657,4390],{"class":4255},[3946,16659,16660],{"class":4224}," useTokenRefresh",[3946,16662,8490],{"class":3952},[3946,16664,16665,16667,16669,16671,16673,16675,16677,16679,16681,16683],{"class":3948,"line":4524},[3946,16666,5018],{"class":4255},[3946,16668,6817],{"class":3952},[3946,16670,12564],{"class":4286},[3946,16672,4447],{"class":3952},[3946,16674,11981],{"class":4286},[3946,16676,4447],{"class":3952},[3946,16678,13041],{"class":4286},[3946,16680,13049],{"class":3952},[3946,16682,12954],{"class":4224},[3946,16684,4304],{"class":3952},[3946,16686,16687,16689,16692,16694,16696,16698,16701,16703,16706,16708,16710,16712,16714],{"class":3948,"line":4529},[3946,16688,5018],{"class":4255},[3946,16690,16691],{"class":4286}," intervalRef",[3946,16693,4290],{"class":3952},[3946,16695,16572],{"class":4224},[3946,16697,4413],{"class":3952},[3946,16699,16700],{"class":4403},"NodeJS",[3946,16702,4298],{"class":3952},[3946,16704,16705],{"class":4403},"Timeout",[3946,16707,4559],{"class":3952},[3946,16709,4562],{"class":4403},[3946,16711,9498],{"class":3952},[3946,16713,4562],{"class":4255},[3946,16715,4337],{"class":3952},[3946,16717,16718,16720,16723,16725,16727,16729,16731,16733,16736],{"class":3948,"line":4534},[3946,16719,5018],{"class":4255},[3946,16721,16722],{"class":4286}," appState",[3946,16724,4290],{"class":3952},[3946,16726,16572],{"class":4224},[3946,16728,4331],{"class":3952},[3946,16730,16589],{"class":4262},[3946,16732,4298],{"class":3952},[3946,16734,16735],{"class":4262},"currentState",[3946,16737,4337],{"class":3952},[3946,16739,16740],{"class":3948,"line":4540},[3946,16741,4278],{"emptyLinePlaceholder":4277},[3946,16743,16744],{"class":3948,"line":4567},[3946,16745,6908],{"class":4342},[3946,16747,16748],{"class":3948,"line":4574},[3946,16749,16750],{"class":4342},"   * Перевірка та оновлення токену\n",[3946,16752,16753],{"class":3948,"line":4600},[3946,16754,6918],{"class":4342},[3946,16756,16757,16759,16762,16764,16766,16768,16770],{"class":3948,"line":4610},[3946,16758,5018],{"class":4255},[3946,16760,16761],{"class":4224}," checkAndRefresh",[3946,16763,4290],{"class":3952},[3946,16765,4387],{"class":4255},[3946,16767,11004],{"class":3952},[3946,16769,6453],{"class":4255},[3946,16771,4427],{"class":3952},[3946,16773,16774,16776],{"class":3948,"line":4623},[3946,16775,6977],{"class":4251},[3946,16777,4427],{"class":3952},[3946,16779,16780,16782,16784,16786,16788,16790,16792,16795],{"class":3948,"line":4643},[3946,16781,6984],{"class":4255},[3946,16783,8122],{"class":4286},[3946,16785,4290],{"class":3952},[3946,16787,4293],{"class":4251},[3946,16789,8213],{"class":4262},[3946,16791,4298],{"class":3952},[3946,16793,16794],{"class":4224},"getTimeUntilExpiry",[3946,16796,4304],{"class":3952},[3946,16798,16799],{"class":3948,"line":4653},[3946,16800,7095],{"class":3952},[3946,16802,16803,16805,16807,16809,16811,16813,16815,16817],{"class":3948,"line":4658},[3946,16804,7246],{"class":4251},[3946,16806,4479],{"class":3952},[3946,16808,8180],{"class":4262},[3946,16810,8816],{"class":3952},[3946,16812,4562],{"class":4255},[3946,16814,5783],{"class":3952},[3946,16816,5786],{"class":4251},[3946,16818,4272],{"class":3952},[3946,16820,16821],{"class":3948,"line":4663},[3946,16822,4278],{"emptyLinePlaceholder":4277},[3946,16824,16825],{"class":3948,"line":4668},[3946,16826,16827],{"class":4342},"      \u002F\u002F Якщо до закінчення менше 5 хвилин — оновлюємо\n",[3946,16829,16830,16832,16834,16836,16839,16842],{"class":3948,"line":4674},[3946,16831,7246],{"class":4251},[3946,16833,4479],{"class":3952},[3946,16835,8180],{"class":4262},[3946,16837,16838],{"class":3952}," \u003C ",[3946,16840,16841],{"class":4020},"300",[3946,16843,4318],{"class":3952},[3946,16845,16846,16848,16850,16852,16854,16857],{"class":3948,"line":4694},[3946,16847,7257],{"class":4262},[3946,16849,4298],{"class":3952},[3946,16851,4461],{"class":4224},[3946,16853,4331],{"class":3952},[3946,16855,16856],{"class":3966},"'⚠️ Токен скоро закінчиться, оновлюємо...'",[3946,16858,4337],{"class":3952},[3946,16860,16861,16863,16865],{"class":3948,"line":4701},[3946,16862,7374],{"class":4251},[3946,16864,12115],{"class":4224},[3946,16866,4304],{"class":3952},[3946,16868,16869],{"class":3948,"line":4719},[3946,16870,7282],{"class":3952},[3946,16872,16873,16875,16877,16879,16881],{"class":3948,"line":4735},[3946,16874,7115],{"class":3952},[3946,16876,4476],{"class":4251},[3946,16878,4479],{"class":3952},[3946,16880,4482],{"class":4262},[3946,16882,4318],{"class":3952},[3946,16884,16885,16887,16889,16891,16893,16896,16898,16900],{"class":3948,"line":4748},[3946,16886,5525],{"class":4262},[3946,16888,4298],{"class":3952},[3946,16890,4482],{"class":4224},[3946,16892,4331],{"class":3952},[3946,16894,16895],{"class":3966},"'❌ Помилка refresh токену:'",[3946,16897,4447],{"class":3952},[3946,16899,4482],{"class":4262},[3946,16901,4337],{"class":3952},[3946,16903,16904],{"class":3948,"line":4768},[3946,16905,16906],{"class":4342},"      \u002F\u002F При помилці робимо logout\n",[3946,16908,16909,16911,16913],{"class":3948,"line":4777},[3946,16910,7069],{"class":4251},[3946,16912,9202],{"class":4224},[3946,16914,4304],{"class":3952},[3946,16916,16917],{"class":3948,"line":4782},[3946,16918,5550],{"class":3952},[3946,16920,16921],{"class":3948,"line":6262},[3946,16922,15539],{"class":3952},[3946,16924,16925],{"class":3948,"line":6273},[3946,16926,4278],{"emptyLinePlaceholder":4277},[3946,16928,16929],{"class":3948,"line":6284},[3946,16930,6908],{"class":4342},[3946,16932,16933],{"class":3948,"line":6299},[3946,16934,16935],{"class":4342},"   * Обробка зміни стану додатку\n",[3946,16937,16938],{"class":3948,"line":6304},[3946,16939,6918],{"class":4342},[3946,16941,16942,16944,16947,16949,16951,16953,16956,16958,16960,16962,16964],{"class":3948,"line":6309},[3946,16943,5018],{"class":4255},[3946,16945,16946],{"class":4224}," handleAppStateChange",[3946,16948,4290],{"class":3952},[3946,16950,4387],{"class":4255},[3946,16952,4479],{"class":3952},[3946,16954,16955],{"class":4262},"nextAppState",[3946,16957,3963],{"class":3952},[3946,16959,16594],{"class":4403},[3946,16961,5783],{"class":3952},[3946,16963,6453],{"class":4255},[3946,16965,4427],{"class":3952},[3946,16967,16968],{"class":3948,"line":6314},[3946,16969,16970],{"class":4342},"    \u002F\u002F Додаток повернувся на передній план\n",[3946,16972,16973,16975],{"class":3948,"line":6320},[3946,16974,5503],{"class":4251},[3946,16976,13079],{"class":3952},[3946,16978,16979,16982,16984,16987,16989,16992,16994,16998,17002,17005],{"class":3948,"line":6325},[3946,16980,16981],{"class":4262},"      appState",[3946,16983,4298],{"class":3952},[3946,16985,16986],{"class":4262},"current",[3946,16988,4298],{"class":3952},[3946,16990,16991],{"class":4224},"match",[3946,16993,4331],{"class":3952},[3946,16995,16997],{"class":16996},"shsrj","\u002Finactive",[3946,16999,17001],{"class":17000},"siofk","|",[3946,17003,17004],{"class":16996},"background\u002F",[3946,17006,17007],{"class":3952},") &&\n",[3946,17009,17010,17013,17015],{"class":3948,"line":6337},[3946,17011,17012],{"class":4262},"      nextAppState",[3946,17014,8816],{"class":3952},[3946,17016,17017],{"class":3966},"'active'\n",[3946,17019,17020],{"class":3948,"line":6352},[3946,17021,17022],{"class":3952},"    ) {\n",[3946,17024,17025,17027,17029,17031,17033,17036],{"class":3948,"line":6364},[3946,17026,5525],{"class":4262},[3946,17028,4298],{"class":3952},[3946,17030,4461],{"class":4224},[3946,17032,4331],{"class":3952},[3946,17034,17035],{"class":3966},"'📱 Додаток активований, перевіряємо токен...'",[3946,17037,4337],{"class":3952},[3946,17039,17040,17042,17044],{"class":3948,"line":6376},[3946,17041,7069],{"class":4251},[3946,17043,16761],{"class":4224},[3946,17045,4304],{"class":3952},[3946,17047,17048],{"class":3948,"line":6392},[3946,17049,5550],{"class":3952},[3946,17051,17052],{"class":3948,"line":6397},[3946,17053,7612],{"class":3952},[3946,17055,17056,17059,17061,17063,17065,17067],{"class":3948,"line":6402},[3946,17057,17058],{"class":4262},"    appState",[3946,17060,4298],{"class":3952},[3946,17062,16986],{"class":4262},[3946,17064,4290],{"class":3952},[3946,17066,16955],{"class":4262},[3946,17068,4272],{"class":3952},[3946,17070,17071],{"class":3948,"line":6407},[3946,17072,15539],{"class":3952},[3946,17074,17075],{"class":3948,"line":6413},[3946,17076,4278],{"emptyLinePlaceholder":4277},[3946,17078,17079,17081,17083,17085],{"class":3948,"line":6418},[3946,17080,10265],{"class":4224},[3946,17082,10707],{"class":3952},[3946,17084,6453],{"class":4255},[3946,17086,4427],{"class":3952},[3946,17088,17089,17091,17093,17095,17097,17099],{"class":3948,"line":6434},[3946,17090,5503],{"class":4251},[3946,17092,4312],{"class":3952},[3946,17094,13041],{"class":4262},[3946,17096,5783],{"class":3952},[3946,17098,5786],{"class":4251},[3946,17100,4272],{"class":3952},[3946,17102,17103],{"class":3948,"line":6466},[3946,17104,4278],{"emptyLinePlaceholder":4277},[3946,17106,17107],{"class":3948,"line":6493},[3946,17108,17109],{"class":4342},"    \u002F\u002F Перевірка кожні 60 секунд\n",[3946,17111,17112,17115,17117,17119,17121,17124,17126,17129,17131,17133],{"class":3948,"line":6512},[3946,17113,17114],{"class":4262},"    intervalRef",[3946,17116,4298],{"class":3952},[3946,17118,16986],{"class":4262},[3946,17120,4290],{"class":3952},[3946,17122,17123],{"class":4224},"setInterval",[3946,17125,4331],{"class":3952},[3946,17127,17128],{"class":4262},"checkAndRefresh",[3946,17130,4447],{"class":3952},[3946,17132,7672],{"class":4020},[3946,17134,4337],{"class":3952},[3946,17136,17137],{"class":3948,"line":6530},[3946,17138,4278],{"emptyLinePlaceholder":4277},[3946,17140,17141],{"class":3948,"line":6545},[3946,17142,17143],{"class":4342},"    \u002F\u002F Слухач стану додатку\n",[3946,17145,17146,17148,17151,17153,17155,17157,17160],{"class":3948,"line":6550},[3946,17147,4577],{"class":4255},[3946,17149,17150],{"class":4286}," subscription",[3946,17152,4290],{"class":3952},[3946,17154,16589],{"class":4262},[3946,17156,4298],{"class":3952},[3946,17158,17159],{"class":4224},"addEventListener",[3946,17161,6594],{"class":3952},[3946,17163,17164,17167],{"class":3948,"line":6555},[3946,17165,17166],{"class":3966},"      'change'",[3946,17168,3970],{"class":3952},[3946,17170,17171],{"class":3948,"line":6560},[3946,17172,17173],{"class":4262},"      handleAppStateChange\n",[3946,17175,17176],{"class":3948,"line":6566},[3946,17177,8731],{"class":3952},[3946,17179,17180],{"class":3948,"line":6571},[3946,17181,4278],{"emptyLinePlaceholder":4277},[3946,17183,17184],{"class":3948,"line":6588},[3946,17185,17186],{"class":4342},"    \u002F\u002F Initial check\n",[3946,17188,17189,17192],{"class":3948,"line":6597},[3946,17190,17191],{"class":4224},"    checkAndRefresh",[3946,17193,4304],{"class":3952},[3946,17195,17196],{"class":3948,"line":6609},[3946,17197,4278],{"emptyLinePlaceholder":4277},[3946,17199,17200,17202,17204,17206],{"class":3948,"line":6640},[3946,17201,4603],{"class":4251},[3946,17203,11004],{"class":3952},[3946,17205,6453],{"class":4255},[3946,17207,4427],{"class":3952},[3946,17209,17210,17212,17214,17217,17219,17221],{"class":3948,"line":6653},[3946,17211,7246],{"class":4251},[3946,17213,4479],{"class":3952},[3946,17215,17216],{"class":4262},"intervalRef",[3946,17218,4298],{"class":3952},[3946,17220,16986],{"class":4262},[3946,17222,4318],{"class":3952},[3946,17224,17225,17228,17230,17232,17234,17236],{"class":3948,"line":6659},[3946,17226,17227],{"class":4224},"        clearInterval",[3946,17229,4331],{"class":3952},[3946,17231,17216],{"class":4262},[3946,17233,4298],{"class":3952},[3946,17235,16986],{"class":4262},[3946,17237,4337],{"class":3952},[3946,17239,17240],{"class":3948,"line":6671},[3946,17241,7282],{"class":3952},[3946,17243,17244,17247,17249,17252],{"class":3948,"line":6689},[3946,17245,17246],{"class":4262},"      subscription",[3946,17248,4298],{"class":3952},[3946,17250,17251],{"class":4224},"remove",[3946,17253,4304],{"class":3952},[3946,17255,17256],{"class":3948,"line":6694},[3946,17257,17258],{"class":3952},"    };\n",[3946,17260,17261,17263,17265],{"class":3948,"line":6699},[3946,17262,10731],{"class":3952},[3946,17264,13041],{"class":4262},[3946,17266,10737],{"class":3952},[3946,17268,17269],{"class":3948,"line":6704},[3946,17270,4040],{"class":3952},[3743,17272,17273],{},[3771,17274,17275],{},"Використання в App.tsx:",[3857,17277,17279],{"className":4242,"code":17278,"language":4244,"meta":3865,"style":3865},"function App() {\n  useTokenRefresh(); \u002F\u002F Автоматично працює в фоні\n\n  return (\n    \u003CAuthProvider>\n      \u003CRootNavigator \u002F>\n    \u003C\u002FAuthProvider>\n  );\n}\n",[3782,17280,17281,17290,17301,17305,17311,17320,17329,17337,17341],{"__ignoreMap":3865},[3946,17282,17283,17285,17288],{"class":3948,"line":3949},[3946,17284,14029],{"class":4255},[3946,17286,17287],{"class":4224}," App",[3946,17289,8490],{"class":3952},[3946,17291,17292,17295,17298],{"class":3948,"line":3956},[3946,17293,17294],{"class":4224},"  useTokenRefresh",[3946,17296,17297],{"class":3952},"(); ",[3946,17299,17300],{"class":4342},"\u002F\u002F Автоматично працює в фоні\n",[3946,17302,17303],{"class":3948,"line":3973},[3946,17304,4278],{"emptyLinePlaceholder":4277},[3946,17306,17307,17309],{"class":3948,"line":3986},[3946,17308,5062],{"class":4251},[3946,17310,13079],{"class":3952},[3946,17312,17313,17315,17318],{"class":3948,"line":3999},[3946,17314,13158],{"class":3952},[3946,17316,17317],{"class":4403},"AuthProvider",[3946,17319,13135],{"class":3952},[3946,17321,17322,17324,17327],{"class":3948,"line":4012},[3946,17323,13084],{"class":3952},[3946,17325,17326],{"class":4262},"RootNavigator",[3946,17328,13125],{"class":3952},[3946,17330,17331,17333,17335],{"class":3948,"line":4026},[3946,17332,13187],{"class":3952},[3946,17334,17317],{"class":4262},[3946,17336,13135],{"class":3952},[3946,17338,17339],{"class":3948,"line":4037},[3946,17340,10875],{"class":3952},[3946,17342,17343],{"class":3948,"line":4487},[3946,17344,4040],{"class":3952},[3847,17346,17348],{"id":17347},"стратегія-2-реактивний-refresh-при-401","Стратегія 2: Реактивний Refresh (при 401)",[3743,17350,17351,17352,17355],{},"Вже реалізовано в ",[3782,17353,17354],{},"authApi.ts"," через Axios interceptor:",[3857,17357,17359],{"className":4242,"code":17358,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Interceptor для обробки 401\nthis.client.interceptors.response.use(\n  (response) => response,\n  async (error: AxiosError) => {\n    const originalRequest = error.config;\n\n    if (error.response?.status === 401 && originalRequest && !originalRequest._retry) {\n      originalRequest._retry = true;\n\n      try {\n        \u002F\u002F Спроба refresh\n        const tokens = await tokenService.getTokens();\n        \n        if (!tokens?.refreshToken) {\n          throw new Error('No refresh token');\n        }\n\n        const response = await this.client.post\u003CAuthResponse>(\n          '\u002Fauth\u002Frefresh',\n          { refreshToken: tokens.refreshToken }\n        );\n\n        \u002F\u002F Зберігаємо нові токени\n        await tokenService.saveTokens(\n          response.data.accessToken,\n          response.data.refreshToken,\n          response.data.expiresIn\n        );\n\n        \u002F\u002F Повторюємо оригінальний запит з новим токеном\n        originalRequest.headers.Authorization = `Bearer ${response.data.accessToken}`;\n        return this.client(originalRequest);\n      } catch (refreshError) {\n        \u002F\u002F Refresh не спрацював — logout\n        await tokenService.clearTokens();\n        \u002F\u002F Тут можна викинути custom event для AuthContext\n        return Promise.reject(refreshError);\n      }\n    }\n\n    return Promise.reject(error);\n  }\n);\n",[3782,17360,17361,17366,17389,17404,17422,17439,17443,17480,17496,17500,17506,17511,17529,17533,17547,17563,17567,17571,17597,17604,17620,17624,17628,17633,17645,17659,17673,17685,17689,17693,17698,17733,17749,17762,17767,17779,17784,17800,17804,17808,17812,17828,17832],{"__ignoreMap":3865},[3946,17362,17363],{"class":3948,"line":3949},[3946,17364,17365],{"class":4342},"\u002F\u002F Interceptor для обробки 401\n",[3946,17367,17368,17371,17373,17375,17377,17379,17381,17383,17385,17387],{"class":3948,"line":3956},[3946,17369,17370],{"class":4255},"this",[3946,17372,4298],{"class":3952},[3946,17374,8499],{"class":4262},[3946,17376,4298],{"class":3952},[3946,17378,8582],{"class":4262},[3946,17380,4298],{"class":3952},[3946,17382,8757],{"class":4262},[3946,17384,4298],{"class":3952},[3946,17386,8592],{"class":4224},[3946,17388,6594],{"class":3952},[3946,17390,17391,17394,17396,17398,17400,17402],{"class":3948,"line":3973},[3946,17392,17393],{"class":3952},"  (",[3946,17395,8757],{"class":4262},[3946,17397,5783],{"class":3952},[3946,17399,6453],{"class":4255},[3946,17401,8776],{"class":4262},[3946,17403,3970],{"class":3952},[3946,17405,17406,17408,17410,17412,17414,17416,17418,17420],{"class":3948,"line":3986},[3946,17407,6923],{"class":4255},[3946,17409,4479],{"class":3952},[3946,17411,4482],{"class":4262},[3946,17413,3963],{"class":3952},[3946,17415,8293],{"class":4403},[3946,17417,5783],{"class":3952},[3946,17419,6453],{"class":4255},[3946,17421,4427],{"class":3952},[3946,17423,17424,17426,17429,17431,17433,17435,17437],{"class":3948,"line":3999},[3946,17425,4577],{"class":4255},[3946,17427,17428],{"class":4286}," originalRequest",[3946,17430,4290],{"class":3952},[3946,17432,4482],{"class":4262},[3946,17434,4298],{"class":3952},[3946,17436,8604],{"class":4262},[3946,17438,4272],{"class":3952},[3946,17440,17441],{"class":3948,"line":4012},[3946,17442,4278],{"emptyLinePlaceholder":4277},[3946,17444,17445,17447,17449,17451,17453,17455,17457,17459,17461,17463,17465,17468,17471,17473,17475,17478],{"class":3948,"line":4026},[3946,17446,5503],{"class":4251},[3946,17448,4479],{"class":3952},[3946,17450,4482],{"class":4262},[3946,17452,4298],{"class":3952},[3946,17454,8757],{"class":4262},[3946,17456,7539],{"class":3952},[3946,17458,8813],{"class":4262},[3946,17460,8816],{"class":3952},[3946,17462,8819],{"class":4020},[3946,17464,15293],{"class":3952},[3946,17466,17467],{"class":4262},"originalRequest",[3946,17469,17470],{"class":3952}," && !",[3946,17472,17467],{"class":4262},[3946,17474,4298],{"class":3952},[3946,17476,17477],{"class":4262},"_retry",[3946,17479,4318],{"class":3952},[3946,17481,17482,17485,17487,17489,17491,17494],{"class":3948,"line":4037},[3946,17483,17484],{"class":4262},"      originalRequest",[3946,17486,4298],{"class":3952},[3946,17488,17477],{"class":4262},[3946,17490,4290],{"class":3952},[3946,17492,17493],{"class":4255},"true",[3946,17495,4272],{"class":3952},[3946,17497,17498],{"class":3948,"line":4487},[3946,17499,4278],{"emptyLinePlaceholder":4277},[3946,17501,17502,17504],{"class":3948,"line":4507},[3946,17503,11354],{"class":4251},[3946,17505,4427],{"class":3952},[3946,17507,17508],{"class":3948,"line":4518},[3946,17509,17510],{"class":4342},"        \u002F\u002F Спроба refresh\n",[3946,17512,17513,17515,17517,17519,17521,17523,17525,17527],{"class":3948,"line":4524},[3946,17514,8615],{"class":4255},[3946,17516,6987],{"class":4286},[3946,17518,4290],{"class":3952},[3946,17520,4293],{"class":4251},[3946,17522,8213],{"class":4262},[3946,17524,4298],{"class":3952},[3946,17526,7528],{"class":4224},[3946,17528,4304],{"class":3952},[3946,17530,17531],{"class":3948,"line":4529},[3946,17532,8635],{"class":3952},[3946,17534,17535,17537,17539,17541,17543,17545],{"class":3948,"line":4534},[3946,17536,8640],{"class":4251},[3946,17538,4312],{"class":3952},[3946,17540,7062],{"class":4262},[3946,17542,7539],{"class":3952},[3946,17544,5363],{"class":4262},[3946,17546,4318],{"class":3952},[3946,17548,17549,17552,17554,17556,17558,17561],{"class":3948,"line":4540},[3946,17550,17551],{"class":4251},"          throw",[3946,17553,7150],{"class":4255},[3946,17555,5513],{"class":4224},[3946,17557,4331],{"class":3952},[3946,17559,17560],{"class":3966},"'No refresh token'",[3946,17562,4337],{"class":3952},[3946,17564,17565],{"class":3948,"line":4567},[3946,17566,8684],{"class":3952},[3946,17568,17569],{"class":3948,"line":4574},[3946,17570,4278],{"emptyLinePlaceholder":4277},[3946,17572,17573,17575,17577,17579,17581,17583,17585,17587,17589,17591,17593,17595],{"class":3948,"line":4600},[3946,17574,8615],{"class":4255},[3946,17576,8776],{"class":4286},[3946,17578,4290],{"class":3952},[3946,17580,4293],{"class":4251},[3946,17582,7377],{"class":4255},[3946,17584,4298],{"class":3952},[3946,17586,8499],{"class":4262},[3946,17588,4298],{"class":3952},[3946,17590,8960],{"class":4224},[3946,17592,4413],{"class":3952},[3946,17594,8931],{"class":4403},[3946,17596,8967],{"class":3952},[3946,17598,17599,17602],{"class":3948,"line":4610},[3946,17600,17601],{"class":3966},"          '\u002Fauth\u002Frefresh'",[3946,17603,3970],{"class":3952},[3946,17605,17606,17609,17612,17614,17616,17618],{"class":3948,"line":4623},[3946,17607,17608],{"class":3952},"          { ",[3946,17610,17611],{"class":4262},"refreshToken:",[3946,17613,6987],{"class":4262},[3946,17615,4298],{"class":3952},[3946,17617,5363],{"class":4262},[3946,17619,9374],{"class":3952},[3946,17621,17622],{"class":3948,"line":4643},[3946,17623,11464],{"class":3952},[3946,17625,17626],{"class":3948,"line":4653},[3946,17627,4278],{"emptyLinePlaceholder":4277},[3946,17629,17630],{"class":3948,"line":4658},[3946,17631,17632],{"class":4342},"        \u002F\u002F Зберігаємо нові токени\n",[3946,17634,17635,17637,17639,17641,17643],{"class":3948,"line":4663},[3946,17636,7374],{"class":4251},[3946,17638,8213],{"class":4262},[3946,17640,4298],{"class":3952},[3946,17642,7869],{"class":4224},[3946,17644,6594],{"class":3952},[3946,17646,17647,17649,17651,17653,17655,17657],{"class":3948,"line":4668},[3946,17648,11434],{"class":4262},[3946,17650,4298],{"class":3952},[3946,17652,5178],{"class":4262},[3946,17654,4298],{"class":3952},[3946,17656,7334],{"class":4262},[3946,17658,3970],{"class":3952},[3946,17660,17661,17663,17665,17667,17669,17671],{"class":3948,"line":4674},[3946,17662,11434],{"class":4262},[3946,17664,4298],{"class":3952},[3946,17666,5178],{"class":4262},[3946,17668,4298],{"class":3952},[3946,17670,5363],{"class":4262},[3946,17672,3970],{"class":3952},[3946,17674,17675,17677,17679,17681,17683],{"class":3948,"line":4694},[3946,17676,11434],{"class":4262},[3946,17678,4298],{"class":3952},[3946,17680,5178],{"class":4262},[3946,17682,4298],{"class":3952},[3946,17684,11459],{"class":4262},[3946,17686,17687],{"class":3948,"line":4701},[3946,17688,11464],{"class":3952},[3946,17690,17691],{"class":3948,"line":4719},[3946,17692,4278],{"emptyLinePlaceholder":4277},[3946,17694,17695],{"class":3948,"line":4735},[3946,17696,17697],{"class":4342},"        \u002F\u002F Повторюємо оригінальний запит з новим токеном\n",[3946,17699,17700,17703,17705,17707,17709,17711,17713,17715,17717,17719,17721,17723,17725,17727,17729,17731],{"class":3948,"line":4748},[3946,17701,17702],{"class":4262},"        originalRequest",[3946,17704,4298],{"class":3952},[3946,17706,8656],{"class":4262},[3946,17708,4298],{"class":3952},[3946,17710,8661],{"class":4262},[3946,17712,4290],{"class":3952},[3946,17714,8666],{"class":3966},[3946,17716,8669],{"class":4255},[3946,17718,8757],{"class":4262},[3946,17720,4298],{"class":16179},[3946,17722,5178],{"class":4262},[3946,17724,4298],{"class":16179},[3946,17726,7334],{"class":4262},[3946,17728,8674],{"class":4255},[3946,17730,8677],{"class":3966},[3946,17732,4272],{"class":3952},[3946,17734,17735,17737,17739,17741,17743,17745,17747],{"class":3948,"line":4768},[3946,17736,7273],{"class":4251},[3946,17738,7377],{"class":4255},[3946,17740,4298],{"class":3952},[3946,17742,8499],{"class":4224},[3946,17744,4331],{"class":3952},[3946,17746,17467],{"class":4262},[3946,17748,4337],{"class":3952},[3946,17750,17751,17753,17755,17757,17760],{"class":3948,"line":4777},[3946,17752,11493],{"class":3952},[3946,17754,4476],{"class":4251},[3946,17756,4479],{"class":3952},[3946,17758,17759],{"class":4262},"refreshError",[3946,17761,4318],{"class":3952},[3946,17763,17764],{"class":3948,"line":4782},[3946,17765,17766],{"class":4342},"        \u002F\u002F Refresh не спрацював — logout\n",[3946,17768,17769,17771,17773,17775,17777],{"class":3948,"line":6262},[3946,17770,7374],{"class":4251},[3946,17772,8213],{"class":4262},[3946,17774,4298],{"class":3952},[3946,17776,7382],{"class":4224},[3946,17778,4304],{"class":3952},[3946,17780,17781],{"class":3948,"line":6273},[3946,17782,17783],{"class":4342},"        \u002F\u002F Тут можна викинути custom event для AuthContext\n",[3946,17785,17786,17788,17790,17792,17794,17796,17798],{"class":3948,"line":6284},[3946,17787,7273],{"class":4251},[3946,17789,6456],{"class":4403},[3946,17791,4298],{"class":3952},[3946,17793,8719],{"class":4224},[3946,17795,4331],{"class":3952},[3946,17797,17759],{"class":4262},[3946,17799,4337],{"class":3952},[3946,17801,17802],{"class":3948,"line":6299},[3946,17803,7282],{"class":3952},[3946,17805,17806],{"class":3948,"line":6304},[3946,17807,5550],{"class":3952},[3946,17809,17810],{"class":3948,"line":6309},[3946,17811,4278],{"emptyLinePlaceholder":4277},[3946,17813,17814,17816,17818,17820,17822,17824,17826],{"class":3948,"line":6314},[3946,17815,4603],{"class":4251},[3946,17817,6456],{"class":4403},[3946,17819,4298],{"class":3952},[3946,17821,8719],{"class":4224},[3946,17823,4331],{"class":3952},[3946,17825,4482],{"class":4262},[3946,17827,4337],{"class":3952},[3946,17829,17830],{"class":3948,"line":6320},[3946,17831,4521],{"class":3952},[3946,17833,17834],{"class":3948,"line":6325},[3946,17835,4337],{"class":3952},[3743,17837,17838,13298,17841,17843],{},[3771,17839,17840],{},"Важливо:",[3782,17842,17477],{}," флаг запобігає безкінечному циклу refresh спроб.",[3750,17845,17847],{"id":17846},"_63-глобальний-error-boundary-для-auth","6.3. Глобальний Error Boundary для Auth",[3857,17849,17851],{"className":4242,"code":17850,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthErrorBoundary.tsx\n\nimport React, { Component, ReactNode } from 'react';\nimport { View, Text, TouchableOpacity, StyleSheet } from 'react-native';\n\ninterface Props {\n  children: ReactNode;\n  onError?: (error: Error) => void;\n}\n\ninterface State {\n  hasError: boolean;\n  error: Error | null;\n}\n\n\u002F**\n * Error Boundary для ловлення auth-помилок\n *\u002F\nexport class AuthErrorBoundary extends Component\u003CProps, State> {\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      hasError: false,\n      error: null,\n    };\n  }\n\n  static getDerivedStateFromError(error: Error): State {\n    return {\n      hasError: true,\n      error,\n    };\n  }\n\n  componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n    console.error('Auth Error Boundary caught:', error, errorInfo);\n    this.props.onError?.(error);\n  }\n\n  handleReset = () => {\n    this.setState({ hasError: false, error: null });\n  };\n\n  render() {\n    if (this.state.hasError) {\n      return (\n        \u003CView style={styles.container}>\n          \u003CText style={styles.title}>Помилка автентифікації\u003C\u002FText>\n          \u003CText style={styles.message}>\n            {this.state.error?.message || 'Щось пішло не так'}\n          \u003C\u002FText>\n          \u003CTouchableOpacity style={styles.button} onPress={this.handleReset}>\n            \u003CText style={styles.buttonText}>Спробувати знову\u003C\u002FText>\n          \u003C\u002FTouchableOpacity>\n        \u003C\u002FView>\n      );\n    }\n\n    return this.props.children;\n  }\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    padding: 20,\n    backgroundColor: '#FFFFFF',\n  },\n  title: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#FF3B30',\n    marginBottom: 12,\n  },\n  message: {\n    fontSize: 16,\n    color: '#666666',\n    textAlign: 'center',\n    marginBottom: 24,\n  },\n  button: {\n    backgroundColor: '#007AFF',\n    paddingHorizontal: 24,\n    paddingVertical: 12,\n    borderRadius: 8,\n  },\n  buttonText: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n});\n",[3782,17852,17853,17858,17862,17884,17912,17916,17925,17935,17957,17961,17965,17974,17985,17999,18003,18007,18011,18016,18020,18046,18060,18070,18080,18089,18098,18102,18106,18110,18132,18138,18146,18153,18157,18161,18165,18194,18217,18237,18241,18245,18257,18280,18284,18288,18295,18314,18320,18334,18360,18374,18410,18418,18442,18468,18476,18484,18488,18492,18496,18512,18516,18520,18524,18540,18546,18554,18562,18570,18578,18586,18590,18596,18604,18612,18621,18629,18633,18639,18647,18655,18663,18671,18675,18681,18689,18697,18705,18713,18717,18723,18731,18739,18747,18751],{"__ignoreMap":3865},[3946,17854,17855],{"class":3948,"line":3949},[3946,17856,17857],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthErrorBoundary.tsx\n",[3946,17859,17860],{"class":3948,"line":3956},[3946,17861,4278],{"emptyLinePlaceholder":4277},[3946,17863,17864,17866,17868,17870,17872,17874,17876,17878,17880,17882],{"class":3948,"line":3973},[3946,17865,4252],{"class":4251},[3946,17867,10244],{"class":4262},[3946,17869,8290],{"class":3952},[3946,17871,15527],{"class":4262},[3946,17873,4447],{"class":3952},[3946,17875,10471],{"class":4262},[3946,17877,6823],{"class":3952},[3946,17879,6826],{"class":4251},[3946,17881,10304],{"class":3966},[3946,17883,4272],{"class":3952},[3946,17885,17886,17888,17890,17892,17894,17896,17898,17900,17902,17904,17906,17908,17910],{"class":3948,"line":3986},[3946,17887,4252],{"class":4251},[3946,17889,6817],{"class":3952},[3946,17891,12926],{"class":4262},[3946,17893,4447],{"class":3952},[3946,17895,14762],{"class":4262},[3946,17897,4447],{"class":3952},[3946,17899,14771],{"class":4262},[3946,17901,4447],{"class":3952},[3946,17903,12936],{"class":4262},[3946,17905,6823],{"class":3952},[3946,17907,6826],{"class":4251},[3946,17909,12943],{"class":3966},[3946,17911,4272],{"class":3952},[3946,17913,17914],{"class":3948,"line":3999},[3946,17915,4278],{"emptyLinePlaceholder":4277},[3946,17917,17918,17920,17923],{"class":3948,"line":4012},[3946,17919,4801],{"class":4255},[3946,17921,17922],{"class":4403}," Props",[3946,17924,4427],{"class":3952},[3946,17926,17927,17929,17931,17933],{"class":3948,"line":4026},[3946,17928,10466],{"class":4262},[3946,17930,3963],{"class":3952},[3946,17932,10471],{"class":4403},[3946,17934,4272],{"class":3952},[3946,17936,17937,17940,17943,17945,17947,17949,17951,17953,17955],{"class":3948,"line":4037},[3946,17938,17939],{"class":4224},"  onError",[3946,17941,17942],{"class":3952},"?: (",[3946,17944,4482],{"class":4262},[3946,17946,3963],{"class":3952},[3946,17948,9695],{"class":4403},[3946,17950,5783],{"class":3952},[3946,17952,6453],{"class":4255},[3946,17954,6540],{"class":4403},[3946,17956,4272],{"class":3952},[3946,17958,17959],{"class":3948,"line":4487},[3946,17960,4040],{"class":3952},[3946,17962,17963],{"class":3948,"line":4507},[3946,17964,4278],{"emptyLinePlaceholder":4277},[3946,17966,17967,17969,17972],{"class":3948,"line":4518},[3946,17968,4801],{"class":4255},[3946,17970,17971],{"class":4403}," State",[3946,17973,4427],{"class":3952},[3946,17975,17976,17979,17981,17983],{"class":3948,"line":4524},[3946,17977,17978],{"class":4262},"  hasError",[3946,17980,3963],{"class":3952},[3946,17982,4848],{"class":4403},[3946,17984,4272],{"class":3952},[3946,17986,17987,17989,17991,17993,17995,17997],{"class":3948,"line":4529},[3946,17988,6379],{"class":4262},[3946,17990,3963],{"class":3952},[3946,17992,9695],{"class":4403},[3946,17994,4559],{"class":3952},[3946,17996,4562],{"class":4403},[3946,17998,4272],{"class":3952},[3946,18000,18001],{"class":3948,"line":4534},[3946,18002,4040],{"class":3952},[3946,18004,18005],{"class":3948,"line":4540},[3946,18006,4278],{"emptyLinePlaceholder":4277},[3946,18008,18009],{"class":3948,"line":4567},[3946,18010,6015],{"class":4342},[3946,18012,18013],{"class":3948,"line":4574},[3946,18014,18015],{"class":4342}," * Error Boundary для ловлення auth-помилок\n",[3946,18017,18018],{"class":3948,"line":4600},[3946,18019,6025],{"class":4342},[3946,18021,18022,18024,18026,18029,18031,18034,18036,18039,18041,18044],{"class":3948,"line":4610},[3946,18023,6030],{"class":4251},[3946,18025,6576],{"class":4255},[3946,18027,18028],{"class":4403}," AuthErrorBoundary",[3946,18030,6190],{"class":4255},[3946,18032,18033],{"class":4403}," Component",[3946,18035,4413],{"class":3952},[3946,18037,18038],{"class":4403},"Props",[3946,18040,4447],{"class":3952},[3946,18042,18043],{"class":4403},"State",[3946,18045,4419],{"class":3952},[3946,18047,18048,18050,18052,18054,18056,18058],{"class":3948,"line":4623},[3946,18049,6591],{"class":4255},[3946,18051,4331],{"class":3952},[3946,18053,14969],{"class":4262},[3946,18055,3963],{"class":3952},[3946,18057,18038],{"class":4403},[3946,18059,4318],{"class":3952},[3946,18061,18062,18064,18066,18068],{"class":3948,"line":4643},[3946,18063,6662],{"class":4255},[3946,18065,4331],{"class":3952},[3946,18067,14969],{"class":4262},[3946,18069,4337],{"class":3952},[3946,18071,18072,18074,18076,18078],{"class":3948,"line":4653},[3946,18073,6674],{"class":4255},[3946,18075,4298],{"class":3952},[3946,18077,10532],{"class":4262},[3946,18079,5893],{"class":3952},[3946,18081,18082,18085,18087],{"class":3948,"line":4658},[3946,18083,18084],{"class":4262},"      hasError:",[3946,18086,7628],{"class":4255},[3946,18088,3970],{"class":3952},[3946,18090,18091,18094,18096],{"class":3948,"line":4663},[3946,18092,18093],{"class":4262},"      error:",[3946,18095,4648],{"class":4255},[3946,18097,3970],{"class":3952},[3946,18099,18100],{"class":3948,"line":4668},[3946,18101,17258],{"class":3952},[3946,18103,18104],{"class":3948,"line":4674},[3946,18105,4521],{"class":3952},[3946,18107,18108],{"class":3948,"line":4694},[3946,18109,4278],{"emptyLinePlaceholder":4277},[3946,18111,18112,18115,18118,18120,18122,18124,18126,18128,18130],{"class":3948,"line":4701},[3946,18113,18114],{"class":4255},"  static",[3946,18116,18117],{"class":4224}," getDerivedStateFromError",[3946,18119,4331],{"class":3952},[3946,18121,4482],{"class":4262},[3946,18123,3963],{"class":3952},[3946,18125,9695],{"class":4403},[3946,18127,4407],{"class":3952},[3946,18129,18043],{"class":4403},[3946,18131,4427],{"class":3952},[3946,18133,18134,18136],{"class":3948,"line":4719},[3946,18135,4603],{"class":4251},[3946,18137,4427],{"class":3952},[3946,18139,18140,18142,18144],{"class":3948,"line":4735},[3946,18141,18084],{"class":4262},[3946,18143,4960],{"class":4255},[3946,18145,3970],{"class":3952},[3946,18147,18148,18151],{"class":3948,"line":4748},[3946,18149,18150],{"class":4262},"      error",[3946,18152,3970],{"class":3952},[3946,18154,18155],{"class":3948,"line":4768},[3946,18156,17258],{"class":3952},[3946,18158,18159],{"class":3948,"line":4777},[3946,18160,4521],{"class":3952},[3946,18162,18163],{"class":3948,"line":4782},[3946,18164,4278],{"emptyLinePlaceholder":4277},[3946,18166,18167,18170,18172,18174,18176,18178,18180,18183,18185,18187,18189,18192],{"class":3948,"line":6262},[3946,18168,18169],{"class":4224},"  componentDidCatch",[3946,18171,4331],{"class":3952},[3946,18173,4482],{"class":4262},[3946,18175,3963],{"class":3952},[3946,18177,9695],{"class":4403},[3946,18179,4447],{"class":3952},[3946,18181,18182],{"class":4262},"errorInfo",[3946,18184,3963],{"class":3952},[3946,18186,2021],{"class":4403},[3946,18188,4298],{"class":3952},[3946,18190,18191],{"class":4403},"ErrorInfo",[3946,18193,4318],{"class":3952},[3946,18195,18196,18198,18200,18202,18204,18207,18209,18211,18213,18215],{"class":3948,"line":6273},[3946,18197,4456],{"class":4262},[3946,18199,4298],{"class":3952},[3946,18201,4482],{"class":4224},[3946,18203,4331],{"class":3952},[3946,18205,18206],{"class":3966},"'Auth Error Boundary caught:'",[3946,18208,4447],{"class":3952},[3946,18210,4482],{"class":4262},[3946,18212,4447],{"class":3952},[3946,18214,18182],{"class":4262},[3946,18216,4337],{"class":3952},[3946,18218,18219,18221,18223,18225,18227,18230,18233,18235],{"class":3948,"line":6284},[3946,18220,6674],{"class":4255},[3946,18222,4298],{"class":3952},[3946,18224,14969],{"class":4262},[3946,18226,4298],{"class":3952},[3946,18228,18229],{"class":4224},"onError",[3946,18231,18232],{"class":3952},"?.(",[3946,18234,4482],{"class":4262},[3946,18236,4337],{"class":3952},[3946,18238,18239],{"class":3948,"line":6299},[3946,18240,4521],{"class":3952},[3946,18242,18243],{"class":3948,"line":6304},[3946,18244,4278],{"emptyLinePlaceholder":4277},[3946,18246,18247,18250,18253,18255],{"class":3948,"line":6309},[3946,18248,18249],{"class":4224},"  handleReset",[3946,18251,18252],{"class":3952}," = () ",[3946,18254,6453],{"class":4255},[3946,18256,4427],{"class":3952},[3946,18258,18259,18261,18263,18265,18267,18270,18272,18274,18276,18278],{"class":3948,"line":6314},[3946,18260,6674],{"class":4255},[3946,18262,4298],{"class":3952},[3946,18264,10537],{"class":4224},[3946,18266,10506],{"class":3952},[3946,18268,18269],{"class":4262},"hasError:",[3946,18271,7628],{"class":4255},[3946,18273,4447],{"class":3952},[3946,18275,10721],{"class":4262},[3946,18277,4648],{"class":4255},[3946,18279,10726],{"class":3952},[3946,18281,18282],{"class":3948,"line":6320},[3946,18283,15539],{"class":3952},[3946,18285,18286],{"class":3948,"line":6325},[3946,18287,4278],{"emptyLinePlaceholder":4277},[3946,18289,18290,18293],{"class":3948,"line":6337},[3946,18291,18292],{"class":4224},"  render",[3946,18294,8490],{"class":3952},[3946,18296,18297,18299,18301,18303,18305,18307,18309,18312],{"class":3948,"line":6352},[3946,18298,5503],{"class":4251},[3946,18300,4479],{"class":3952},[3946,18302,17370],{"class":4255},[3946,18304,4298],{"class":3952},[3946,18306,10532],{"class":4262},[3946,18308,4298],{"class":3952},[3946,18310,18311],{"class":4262},"hasError",[3946,18313,4318],{"class":3952},[3946,18315,18316,18318],{"class":3948,"line":6364},[3946,18317,7405],{"class":4251},[3946,18319,13079],{"class":3952},[3946,18321,18322,18324,18326,18328,18330,18332],{"class":3948,"line":6376},[3946,18323,13103],{"class":3952},[3946,18325,12926],{"class":4262},[3946,18327,13089],{"class":4262},[3946,18329,13092],{"class":3952},[3946,18331,15105],{"class":4262},[3946,18333,13098],{"class":3952},[3946,18335,18336,18338,18340,18342,18344,18346,18348,18351,18354,18356,18358],{"class":3948,"line":6392},[3946,18337,15112],{"class":3952},[3946,18339,14762],{"class":4262},[3946,18341,13089],{"class":4262},[3946,18343,13092],{"class":3952},[3946,18345,15121],{"class":4262},[3946,18347,15124],{"class":3952},[3946,18349,18350],{"class":4262},"Помилка",[3946,18352,18353],{"class":4262}," автентифікації",[3946,18355,15133],{"class":3952},[3946,18357,14762],{"class":4262},[3946,18359,13135],{"class":3952},[3946,18361,18362,18364,18366,18368,18370,18372],{"class":3948,"line":6397},[3946,18363,15112],{"class":3952},[3946,18365,14762],{"class":4262},[3946,18367,13089],{"class":4262},[3946,18369,13092],{"class":3952},[3946,18371,5543],{"class":4262},[3946,18373,13098],{"class":3952},[3946,18375,18376,18378,18380,18382,18384,18386,18388,18390,18392,18395,18398,18401,18404,18407],{"class":3948,"line":6402},[3946,18377,15413],{"class":3952},[3946,18379,17370],{"class":4262},[3946,18381,4298],{"class":3952},[3946,18383,10532],{"class":4262},[3946,18385,4298],{"class":3952},[3946,18387,4482],{"class":4262},[3946,18389,7539],{"class":3952},[3946,18391,5543],{"class":4262},[3946,18393,18394],{"class":3952}," || '",[3946,18396,18397],{"class":4262},"Щось",[3946,18399,18400],{"class":4262}," пішло",[3946,18402,18403],{"class":4262}," не",[3946,18405,18406],{"class":4262}," так",[3946,18408,18409],{"class":3952},"'}\n",[3946,18411,18412,18414,18416],{"class":3948,"line":6407},[3946,18413,15182],{"class":3952},[3946,18415,14762],{"class":4262},[3946,18417,13135],{"class":3952},[3946,18419,18420,18422,18424,18426,18428,18430,18432,18434,18437,18440],{"class":3948,"line":6413},[3946,18421,15112],{"class":3952},[3946,18423,14771],{"class":4262},[3946,18425,13089],{"class":4262},[3946,18427,13092],{"class":3952},[3946,18429,15199],{"class":4262},[3946,18431,5928],{"class":3952},[3946,18433,15204],{"class":4262},[3946,18435,18436],{"class":3952},"={this.",[3946,18438,18439],{"class":4262},"handleReset",[3946,18441,13098],{"class":3952},[3946,18443,18444,18446,18448,18450,18452,18454,18456,18459,18462,18464,18466],{"class":3948,"line":6418},[3946,18445,15217],{"class":3952},[3946,18447,14762],{"class":4262},[3946,18449,13089],{"class":4262},[3946,18451,13092],{"class":3952},[3946,18453,15226],{"class":4262},[3946,18455,15124],{"class":3952},[3946,18457,18458],{"class":4262},"Спробувати",[3946,18460,18461],{"class":4262}," знову",[3946,18463,15133],{"class":3952},[3946,18465,14762],{"class":4262},[3946,18467,13135],{"class":3952},[3946,18469,18470,18472,18474],{"class":3948,"line":6434},[3946,18471,15182],{"class":3952},[3946,18473,14771],{"class":4262},[3946,18475,13135],{"class":3952},[3946,18477,18478,18480,18482],{"class":3948,"line":6466},[3946,18479,15256],{"class":3952},[3946,18481,12926],{"class":4262},[3946,18483,13135],{"class":3952},[3946,18485,18486],{"class":3948,"line":6493},[3946,18487,8984],{"class":3952},[3946,18489,18490],{"class":3948,"line":6512},[3946,18491,5550],{"class":3952},[3946,18493,18494],{"class":3948,"line":6530},[3946,18495,4278],{"emptyLinePlaceholder":4277},[3946,18497,18498,18500,18502,18504,18506,18508,18510],{"class":3948,"line":6545},[3946,18499,4603],{"class":4251},[3946,18501,7377],{"class":4255},[3946,18503,4298],{"class":3952},[3946,18505,14969],{"class":4262},[3946,18507,4298],{"class":3952},[3946,18509,10509],{"class":4262},[3946,18511,4272],{"class":3952},[3946,18513,18514],{"class":3948,"line":6550},[3946,18515,4521],{"class":3952},[3946,18517,18518],{"class":3948,"line":6555},[3946,18519,4040],{"class":3952},[3946,18521,18522],{"class":3948,"line":6560},[3946,18523,4278],{"emptyLinePlaceholder":4277},[3946,18525,18526,18528,18530,18532,18534,18536,18538],{"class":3948,"line":6566},[3946,18527,4283],{"class":4255},[3946,18529,13210],{"class":4286},[3946,18531,4290],{"class":3952},[3946,18533,12936],{"class":4262},[3946,18535,4298],{"class":3952},[3946,18537,8509],{"class":4224},[3946,18539,8512],{"class":3952},[3946,18541,18542,18544],{"class":3948,"line":6571},[3946,18543,15568],{"class":4262},[3946,18545,4427],{"class":3952},[3946,18547,18548,18550,18552],{"class":3948,"line":6588},[3946,18549,13232],{"class":4262},[3946,18551,13235],{"class":4020},[3946,18553,3970],{"class":3952},[3946,18555,18556,18558,18560],{"class":3948,"line":6597},[3946,18557,13242],{"class":4262},[3946,18559,13245],{"class":3966},[3946,18561,3970],{"class":3952},[3946,18563,18564,18566,18568],{"class":3948,"line":6609},[3946,18565,13252],{"class":4262},[3946,18567,13245],{"class":3966},[3946,18569,3970],{"class":3952},[3946,18571,18572,18574,18576],{"class":3948,"line":6640},[3946,18573,15599],{"class":4262},[3946,18575,15602],{"class":4020},[3946,18577,3970],{"class":3952},[3946,18579,18580,18582,18584],{"class":3948,"line":6653},[3946,18581,13261],{"class":4262},[3946,18583,13264],{"class":3966},[3946,18585,3970],{"class":3952},[3946,18587,18588],{"class":3948,"line":6659},[3946,18589,13271],{"class":3952},[3946,18591,18592,18594],{"class":3948,"line":6671},[3946,18593,15621],{"class":4262},[3946,18595,4427],{"class":3952},[3946,18597,18598,18600,18602],{"class":3948,"line":6689},[3946,18599,15628],{"class":4262},[3946,18601,15631],{"class":4020},[3946,18603,3970],{"class":3952},[3946,18605,18606,18608,18610],{"class":3948,"line":6694},[3946,18607,15638],{"class":4262},[3946,18609,15641],{"class":3966},[3946,18611,3970],{"class":3952},[3946,18613,18614,18616,18619],{"class":3948,"line":6699},[3946,18615,15648],{"class":4262},[3946,18617,18618],{"class":3966}," '#FF3B30'",[3946,18620,3970],{"class":3952},[3946,18622,18623,18625,18627],{"class":3948,"line":6704},[3946,18624,15658],{"class":4262},[3946,18626,15661],{"class":4020},[3946,18628,3970],{"class":3952},[3946,18630,18631],{"class":3948,"line":6709},[3946,18632,13271],{"class":3952},[3946,18634,18635,18637],{"class":3948,"line":6715},[3946,18636,15672],{"class":4262},[3946,18638,4427],{"class":3952},[3946,18640,18641,18643,18645],{"class":3948,"line":6720},[3946,18642,15628],{"class":4262},[3946,18644,15681],{"class":4020},[3946,18646,3970],{"class":3952},[3946,18648,18649,18651,18653],{"class":3948,"line":6732},[3946,18650,15648],{"class":4262},[3946,18652,15690],{"class":3966},[3946,18654,3970],{"class":3952},[3946,18656,18657,18659,18661],{"class":3948,"line":6743},[3946,18658,15697],{"class":4262},[3946,18660,13245],{"class":3966},[3946,18662,3970],{"class":3952},[3946,18664,18665,18667,18669],{"class":3948,"line":6754},[3946,18666,15658],{"class":4262},[3946,18668,15631],{"class":4020},[3946,18670,3970],{"class":3952},[3946,18672,18673],{"class":3948,"line":6768},[3946,18674,13271],{"class":3952},[3946,18676,18677,18679],{"class":3948,"line":7572},[3946,18678,15718],{"class":4262},[3946,18680,4427],{"class":3952},[3946,18682,18683,18685,18687],{"class":3948,"line":7590},[3946,18684,13261],{"class":4262},[3946,18686,15727],{"class":3966},[3946,18688,3970],{"class":3952},[3946,18690,18691,18693,18695],{"class":3948,"line":7609},[3946,18692,15734],{"class":4262},[3946,18694,15631],{"class":4020},[3946,18696,3970],{"class":3952},[3946,18698,18699,18701,18703],{"class":3948,"line":7615},[3946,18700,15743],{"class":4262},[3946,18702,15661],{"class":4020},[3946,18704,3970],{"class":3952},[3946,18706,18707,18709,18711],{"class":3948,"line":7633},[3946,18708,15752],{"class":4262},[3946,18710,15755],{"class":4020},[3946,18712,3970],{"class":3952},[3946,18714,18715],{"class":3948,"line":7638},[3946,18716,13271],{"class":3952},[3946,18718,18719,18721],{"class":3948,"line":7644},[3946,18720,15766],{"class":4262},[3946,18722,4427],{"class":3952},[3946,18724,18725,18727,18729],{"class":3948,"line":7677},[3946,18726,15648],{"class":4262},[3946,18728,13264],{"class":3966},[3946,18730,3970],{"class":3952},[3946,18732,18733,18735,18737],{"class":3948,"line":7682},[3946,18734,15628],{"class":4262},[3946,18736,15681],{"class":4020},[3946,18738,3970],{"class":3952},[3946,18740,18741,18743,18745],{"class":3948,"line":7694},[3946,18742,15638],{"class":4262},[3946,18744,15791],{"class":3966},[3946,18746,3970],{"class":3952},[3946,18748,18749],{"class":3948,"line":7710},[3946,18750,13271],{"class":3952},[3946,18752,18753],{"class":3948,"line":7715},[3946,18754,13276],{"class":3952},[3811,18756],{},[3738,18758,18760],{"id":18759},"розділ-7-міні-проєкт-секретні-нотатки","Розділ 7: Міні-Проєкт \"Секретні Нотатки\"",[3750,18762,18764],{"id":18763},"_71-огляд-проєкту","7.1. Огляд Проєкту",[3743,18766,18767,18770],{},[3771,18768,18769],{},"Секретні Нотатки"," — це повнофункціональний мобільний додаток для зберігання приватних нотаток з системою автентифікації.",[3743,18772,18773],{},[3771,18774,18775],{},"Ключові функції:",[3878,18777,18778,18781,18784,18787,18790,18793,18796],{},[3768,18779,18780],{},"🔐 Автентифікація (login\u002Fregister) з JWT токенами",[3768,18782,18783],{},"💾 Зберігання токенів у SecureStore",[3768,18785,18786],{},"📝 CRUD операції з нотатками",[3768,18788,18789],{},"🔒 Захищені маршрути",[3768,18791,18792],{},"🔄 Автоматичне відновлення сесії",[3768,18794,18795],{},"⚡ Обробка 401\u002F403 помилок",[3768,18797,18798],{},"🎨 Сучасний UI з React Native",[3743,18800,18801],{},[3771,18802,18803],{},"Технологічний стек:",[3878,18805,18806,18809,18811,18814,18817,18819],{},[3768,18807,18808],{},"React Native + Expo",[3768,18810,2325],{},[3768,18812,18813],{},"React Navigation 6",[3768,18815,18816],{},"Axios для HTTP",[3768,18818,3784],{},[3768,18820,18821],{},"Context API для стану",[3750,18823,18825],{"id":18824},"_72-структура-проєкту","7.2. Структура Проєкту",[3857,18827,18830],{"className":18828,"code":18829,"language":3862},[3860],"SecureNotesApp\u002F\n├── src\u002F\n│   ├── features\u002F\n│   │   ├── auth\u002F\n│   │   │   ├── api\u002F\n│   │   │   │   └── authApi.ts\n│   │   │   ├── components\u002F\n│   │   │   │   ├── AuthErrorBoundary.tsx\n│   │   │   │   └── ProtectedRoute.tsx\n│   │   │   ├── context\u002F\n│   │   │   │   └── AuthContext.tsx\n│   │   │   ├── hooks\u002F\n│   │   │   │   ├── useAuth.ts\n│   │   │   │   └── useTokenRefresh.ts\n│   │   │   ├── screens\u002F\n│   │   │   │   ├── LoginScreen.tsx\n│   │   │   │   └── RegisterScreen.tsx\n│   │   │   ├── services\u002F\n│   │   │   │   └── tokenService.ts\n│   │   │   └── types\u002F\n│   │   │       └── auth.types.ts\n│   │   └── notes\u002F\n│   │       ├── api\u002F\n│   │       │   └── notesApi.ts\n│   │       ├── components\u002F\n│   │       │   ├── NoteCard.tsx\n│   │       │   └── NoteForm.tsx\n│   │       ├── screens\u002F\n│   │       │   ├── NotesListScreen.tsx\n│   │       │   ├── NoteDetailScreen.tsx\n│   │       │   └── CreateNoteScreen.tsx\n│   │       └── types\u002F\n│   │           └── note.types.ts\n│   ├── navigation\u002F\n│   │   ├── AuthNavigator.tsx\n│   │   ├── AppNavigator.tsx\n│   │   └── RootNavigator.tsx\n│   ├── shared\u002F\n│   │   ├── components\u002F\n│   │   │   ├── Button.tsx\n│   │   │   ├── Input.tsx\n│   │   │   └── LoadingOverlay.tsx\n│   │   └── constants\u002F\n│   │       └── theme.ts\n│   └── App.tsx\n├── app.json\n├── package.json\n└── tsconfig.json\n",[3782,18831,18829],{"__ignoreMap":3865},[3750,18833,18835],{"id":18834},"_73-налаштування-backend-mock-json-server","7.3. Налаштування Backend Mock (JSON Server)",[3743,18837,18838],{},"Для швидкого прототипування створимо простий mock backend:",[3743,18840,18841],{},[3771,18842,4212],{},[3857,18844,18846],{"className":4215,"code":18845,"language":4217,"meta":3865,"style":3865},"npm install -g json-server\nnpm install --save-dev @types\u002Fjson-server\n",[3782,18847,18848,18861],{"__ignoreMap":3865},[3946,18849,18850,18853,18855,18858],{"class":3948,"line":3949},[3946,18851,18852],{"class":4224},"npm",[3946,18854,4231],{"class":3966},[3946,18856,18857],{"class":4255}," -g",[3946,18859,18860],{"class":3966}," json-server\n",[3946,18862,18863,18865,18867,18870],{"class":3948,"line":3956},[3946,18864,18852],{"class":4224},[3946,18866,4231],{"class":3966},[3946,18868,18869],{"class":4255}," --save-dev",[3946,18871,18872],{"class":3966}," @types\u002Fjson-server\n",[3743,18874,18875],{},[3771,18876,18877,18878,8545],{},"Створення ",[3782,18879,18880],{},"db.json",[3857,18882,18884],{"className":3940,"code":18883,"language":3942,"meta":3865,"style":3865},"{\n  \"users\": [\n    {\n      \"id\": \"1\",\n      \"email\": \"demo@example.com\",\n      \"password\": \"password123\",\n      \"name\": \"Demo User\",\n      \"role\": \"user\"\n    }\n  ],\n  \"notes\": [\n    {\n      \"id\": \"1\",\n      \"userId\": \"1\",\n      \"title\": \"Перша нотатка\",\n      \"content\": \"Це секретна нотатка!\",\n      \"createdAt\": \"2024-01-15T10:00:00Z\",\n      \"updatedAt\": \"2024-01-15T10:00:00Z\"\n    }\n  ]\n}\n",[3782,18885,18886,18890,18898,18903,18915,18927,18939,18951,18961,18965,18970,18977,18981,18991,19002,19014,19026,19038,19048,19052,19057],{"__ignoreMap":3865},[3946,18887,18888],{"class":3948,"line":3949},[3946,18889,3953],{"class":3952},[3946,18891,18892,18895],{"class":3948,"line":3956},[3946,18893,18894],{"class":3959},"  \"users\"",[3946,18896,18897],{"class":3952},": [\n",[3946,18899,18900],{"class":3948,"line":3973},[3946,18901,18902],{"class":3952},"    {\n",[3946,18904,18905,18908,18910,18913],{"class":3948,"line":3986},[3946,18906,18907],{"class":3959},"      \"id\"",[3946,18909,3963],{"class":3952},[3946,18911,18912],{"class":3966},"\"1\"",[3946,18914,3970],{"class":3952},[3946,18916,18917,18920,18922,18925],{"class":3948,"line":3999},[3946,18918,18919],{"class":3959},"      \"email\"",[3946,18921,3963],{"class":3952},[3946,18923,18924],{"class":3966},"\"demo@example.com\"",[3946,18926,3970],{"class":3952},[3946,18928,18929,18932,18934,18937],{"class":3948,"line":4012},[3946,18930,18931],{"class":3959},"      \"password\"",[3946,18933,3963],{"class":3952},[3946,18935,18936],{"class":3966},"\"password123\"",[3946,18938,3970],{"class":3952},[3946,18940,18941,18944,18946,18949],{"class":3948,"line":4026},[3946,18942,18943],{"class":3959},"      \"name\"",[3946,18945,3963],{"class":3952},[3946,18947,18948],{"class":3966},"\"Demo User\"",[3946,18950,3970],{"class":3952},[3946,18952,18953,18956,18958],{"class":3948,"line":4037},[3946,18954,18955],{"class":3959},"      \"role\"",[3946,18957,3963],{"class":3952},[3946,18959,18960],{"class":3966},"\"user\"\n",[3946,18962,18963],{"class":3948,"line":4487},[3946,18964,5550],{"class":3952},[3946,18966,18967],{"class":3948,"line":4507},[3946,18968,18969],{"class":3952},"  ],\n",[3946,18971,18972,18975],{"class":3948,"line":4518},[3946,18973,18974],{"class":3959},"  \"notes\"",[3946,18976,18897],{"class":3952},[3946,18978,18979],{"class":3948,"line":4524},[3946,18980,18902],{"class":3952},[3946,18982,18983,18985,18987,18989],{"class":3948,"line":4529},[3946,18984,18907],{"class":3959},[3946,18986,3963],{"class":3952},[3946,18988,18912],{"class":3966},[3946,18990,3970],{"class":3952},[3946,18992,18993,18996,18998,19000],{"class":3948,"line":4534},[3946,18994,18995],{"class":3959},"      \"userId\"",[3946,18997,3963],{"class":3952},[3946,18999,18912],{"class":3966},[3946,19001,3970],{"class":3952},[3946,19003,19004,19007,19009,19012],{"class":3948,"line":4540},[3946,19005,19006],{"class":3959},"      \"title\"",[3946,19008,3963],{"class":3952},[3946,19010,19011],{"class":3966},"\"Перша нотатка\"",[3946,19013,3970],{"class":3952},[3946,19015,19016,19019,19021,19024],{"class":3948,"line":4567},[3946,19017,19018],{"class":3959},"      \"content\"",[3946,19020,3963],{"class":3952},[3946,19022,19023],{"class":3966},"\"Це секретна нотатка!\"",[3946,19025,3970],{"class":3952},[3946,19027,19028,19031,19033,19036],{"class":3948,"line":4574},[3946,19029,19030],{"class":3959},"      \"createdAt\"",[3946,19032,3963],{"class":3952},[3946,19034,19035],{"class":3966},"\"2024-01-15T10:00:00Z\"",[3946,19037,3970],{"class":3952},[3946,19039,19040,19043,19045],{"class":3948,"line":4600},[3946,19041,19042],{"class":3959},"      \"updatedAt\"",[3946,19044,3963],{"class":3952},[3946,19046,19047],{"class":3966},"\"2024-01-15T10:00:00Z\"\n",[3946,19049,19050],{"class":3948,"line":4610},[3946,19051,5550],{"class":3952},[3946,19053,19054],{"class":3948,"line":4623},[3946,19055,19056],{"class":3952},"  ]\n",[3946,19058,19059],{"class":3948,"line":4643},[3946,19060,4040],{"class":3952},[3743,19062,19063],{},[3771,19064,19065,19066,19069],{},"Custom routes (",[3782,19067,19068],{},"routes.json","):",[3857,19071,19073],{"className":3940,"code":19072,"language":3942,"meta":3865,"style":3865},"{\n  \"\u002Fapi\u002F*\": \"\u002F$1\",\n  \"\u002Fapi\u002Fauth\u002Flogin\": \"\u002Flogin\",\n  \"\u002Fapi\u002Fauth\u002Fregister\": \"\u002Fregister\",\n  \"\u002Fapi\u002Fauth\u002Fme\": \"\u002Fusers\u002F1\",\n  \"\u002Fapi\u002Fnotes\": \"\u002Fnotes\",\n  \"\u002Fapi\u002Fnotes\u002F:id\": \"\u002Fnotes\u002F:id\"\n}\n",[3782,19074,19075,19079,19091,19103,19115,19127,19139,19149],{"__ignoreMap":3865},[3946,19076,19077],{"class":3948,"line":3949},[3946,19078,3953],{"class":3952},[3946,19080,19081,19084,19086,19089],{"class":3948,"line":3956},[3946,19082,19083],{"class":3959},"  \"\u002Fapi\u002F*\"",[3946,19085,3963],{"class":3952},[3946,19087,19088],{"class":3966},"\"\u002F$1\"",[3946,19090,3970],{"class":3952},[3946,19092,19093,19096,19098,19101],{"class":3948,"line":3973},[3946,19094,19095],{"class":3959},"  \"\u002Fapi\u002Fauth\u002Flogin\"",[3946,19097,3963],{"class":3952},[3946,19099,19100],{"class":3966},"\"\u002Flogin\"",[3946,19102,3970],{"class":3952},[3946,19104,19105,19108,19110,19113],{"class":3948,"line":3986},[3946,19106,19107],{"class":3959},"  \"\u002Fapi\u002Fauth\u002Fregister\"",[3946,19109,3963],{"class":3952},[3946,19111,19112],{"class":3966},"\"\u002Fregister\"",[3946,19114,3970],{"class":3952},[3946,19116,19117,19120,19122,19125],{"class":3948,"line":3999},[3946,19118,19119],{"class":3959},"  \"\u002Fapi\u002Fauth\u002Fme\"",[3946,19121,3963],{"class":3952},[3946,19123,19124],{"class":3966},"\"\u002Fusers\u002F1\"",[3946,19126,3970],{"class":3952},[3946,19128,19129,19132,19134,19137],{"class":3948,"line":4012},[3946,19130,19131],{"class":3959},"  \"\u002Fapi\u002Fnotes\"",[3946,19133,3963],{"class":3952},[3946,19135,19136],{"class":3966},"\"\u002Fnotes\"",[3946,19138,3970],{"class":3952},[3946,19140,19141,19144,19146],{"class":3948,"line":4026},[3946,19142,19143],{"class":3959},"  \"\u002Fapi\u002Fnotes\u002F:id\"",[3946,19145,3963],{"class":3952},[3946,19147,19148],{"class":3966},"\"\u002Fnotes\u002F:id\"\n",[3946,19150,19151],{"class":3948,"line":4037},[3946,19152,4040],{"class":3952},[3743,19154,19155],{},[3771,19156,19157],{},"Запуск:",[3857,19159,19161],{"className":4215,"code":19160,"language":4217,"meta":3865,"style":3865},"json-server --watch db.json --routes routes.json --port 3000\n",[3782,19162,19163],{"__ignoreMap":3865},[3946,19164,19165,19168,19171,19174,19177,19180,19183],{"class":3948,"line":3949},[3946,19166,19167],{"class":4224},"json-server",[3946,19169,19170],{"class":4255}," --watch",[3946,19172,19173],{"class":3966}," db.json",[3946,19175,19176],{"class":4255}," --routes",[3946,19178,19179],{"class":3966}," routes.json",[3946,19181,19182],{"class":4255}," --port",[3946,19184,19185],{"class":4020}," 3000\n",[3743,19187,19188],{},[3771,19189,19190],{},"Або використаємо кастомний сервер:",[3857,19192,19194],{"className":4242,"code":19193,"language":4244,"meta":3865,"style":3865},"\u002F\u002F server\u002Findex.ts\nimport express, { Request, Response } from 'express';\nimport jwt from 'jsonwebtoken';\nimport bodyParser from 'body-parser';\n\nconst app = express();\nconst PORT = 3000;\nconst SECRET_KEY = 'your-secret-key-change-in-production';\n\n\u002F\u002F Middleware\napp.use(bodyParser.json());\n\n\u002F\u002F In-memory database\nconst users = [\n  {\n    id: '1',\n    email: 'demo@example.com',\n    password: 'password123', \u002F\u002F В реальності — хешований!\n    name: 'Demo User',\n    role: 'user',\n  },\n];\n\nconst notes = [\n  {\n    id: '1',\n    userId: '1',\n    title: 'Перша нотатка',\n    content: 'Це моя секретна нотатка!',\n    createdAt: new Date().toISOString(),\n    updatedAt: new Date().toISOString(),\n  },\n];\n\n\u002F\u002F Auth middleware\nfunction authenticateToken(req: Request, res: Response, next: Function) {\n  const authHeader = req.headers['authorization'];\n  const token = authHeader && authHeader.split(' ')[1];\n\n  if (!token) {\n    return res.status(401).json({ message: 'Токен не надано' });\n  }\n\n  jwt.verify(token, SECRET_KEY, (err: any, user: any) => {\n    if (err) {\n      return res.status(401).json({ message: 'Невалідний токен' });\n    }\n    req.user = user;\n    next();\n  });\n}\n\n\u002F\u002F Routes\napp.post('\u002Fapi\u002Fauth\u002Flogin', (req: Request, res: Response) => {\n  const { email, password } = req.body;\n\n  const user = users.find((u) => u.email === email && u.password === password);\n\n  if (!user) {\n    return res.status(401).json({ message: 'Невірний email або пароль' });\n  }\n\n  const accessToken = jwt.sign(\n    { userId: user.id, email: user.email },\n    SECRET_KEY,\n    { expiresIn: '1h' }\n  );\n\n  const refreshToken = jwt.sign(\n    { userId: user.id, email: user.email },\n    SECRET_KEY,\n    { expiresIn: '7d' }\n  );\n\n  res.json({\n    user: {\n      id: user.id,\n      email: user.email,\n      name: user.name,\n      role: user.role,\n    },\n    accessToken,\n    refreshToken,\n    expiresIn: 3600,\n  });\n});\n\napp.post('\u002Fapi\u002Fauth\u002Fregister', (req: Request, res: Response) => {\n  const { email, password, name } = req.body;\n\n  if (users.find((u) => u.email === email)) {\n    return res.status(409).json({ message: 'Користувач вже існує' });\n  }\n\n  const newUser = {\n    id: String(users.length + 1),\n    email,\n    password, \u002F\u002F В реальності — хешувати!\n    name,\n    role: 'user' as const,\n  };\n\n  users.push(newUser);\n\n  const accessToken = jwt.sign(\n    { userId: newUser.id, email: newUser.email },\n    SECRET_KEY,\n    { expiresIn: '1h' }\n  );\n\n  const refreshToken = jwt.sign(\n    { userId: newUser.id, email: newUser.email },\n    SECRET_KEY,\n    { expiresIn: '7d' }\n  );\n\n  res.status(201).json({\n    user: {\n      id: newUser.id,\n      email: newUser.email,\n      name: newUser.name,\n      role: newUser.role,\n    },\n    accessToken,\n    refreshToken,\n    expiresIn: 3600,\n  });\n});\n\napp.get('\u002Fapi\u002Fauth\u002Fme', authenticateToken, (req: Request, res: Response) => {\n  const user = users.find((u) => u.id === req.user.userId);\n  \n  if (!user) {\n    return res.status(404).json({ message: 'Користувача не знайдено' });\n  }\n\n  res.json({\n    id: user.id,\n    email: user.email,\n    name: user.name,\n    role: user.role,\n  });\n});\n\napp.get('\u002Fapi\u002Fnotes', authenticateToken, (req: Request, res: Response) => {\n  const userNotes = notes.filter((note) => note.userId === req.user.userId);\n  res.json(userNotes);\n});\n\napp.post('\u002Fapi\u002Fnotes', authenticateToken, (req: Request, res: Response) => {\n  const { title, content } = req.body;\n\n  const newNote = {\n    id: String(notes.length + 1),\n    userId: req.user.userId,\n    title,\n    content,\n    createdAt: new Date().toISOString(),\n    updatedAt: new Date().toISOString(),\n  };\n\n  notes.push(newNote);\n  res.status(201).json(newNote);\n});\n\napp.listen(PORT, () => {\n  console.log(`✅ Server running on http:\u002F\u002Flocalhost:${PORT}`);\n});\n",[3782,19195,19196,19201,19227,19241,19255,19259,19273,19287,19301,19305,19310,19331,19335,19340,19350,19355,19365,19375,19388,19398,19408,19412,19417,19421,19430,19434,19442,19451,19461,19471,19489,19504,19508,19512,19516,19521,19558,19581,19613,19617,19627,19657,19661,19665,19709,19719,19746,19750,19765,19772,19776,19780,19784,19789,19824,19848,19852,19902,19906,19916,19943,19947,19951,19970,19999,20006,20018,20022,20026,20042,20066,20072,20083,20087,20091,20102,20108,20121,20134,20147,20160,20164,20170,20176,20186,20190,20194,20198,20233,20259,20263,20295,20323,20327,20331,20340,20363,20370,20380,20387,20399,20403,20407,20424,20428,20444,20468,20474,20484,20488,20492,20508,20532,20538,20548,20552,20556,20575,20581,20593,20605,20617,20629,20633,20639,20645,20653,20657,20661,20665,20705,20748,20752,20762,20790,20794,20798,20808,20820,20832,20844,20856,20860,20864,20868,20907,20954,20969,20973,20977,21015,21038,21042,21051,21071,21088,21095,21102,21116,21130,21134,21138,21154,21176,21180,21184,21205,21228],{"__ignoreMap":3865},[3946,19197,19198],{"class":3948,"line":3949},[3946,19199,19200],{"class":4342},"\u002F\u002F server\u002Findex.ts\n",[3946,19202,19203,19205,19208,19210,19213,19215,19218,19220,19222,19225],{"class":3948,"line":3956},[3946,19204,4252],{"class":4251},[3946,19206,19207],{"class":4262}," express",[3946,19209,8290],{"class":3952},[3946,19211,19212],{"class":4262},"Request",[3946,19214,4447],{"class":3952},[3946,19216,19217],{"class":4262},"Response",[3946,19219,6823],{"class":3952},[3946,19221,6826],{"class":4251},[3946,19223,19224],{"class":3966}," 'express'",[3946,19226,4272],{"class":3952},[3946,19228,19229,19231,19234,19236,19239],{"class":3948,"line":3973},[3946,19230,4252],{"class":4251},[3946,19232,19233],{"class":4262}," jwt",[3946,19235,4266],{"class":4251},[3946,19237,19238],{"class":3966}," 'jsonwebtoken'",[3946,19240,4272],{"class":3952},[3946,19242,19243,19245,19248,19250,19253],{"class":3948,"line":3986},[3946,19244,4252],{"class":4251},[3946,19246,19247],{"class":4262}," bodyParser",[3946,19249,4266],{"class":4251},[3946,19251,19252],{"class":3966}," 'body-parser'",[3946,19254,4272],{"class":3952},[3946,19256,19257],{"class":3948,"line":3999},[3946,19258,4278],{"emptyLinePlaceholder":4277},[3946,19260,19261,19263,19266,19268,19271],{"class":3948,"line":4012},[3946,19262,4283],{"class":4255},[3946,19264,19265],{"class":4286}," app",[3946,19267,4290],{"class":3952},[3946,19269,19270],{"class":4224},"express",[3946,19272,4304],{"class":3952},[3946,19274,19275,19277,19280,19282,19285],{"class":3948,"line":4026},[3946,19276,4283],{"class":4255},[3946,19278,19279],{"class":4286}," PORT",[3946,19281,4290],{"class":3952},[3946,19283,19284],{"class":4020},"3000",[3946,19286,4272],{"class":3952},[3946,19288,19289,19291,19294,19296,19299],{"class":3948,"line":4037},[3946,19290,4283],{"class":4255},[3946,19292,19293],{"class":4286}," SECRET_KEY",[3946,19295,4290],{"class":3952},[3946,19297,19298],{"class":3966},"'your-secret-key-change-in-production'",[3946,19300,4272],{"class":3952},[3946,19302,19303],{"class":3948,"line":4487},[3946,19304,4278],{"emptyLinePlaceholder":4277},[3946,19306,19307],{"class":3948,"line":4507},[3946,19308,19309],{"class":4342},"\u002F\u002F Middleware\n",[3946,19311,19312,19315,19317,19319,19321,19324,19326,19328],{"class":3948,"line":4518},[3946,19313,19314],{"class":4262},"app",[3946,19316,4298],{"class":3952},[3946,19318,8592],{"class":4224},[3946,19320,4331],{"class":3952},[3946,19322,19323],{"class":4262},"bodyParser",[3946,19325,4298],{"class":3952},[3946,19327,3942],{"class":4224},[3946,19329,19330],{"class":3952},"());\n",[3946,19332,19333],{"class":3948,"line":4524},[3946,19334,4278],{"emptyLinePlaceholder":4277},[3946,19336,19337],{"class":3948,"line":4529},[3946,19338,19339],{"class":4342},"\u002F\u002F In-memory database\n",[3946,19341,19342,19344,19347],{"class":3948,"line":4534},[3946,19343,4283],{"class":4255},[3946,19345,19346],{"class":4286}," users",[3946,19348,19349],{"class":3952}," = [\n",[3946,19351,19352],{"class":3948,"line":4540},[3946,19353,19354],{"class":3952},"  {\n",[3946,19356,19357,19360,19363],{"class":3948,"line":4567},[3946,19358,19359],{"class":4262},"    id:",[3946,19361,19362],{"class":3966}," '1'",[3946,19364,3970],{"class":3952},[3946,19366,19367,19370,19373],{"class":3948,"line":4574},[3946,19368,19369],{"class":4262},"    email:",[3946,19371,19372],{"class":3966}," 'demo@example.com'",[3946,19374,3970],{"class":3952},[3946,19376,19377,19380,19383,19385],{"class":3948,"line":4600},[3946,19378,19379],{"class":4262},"    password:",[3946,19381,19382],{"class":3966}," 'password123'",[3946,19384,4447],{"class":3952},[3946,19386,19387],{"class":4342},"\u002F\u002F В реальності — хешований!\n",[3946,19389,19390,19393,19396],{"class":3948,"line":4610},[3946,19391,19392],{"class":4262},"    name:",[3946,19394,19395],{"class":3966}," 'Demo User'",[3946,19397,3970],{"class":3952},[3946,19399,19400,19403,19406],{"class":3948,"line":4623},[3946,19401,19402],{"class":4262},"    role:",[3946,19404,19405],{"class":3966}," 'user'",[3946,19407,3970],{"class":3952},[3946,19409,19410],{"class":3948,"line":4643},[3946,19411,13271],{"class":3952},[3946,19413,19414],{"class":3948,"line":4653},[3946,19415,19416],{"class":3952},"];\n",[3946,19418,19419],{"class":3948,"line":4658},[3946,19420,4278],{"emptyLinePlaceholder":4277},[3946,19422,19423,19425,19428],{"class":3948,"line":4663},[3946,19424,4283],{"class":4255},[3946,19426,19427],{"class":4286}," notes",[3946,19429,19349],{"class":3952},[3946,19431,19432],{"class":3948,"line":4668},[3946,19433,19354],{"class":3952},[3946,19435,19436,19438,19440],{"class":3948,"line":4674},[3946,19437,19359],{"class":4262},[3946,19439,19362],{"class":3966},[3946,19441,3970],{"class":3952},[3946,19443,19444,19447,19449],{"class":3948,"line":4694},[3946,19445,19446],{"class":4262},"    userId:",[3946,19448,19362],{"class":3966},[3946,19450,3970],{"class":3952},[3946,19452,19453,19456,19459],{"class":3948,"line":4701},[3946,19454,19455],{"class":4262},"    title:",[3946,19457,19458],{"class":3966}," 'Перша нотатка'",[3946,19460,3970],{"class":3952},[3946,19462,19463,19466,19469],{"class":3948,"line":4719},[3946,19464,19465],{"class":4262},"    content:",[3946,19467,19468],{"class":3966}," 'Це моя секретна нотатка!'",[3946,19470,3970],{"class":3952},[3946,19472,19473,19476,19478,19480,19483,19486],{"class":3948,"line":4735},[3946,19474,19475],{"class":4262},"    createdAt:",[3946,19477,7150],{"class":4255},[3946,19479,7015],{"class":4224},[3946,19481,19482],{"class":3952},"().",[3946,19484,19485],{"class":4224},"toISOString",[3946,19487,19488],{"class":3952},"(),\n",[3946,19490,19491,19494,19496,19498,19500,19502],{"class":3948,"line":4748},[3946,19492,19493],{"class":4262},"    updatedAt:",[3946,19495,7150],{"class":4255},[3946,19497,7015],{"class":4224},[3946,19499,19482],{"class":3952},[3946,19501,19485],{"class":4224},[3946,19503,19488],{"class":3952},[3946,19505,19506],{"class":3948,"line":4768},[3946,19507,13271],{"class":3952},[3946,19509,19510],{"class":3948,"line":4777},[3946,19511,19416],{"class":3952},[3946,19513,19514],{"class":3948,"line":4782},[3946,19515,4278],{"emptyLinePlaceholder":4277},[3946,19517,19518],{"class":3948,"line":6262},[3946,19519,19520],{"class":4342},"\u002F\u002F Auth middleware\n",[3946,19522,19523,19525,19528,19530,19533,19535,19537,19539,19542,19544,19546,19548,19551,19553,19556],{"class":3948,"line":6273},[3946,19524,14029],{"class":4255},[3946,19526,19527],{"class":4224}," authenticateToken",[3946,19529,4331],{"class":3952},[3946,19531,19532],{"class":4262},"req",[3946,19534,3963],{"class":3952},[3946,19536,19212],{"class":4403},[3946,19538,4447],{"class":3952},[3946,19540,19541],{"class":4262},"res",[3946,19543,3963],{"class":3952},[3946,19545,19217],{"class":4403},[3946,19547,4447],{"class":3952},[3946,19549,19550],{"class":4224},"next",[3946,19552,3963],{"class":3952},[3946,19554,19555],{"class":4403},"Function",[3946,19557,4318],{"class":3952},[3946,19559,19560,19562,19565,19567,19569,19571,19573,19576,19579],{"class":3948,"line":6284},[3946,19561,5018],{"class":4255},[3946,19563,19564],{"class":4286}," authHeader",[3946,19566,4290],{"class":3952},[3946,19568,19532],{"class":4262},[3946,19570,4298],{"class":3952},[3946,19572,8656],{"class":4262},[3946,19574,19575],{"class":3952},"[",[3946,19577,19578],{"class":3966},"'authorization'",[3946,19580,19416],{"class":3952},[3946,19582,19583,19585,19587,19589,19592,19594,19596,19598,19601,19603,19605,19608,19611],{"class":3948,"line":6299},[3946,19584,5018],{"class":4255},[3946,19586,4580],{"class":4286},[3946,19588,4290],{"class":3952},[3946,19590,19591],{"class":4262},"authHeader",[3946,19593,15293],{"class":3952},[3946,19595,19591],{"class":4262},[3946,19597,4298],{"class":3952},[3946,19599,19600],{"class":4224},"split",[3946,19602,4331],{"class":3952},[3946,19604,15406],{"class":3966},[3946,19606,19607],{"class":3952},")[",[3946,19609,19610],{"class":4020},"1",[3946,19612,19416],{"class":3952},[3946,19614,19615],{"class":3948,"line":6304},[3946,19616,4278],{"emptyLinePlaceholder":4277},[3946,19618,19619,19621,19623,19625],{"class":3948,"line":6309},[3946,19620,5776],{"class":4251},[3946,19622,4312],{"class":3952},[3946,19624,4398],{"class":4262},[3946,19626,4318],{"class":3952},[3946,19628,19629,19631,19634,19636,19638,19640,19642,19645,19647,19649,19652,19655],{"class":3948,"line":6314},[3946,19630,4603],{"class":4251},[3946,19632,19633],{"class":4262}," res",[3946,19635,4298],{"class":3952},[3946,19637,8813],{"class":4224},[3946,19639,4331],{"class":3952},[3946,19641,8819],{"class":4020},[3946,19643,19644],{"class":3952},").",[3946,19646,3942],{"class":4224},[3946,19648,10506],{"class":3952},[3946,19650,19651],{"class":4262},"message:",[3946,19653,19654],{"class":3966}," 'Токен не надано'",[3946,19656,10726],{"class":3952},[3946,19658,19659],{"class":3948,"line":6320},[3946,19660,4521],{"class":3952},[3946,19662,19663],{"class":3948,"line":6325},[3946,19664,4278],{"emptyLinePlaceholder":4277},[3946,19666,19667,19670,19672,19675,19677,19679,19681,19684,19687,19690,19692,19695,19697,19699,19701,19703,19705,19707],{"class":3948,"line":6337},[3946,19668,19669],{"class":4262},"  jwt",[3946,19671,4298],{"class":3952},[3946,19673,19674],{"class":4224},"verify",[3946,19676,4331],{"class":3952},[3946,19678,4398],{"class":4262},[3946,19680,4447],{"class":3952},[3946,19682,19683],{"class":4286},"SECRET_KEY",[3946,19685,19686],{"class":3952},", (",[3946,19688,19689],{"class":4262},"err",[3946,19691,3963],{"class":3952},[3946,19693,19694],{"class":4403},"any",[3946,19696,4447],{"class":3952},[3946,19698,10775],{"class":4262},[3946,19700,3963],{"class":3952},[3946,19702,19694],{"class":4403},[3946,19704,5783],{"class":3952},[3946,19706,6453],{"class":4255},[3946,19708,4427],{"class":3952},[3946,19710,19711,19713,19715,19717],{"class":3948,"line":6352},[3946,19712,5503],{"class":4251},[3946,19714,4479],{"class":3952},[3946,19716,19689],{"class":4262},[3946,19718,4318],{"class":3952},[3946,19720,19721,19723,19725,19727,19729,19731,19733,19735,19737,19739,19741,19744],{"class":3948,"line":6364},[3946,19722,7405],{"class":4251},[3946,19724,19633],{"class":4262},[3946,19726,4298],{"class":3952},[3946,19728,8813],{"class":4224},[3946,19730,4331],{"class":3952},[3946,19732,8819],{"class":4020},[3946,19734,19644],{"class":3952},[3946,19736,3942],{"class":4224},[3946,19738,10506],{"class":3952},[3946,19740,19651],{"class":4262},[3946,19742,19743],{"class":3966}," 'Невалідний токен'",[3946,19745,10726],{"class":3952},[3946,19747,19748],{"class":3948,"line":6376},[3946,19749,5550],{"class":3952},[3946,19751,19752,19755,19757,19759,19761,19763],{"class":3948,"line":6392},[3946,19753,19754],{"class":4262},"    req",[3946,19756,4298],{"class":3952},[3946,19758,10775],{"class":4262},[3946,19760,4290],{"class":3952},[3946,19762,10775],{"class":4262},[3946,19764,4272],{"class":3952},[3946,19766,19767,19770],{"class":3948,"line":6397},[3946,19768,19769],{"class":4224},"    next",[3946,19771,4304],{"class":3952},[3946,19773,19774],{"class":3948,"line":6402},[3946,19775,4977],{"class":3952},[3946,19777,19778],{"class":3948,"line":6407},[3946,19779,4040],{"class":3952},[3946,19781,19782],{"class":3948,"line":6413},[3946,19783,4278],{"emptyLinePlaceholder":4277},[3946,19785,19786],{"class":3948,"line":6418},[3946,19787,19788],{"class":4342},"\u002F\u002F Routes\n",[3946,19790,19791,19793,19795,19797,19799,19802,19804,19806,19808,19810,19812,19814,19816,19818,19820,19822],{"class":3948,"line":6434},[3946,19792,19314],{"class":4262},[3946,19794,4298],{"class":3952},[3946,19796,8960],{"class":4224},[3946,19798,4331],{"class":3952},[3946,19800,19801],{"class":3966},"'\u002Fapi\u002Fauth\u002Flogin'",[3946,19803,19686],{"class":3952},[3946,19805,19532],{"class":4262},[3946,19807,3963],{"class":3952},[3946,19809,19212],{"class":4403},[3946,19811,4447],{"class":3952},[3946,19813,19541],{"class":4262},[3946,19815,3963],{"class":3952},[3946,19817,19217],{"class":4403},[3946,19819,5783],{"class":3952},[3946,19821,6453],{"class":4255},[3946,19823,4427],{"class":3952},[3946,19825,19826,19828,19830,19832,19834,19837,19839,19841,19843,19846],{"class":3948,"line":6466},[3946,19827,5018],{"class":4255},[3946,19829,6817],{"class":3952},[3946,19831,10853],{"class":4286},[3946,19833,4447],{"class":3952},[3946,19835,19836],{"class":4286},"password",[3946,19838,13049],{"class":3952},[3946,19840,19532],{"class":4262},[3946,19842,4298],{"class":3952},[3946,19844,19845],{"class":4262},"body",[3946,19847,4272],{"class":3952},[3946,19849,19850],{"class":3948,"line":6493},[3946,19851,4278],{"emptyLinePlaceholder":4277},[3946,19853,19854,19856,19858,19860,19863,19865,19868,19870,19873,19875,19877,19880,19882,19884,19886,19888,19890,19892,19894,19896,19898,19900],{"class":3948,"line":6512},[3946,19855,5018],{"class":4255},[3946,19857,11201],{"class":4286},[3946,19859,4290],{"class":3952},[3946,19861,19862],{"class":4262},"users",[3946,19864,4298],{"class":3952},[3946,19866,19867],{"class":4224},"find",[3946,19869,8135],{"class":3952},[3946,19871,19872],{"class":4262},"u",[3946,19874,5783],{"class":3952},[3946,19876,6453],{"class":4255},[3946,19878,19879],{"class":4262}," u",[3946,19881,4298],{"class":3952},[3946,19883,10853],{"class":4262},[3946,19885,8816],{"class":3952},[3946,19887,10853],{"class":4262},[3946,19889,15293],{"class":3952},[3946,19891,19872],{"class":4262},[3946,19893,4298],{"class":3952},[3946,19895,19836],{"class":4262},[3946,19897,8816],{"class":3952},[3946,19899,19836],{"class":4262},[3946,19901,4337],{"class":3952},[3946,19903,19904],{"class":3948,"line":6530},[3946,19905,4278],{"emptyLinePlaceholder":4277},[3946,19907,19908,19910,19912,19914],{"class":3948,"line":6545},[3946,19909,5776],{"class":4251},[3946,19911,4312],{"class":3952},[3946,19913,10775],{"class":4262},[3946,19915,4318],{"class":3952},[3946,19917,19918,19920,19922,19924,19926,19928,19930,19932,19934,19936,19938,19941],{"class":3948,"line":6550},[3946,19919,4603],{"class":4251},[3946,19921,19633],{"class":4262},[3946,19923,4298],{"class":3952},[3946,19925,8813],{"class":4224},[3946,19927,4331],{"class":3952},[3946,19929,8819],{"class":4020},[3946,19931,19644],{"class":3952},[3946,19933,3942],{"class":4224},[3946,19935,10506],{"class":3952},[3946,19937,19651],{"class":4262},[3946,19939,19940],{"class":3966}," 'Невірний email або пароль'",[3946,19942,10726],{"class":3952},[3946,19944,19945],{"class":3948,"line":6555},[3946,19946,4521],{"class":3952},[3946,19948,19949],{"class":3948,"line":6560},[3946,19950,4278],{"emptyLinePlaceholder":4277},[3946,19952,19953,19955,19958,19960,19963,19965,19968],{"class":3948,"line":6566},[3946,19954,5018],{"class":4255},[3946,19956,19957],{"class":4286}," accessToken",[3946,19959,4290],{"class":3952},[3946,19961,19962],{"class":4262},"jwt",[3946,19964,4298],{"class":3952},[3946,19966,19967],{"class":4224},"sign",[3946,19969,6594],{"class":3952},[3946,19971,19972,19975,19978,19980,19982,19985,19987,19990,19992,19994,19996],{"class":3948,"line":6571},[3946,19973,19974],{"class":3952},"    { ",[3946,19976,19977],{"class":4262},"userId:",[3946,19979,11201],{"class":4262},[3946,19981,4298],{"class":3952},[3946,19983,19984],{"class":4262},"id",[3946,19986,4447],{"class":3952},[3946,19988,19989],{"class":4262},"email:",[3946,19991,11201],{"class":4262},[3946,19993,4298],{"class":3952},[3946,19995,10853],{"class":4262},[3946,19997,19998],{"class":3952}," },\n",[3946,20000,20001,20004],{"class":3948,"line":6588},[3946,20002,20003],{"class":4286},"    SECRET_KEY",[3946,20005,3970],{"class":3952},[3946,20007,20008,20010,20013,20016],{"class":3948,"line":6597},[3946,20009,19974],{"class":3952},[3946,20011,20012],{"class":4262},"expiresIn:",[3946,20014,20015],{"class":3966}," '1h'",[3946,20017,9374],{"class":3952},[3946,20019,20020],{"class":3948,"line":6609},[3946,20021,10875],{"class":3952},[3946,20023,20024],{"class":3948,"line":6640},[3946,20025,4278],{"emptyLinePlaceholder":4277},[3946,20027,20028,20030,20032,20034,20036,20038,20040],{"class":3948,"line":6653},[3946,20029,5018],{"class":4255},[3946,20031,9307],{"class":4286},[3946,20033,4290],{"class":3952},[3946,20035,19962],{"class":4262},[3946,20037,4298],{"class":3952},[3946,20039,19967],{"class":4224},[3946,20041,6594],{"class":3952},[3946,20043,20044,20046,20048,20050,20052,20054,20056,20058,20060,20062,20064],{"class":3948,"line":6659},[3946,20045,19974],{"class":3952},[3946,20047,19977],{"class":4262},[3946,20049,11201],{"class":4262},[3946,20051,4298],{"class":3952},[3946,20053,19984],{"class":4262},[3946,20055,4447],{"class":3952},[3946,20057,19989],{"class":4262},[3946,20059,11201],{"class":4262},[3946,20061,4298],{"class":3952},[3946,20063,10853],{"class":4262},[3946,20065,19998],{"class":3952},[3946,20067,20068,20070],{"class":3948,"line":6671},[3946,20069,20003],{"class":4286},[3946,20071,3970],{"class":3952},[3946,20073,20074,20076,20078,20081],{"class":3948,"line":6689},[3946,20075,19974],{"class":3952},[3946,20077,20012],{"class":4262},[3946,20079,20080],{"class":3966}," '7d'",[3946,20082,9374],{"class":3952},[3946,20084,20085],{"class":3948,"line":6694},[3946,20086,10875],{"class":3952},[3946,20088,20089],{"class":3948,"line":6699},[3946,20090,4278],{"emptyLinePlaceholder":4277},[3946,20092,20093,20096,20098,20100],{"class":3948,"line":6704},[3946,20094,20095],{"class":4262},"  res",[3946,20097,4298],{"class":3952},[3946,20099,3942],{"class":4224},[3946,20101,8512],{"class":3952},[3946,20103,20104,20106],{"class":3948,"line":6709},[3946,20105,10556],{"class":4262},[3946,20107,4427],{"class":3952},[3946,20109,20110,20113,20115,20117,20119],{"class":3948,"line":6715},[3946,20111,20112],{"class":4262},"      id:",[3946,20114,11201],{"class":4262},[3946,20116,4298],{"class":3952},[3946,20118,19984],{"class":4262},[3946,20120,3970],{"class":3952},[3946,20122,20123,20126,20128,20130,20132],{"class":3948,"line":6720},[3946,20124,20125],{"class":4262},"      email:",[3946,20127,11201],{"class":4262},[3946,20129,4298],{"class":3952},[3946,20131,10853],{"class":4262},[3946,20133,3970],{"class":3952},[3946,20135,20136,20139,20141,20143,20145],{"class":3948,"line":6732},[3946,20137,20138],{"class":4262},"      name:",[3946,20140,11201],{"class":4262},[3946,20142,4298],{"class":3952},[3946,20144,6679],{"class":4262},[3946,20146,3970],{"class":3952},[3946,20148,20149,20152,20154,20156,20158],{"class":3948,"line":6743},[3946,20150,20151],{"class":4262},"      role:",[3946,20153,11201],{"class":4262},[3946,20155,4298],{"class":3952},[3946,20157,15300],{"class":4262},[3946,20159,3970],{"class":3952},[3946,20161,20162],{"class":3948,"line":6754},[3946,20163,10860],{"class":3952},[3946,20165,20166,20168],{"class":3948,"line":6768},[3946,20167,6933],{"class":4262},[3946,20169,3970],{"class":3952},[3946,20171,20172,20174],{"class":3948,"line":7572},[3946,20173,6944],{"class":4262},[3946,20175,3970],{"class":3952},[3946,20177,20178,20181,20184],{"class":3948,"line":7590},[3946,20179,20180],{"class":4262},"    expiresIn:",[3946,20182,20183],{"class":4020}," 3600",[3946,20185,3970],{"class":3952},[3946,20187,20188],{"class":3948,"line":7609},[3946,20189,4977],{"class":3952},[3946,20191,20192],{"class":3948,"line":7615},[3946,20193,13276],{"class":3952},[3946,20195,20196],{"class":3948,"line":7633},[3946,20197,4278],{"emptyLinePlaceholder":4277},[3946,20199,20200,20202,20204,20206,20208,20211,20213,20215,20217,20219,20221,20223,20225,20227,20229,20231],{"class":3948,"line":7638},[3946,20201,19314],{"class":4262},[3946,20203,4298],{"class":3952},[3946,20205,8960],{"class":4224},[3946,20207,4331],{"class":3952},[3946,20209,20210],{"class":3966},"'\u002Fapi\u002Fauth\u002Fregister'",[3946,20212,19686],{"class":3952},[3946,20214,19532],{"class":4262},[3946,20216,3963],{"class":3952},[3946,20218,19212],{"class":4403},[3946,20220,4447],{"class":3952},[3946,20222,19541],{"class":4262},[3946,20224,3963],{"class":3952},[3946,20226,19217],{"class":4403},[3946,20228,5783],{"class":3952},[3946,20230,6453],{"class":4255},[3946,20232,4427],{"class":3952},[3946,20234,20235,20237,20239,20241,20243,20245,20247,20249,20251,20253,20255,20257],{"class":3948,"line":7644},[3946,20236,5018],{"class":4255},[3946,20238,6817],{"class":3952},[3946,20240,10853],{"class":4286},[3946,20242,4447],{"class":3952},[3946,20244,19836],{"class":4286},[3946,20246,4447],{"class":3952},[3946,20248,6679],{"class":4286},[3946,20250,13049],{"class":3952},[3946,20252,19532],{"class":4262},[3946,20254,4298],{"class":3952},[3946,20256,19845],{"class":4262},[3946,20258,4272],{"class":3952},[3946,20260,20261],{"class":3948,"line":7677},[3946,20262,4278],{"emptyLinePlaceholder":4277},[3946,20264,20265,20267,20269,20271,20273,20275,20277,20279,20281,20283,20285,20287,20289,20291,20293],{"class":3948,"line":7682},[3946,20266,5776],{"class":4251},[3946,20268,4479],{"class":3952},[3946,20270,19862],{"class":4262},[3946,20272,4298],{"class":3952},[3946,20274,19867],{"class":4224},[3946,20276,8135],{"class":3952},[3946,20278,19872],{"class":4262},[3946,20280,5783],{"class":3952},[3946,20282,6453],{"class":4255},[3946,20284,19879],{"class":4262},[3946,20286,4298],{"class":3952},[3946,20288,10853],{"class":4262},[3946,20290,8816],{"class":3952},[3946,20292,10853],{"class":4262},[3946,20294,9718],{"class":3952},[3946,20296,20297,20299,20301,20303,20305,20307,20310,20312,20314,20316,20318,20321],{"class":3948,"line":7694},[3946,20298,4603],{"class":4251},[3946,20300,19633],{"class":4262},[3946,20302,4298],{"class":3952},[3946,20304,8813],{"class":4224},[3946,20306,4331],{"class":3952},[3946,20308,20309],{"class":4020},"409",[3946,20311,19644],{"class":3952},[3946,20313,3942],{"class":4224},[3946,20315,10506],{"class":3952},[3946,20317,19651],{"class":4262},[3946,20319,20320],{"class":3966}," 'Користувач вже існує'",[3946,20322,10726],{"class":3952},[3946,20324,20325],{"class":3948,"line":7710},[3946,20326,4521],{"class":3952},[3946,20328,20329],{"class":3948,"line":7715},[3946,20330,4278],{"emptyLinePlaceholder":4277},[3946,20332,20333,20335,20338],{"class":3948,"line":7720},[3946,20334,5018],{"class":4255},[3946,20336,20337],{"class":4286}," newUser",[3946,20339,5893],{"class":3952},[3946,20341,20342,20344,20347,20349,20351,20353,20356,20359,20361],{"class":3948,"line":7729},[3946,20343,19359],{"class":4262},[3946,20345,20346],{"class":4224}," String",[3946,20348,4331],{"class":3952},[3946,20350,19862],{"class":4262},[3946,20352,4298],{"class":3952},[3946,20354,20355],{"class":4262},"length",[3946,20357,20358],{"class":3952}," + ",[3946,20360,19610],{"class":4020},[3946,20362,16266],{"class":3952},[3946,20364,20365,20368],{"class":3948,"line":7734},[3946,20366,20367],{"class":4262},"    email",[3946,20369,3970],{"class":3952},[3946,20371,20372,20375,20377],{"class":3948,"line":7739},[3946,20373,20374],{"class":4262},"    password",[3946,20376,4447],{"class":3952},[3946,20378,20379],{"class":4342},"\u002F\u002F В реальності — хешувати!\n",[3946,20381,20382,20385],{"class":3948,"line":7744},[3946,20383,20384],{"class":4262},"    name",[3946,20386,3970],{"class":3952},[3946,20388,20389,20391,20393,20395,20397],{"class":3948,"line":7750},[3946,20390,19402],{"class":4262},[3946,20392,19405],{"class":3966},[3946,20394,4259],{"class":4251},[3946,20396,5933],{"class":4255},[3946,20398,3970],{"class":3952},[3946,20400,20401],{"class":3948,"line":7755},[3946,20402,15539],{"class":3952},[3946,20404,20405],{"class":3948,"line":7765},[3946,20406,4278],{"emptyLinePlaceholder":4277},[3946,20408,20409,20412,20414,20417,20419,20422],{"class":3948,"line":7777},[3946,20410,20411],{"class":4262},"  users",[3946,20413,4298],{"class":3952},[3946,20415,20416],{"class":4224},"push",[3946,20418,4331],{"class":3952},[3946,20420,20421],{"class":4262},"newUser",[3946,20423,4337],{"class":3952},[3946,20425,20426],{"class":3948,"line":7786},[3946,20427,4278],{"emptyLinePlaceholder":4277},[3946,20429,20430,20432,20434,20436,20438,20440,20442],{"class":3948,"line":7799},[3946,20431,5018],{"class":4255},[3946,20433,19957],{"class":4286},[3946,20435,4290],{"class":3952},[3946,20437,19962],{"class":4262},[3946,20439,4298],{"class":3952},[3946,20441,19967],{"class":4224},[3946,20443,6594],{"class":3952},[3946,20445,20446,20448,20450,20452,20454,20456,20458,20460,20462,20464,20466],{"class":3948,"line":7818},[3946,20447,19974],{"class":3952},[3946,20449,19977],{"class":4262},[3946,20451,20337],{"class":4262},[3946,20453,4298],{"class":3952},[3946,20455,19984],{"class":4262},[3946,20457,4447],{"class":3952},[3946,20459,19989],{"class":4262},[3946,20461,20337],{"class":4262},[3946,20463,4298],{"class":3952},[3946,20465,10853],{"class":4262},[3946,20467,19998],{"class":3952},[3946,20469,20470,20472],{"class":3948,"line":7823},[3946,20471,20003],{"class":4286},[3946,20473,3970],{"class":3952},[3946,20475,20476,20478,20480,20482],{"class":3948,"line":7834},[3946,20477,19974],{"class":3952},[3946,20479,20012],{"class":4262},[3946,20481,20015],{"class":3966},[3946,20483,9374],{"class":3952},[3946,20485,20486],{"class":3948,"line":7850},[3946,20487,10875],{"class":3952},[3946,20489,20490],{"class":3948,"line":7855},[3946,20491,4278],{"emptyLinePlaceholder":4277},[3946,20493,20494,20496,20498,20500,20502,20504,20506],{"class":3948,"line":7860},[3946,20495,5018],{"class":4255},[3946,20497,9307],{"class":4286},[3946,20499,4290],{"class":3952},[3946,20501,19962],{"class":4262},[3946,20503,4298],{"class":3952},[3946,20505,19967],{"class":4224},[3946,20507,6594],{"class":3952},[3946,20509,20510,20512,20514,20516,20518,20520,20522,20524,20526,20528,20530],{"class":3948,"line":7891},[3946,20511,19974],{"class":3952},[3946,20513,19977],{"class":4262},[3946,20515,20337],{"class":4262},[3946,20517,4298],{"class":3952},[3946,20519,19984],{"class":4262},[3946,20521,4447],{"class":3952},[3946,20523,19989],{"class":4262},[3946,20525,20337],{"class":4262},[3946,20527,4298],{"class":3952},[3946,20529,10853],{"class":4262},[3946,20531,19998],{"class":3952},[3946,20533,20534,20536],{"class":3948,"line":7896},[3946,20535,20003],{"class":4286},[3946,20537,3970],{"class":3952},[3946,20539,20540,20542,20544,20546],{"class":3948,"line":7901},[3946,20541,19974],{"class":3952},[3946,20543,20012],{"class":4262},[3946,20545,20080],{"class":3966},[3946,20547,9374],{"class":3952},[3946,20549,20550],{"class":3948,"line":7906},[3946,20551,10875],{"class":3952},[3946,20553,20554],{"class":3948,"line":7912},[3946,20555,4278],{"emptyLinePlaceholder":4277},[3946,20557,20558,20560,20562,20564,20566,20569,20571,20573],{"class":3948,"line":7917},[3946,20559,20095],{"class":4262},[3946,20561,4298],{"class":3952},[3946,20563,8813],{"class":4224},[3946,20565,4331],{"class":3952},[3946,20567,20568],{"class":4020},"201",[3946,20570,19644],{"class":3952},[3946,20572,3942],{"class":4224},[3946,20574,8512],{"class":3952},[3946,20576,20577,20579],{"class":3948,"line":7935},[3946,20578,10556],{"class":4262},[3946,20580,4427],{"class":3952},[3946,20582,20583,20585,20587,20589,20591],{"class":3948,"line":7942},[3946,20584,20112],{"class":4262},[3946,20586,20337],{"class":4262},[3946,20588,4298],{"class":3952},[3946,20590,19984],{"class":4262},[3946,20592,3970],{"class":3952},[3946,20594,20595,20597,20599,20601,20603],{"class":3948,"line":7963},[3946,20596,20125],{"class":4262},[3946,20598,20337],{"class":4262},[3946,20600,4298],{"class":3952},[3946,20602,10853],{"class":4262},[3946,20604,3970],{"class":3952},[3946,20606,20607,20609,20611,20613,20615],{"class":3948,"line":7979},[3946,20608,20138],{"class":4262},[3946,20610,20337],{"class":4262},[3946,20612,4298],{"class":3952},[3946,20614,6679],{"class":4262},[3946,20616,3970],{"class":3952},[3946,20618,20619,20621,20623,20625,20627],{"class":3948,"line":7992},[3946,20620,20151],{"class":4262},[3946,20622,20337],{"class":4262},[3946,20624,4298],{"class":3952},[3946,20626,15300],{"class":4262},[3946,20628,3970],{"class":3952},[3946,20630,20631],{"class":3948,"line":8012},[3946,20632,10860],{"class":3952},[3946,20634,20635,20637],{"class":3948,"line":8018},[3946,20636,6933],{"class":4262},[3946,20638,3970],{"class":3952},[3946,20640,20641,20643],{"class":3948,"line":8023},[3946,20642,6944],{"class":4262},[3946,20644,3970],{"class":3952},[3946,20646,20647,20649,20651],{"class":3948,"line":8028},[3946,20648,20180],{"class":4262},[3946,20650,20183],{"class":4020},[3946,20652,3970],{"class":3952},[3946,20654,20655],{"class":3948,"line":8033},[3946,20656,4977],{"class":3952},[3946,20658,20659],{"class":3948,"line":8038},[3946,20660,13276],{"class":3952},[3946,20662,20663],{"class":3948,"line":8044},[3946,20664,4278],{"emptyLinePlaceholder":4277},[3946,20666,20667,20669,20671,20673,20675,20678,20680,20683,20685,20687,20689,20691,20693,20695,20697,20699,20701,20703],{"class":3948,"line":8049},[3946,20668,19314],{"class":4262},[3946,20670,4298],{"class":3952},[3946,20672,9491],{"class":4224},[3946,20674,4331],{"class":3952},[3946,20676,20677],{"class":3966},"'\u002Fapi\u002Fauth\u002Fme'",[3946,20679,4447],{"class":3952},[3946,20681,20682],{"class":4262},"authenticateToken",[3946,20684,19686],{"class":3952},[3946,20686,19532],{"class":4262},[3946,20688,3963],{"class":3952},[3946,20690,19212],{"class":4403},[3946,20692,4447],{"class":3952},[3946,20694,19541],{"class":4262},[3946,20696,3963],{"class":3952},[3946,20698,19217],{"class":4403},[3946,20700,5783],{"class":3952},[3946,20702,6453],{"class":4255},[3946,20704,4427],{"class":3952},[3946,20706,20707,20709,20711,20713,20715,20717,20719,20721,20723,20725,20727,20729,20731,20733,20735,20737,20739,20741,20743,20746],{"class":3948,"line":8071},[3946,20708,5018],{"class":4255},[3946,20710,11201],{"class":4286},[3946,20712,4290],{"class":3952},[3946,20714,19862],{"class":4262},[3946,20716,4298],{"class":3952},[3946,20718,19867],{"class":4224},[3946,20720,8135],{"class":3952},[3946,20722,19872],{"class":4262},[3946,20724,5783],{"class":3952},[3946,20726,6453],{"class":4255},[3946,20728,19879],{"class":4262},[3946,20730,4298],{"class":3952},[3946,20732,19984],{"class":4262},[3946,20734,8816],{"class":3952},[3946,20736,19532],{"class":4262},[3946,20738,4298],{"class":3952},[3946,20740,10775],{"class":4262},[3946,20742,4298],{"class":3952},[3946,20744,20745],{"class":4262},"userId",[3946,20747,4337],{"class":3952},[3946,20749,20750],{"class":3948,"line":8090},[3946,20751,5795],{"class":3952},[3946,20753,20754,20756,20758,20760],{"class":3948,"line":8095},[3946,20755,5776],{"class":4251},[3946,20757,4312],{"class":3952},[3946,20759,10775],{"class":4262},[3946,20761,4318],{"class":3952},[3946,20763,20764,20766,20768,20770,20772,20774,20777,20779,20781,20783,20785,20788],{"class":3948,"line":8112},[3946,20765,4603],{"class":4251},[3946,20767,19633],{"class":4262},[3946,20769,4298],{"class":3952},[3946,20771,8813],{"class":4224},[3946,20773,4331],{"class":3952},[3946,20775,20776],{"class":4020},"404",[3946,20778,19644],{"class":3952},[3946,20780,3942],{"class":4224},[3946,20782,10506],{"class":3952},[3946,20784,19651],{"class":4262},[3946,20786,20787],{"class":3966}," 'Користувача не знайдено'",[3946,20789,10726],{"class":3952},[3946,20791,20792],{"class":3948,"line":8117},[3946,20793,4521],{"class":3952},[3946,20795,20796],{"class":3948,"line":8160},[3946,20797,4278],{"emptyLinePlaceholder":4277},[3946,20799,20800,20802,20804,20806],{"class":3948,"line":8185},[3946,20801,20095],{"class":4262},[3946,20803,4298],{"class":3952},[3946,20805,3942],{"class":4224},[3946,20807,8512],{"class":3952},[3946,20809,20810,20812,20814,20816,20818],{"class":3948,"line":8190},[3946,20811,19359],{"class":4262},[3946,20813,11201],{"class":4262},[3946,20815,4298],{"class":3952},[3946,20817,19984],{"class":4262},[3946,20819,3970],{"class":3952},[3946,20821,20822,20824,20826,20828,20830],{"class":3948,"line":8195},[3946,20823,19369],{"class":4262},[3946,20825,11201],{"class":4262},[3946,20827,4298],{"class":3952},[3946,20829,10853],{"class":4262},[3946,20831,3970],{"class":3952},[3946,20833,20834,20836,20838,20840,20842],{"class":3948,"line":8200},[3946,20835,19392],{"class":4262},[3946,20837,11201],{"class":4262},[3946,20839,4298],{"class":3952},[3946,20841,6679],{"class":4262},[3946,20843,3970],{"class":3952},[3946,20845,20846,20848,20850,20852,20854],{"class":3948,"line":8206},[3946,20847,19402],{"class":4262},[3946,20849,11201],{"class":4262},[3946,20851,4298],{"class":3952},[3946,20853,15300],{"class":4262},[3946,20855,3970],{"class":3952},[3946,20857,20858],{"class":3948,"line":9571},[3946,20859,4977],{"class":3952},[3946,20861,20862],{"class":3948,"line":9589},[3946,20863,13276],{"class":3952},[3946,20865,20866],{"class":3948,"line":9596},[3946,20867,4278],{"emptyLinePlaceholder":4277},[3946,20869,20870,20872,20874,20876,20878,20881,20883,20885,20887,20889,20891,20893,20895,20897,20899,20901,20903,20905],{"class":3948,"line":9618},[3946,20871,19314],{"class":4262},[3946,20873,4298],{"class":3952},[3946,20875,9491],{"class":4224},[3946,20877,4331],{"class":3952},[3946,20879,20880],{"class":3966},"'\u002Fapi\u002Fnotes'",[3946,20882,4447],{"class":3952},[3946,20884,20682],{"class":4262},[3946,20886,19686],{"class":3952},[3946,20888,19532],{"class":4262},[3946,20890,3963],{"class":3952},[3946,20892,19212],{"class":4403},[3946,20894,4447],{"class":3952},[3946,20896,19541],{"class":4262},[3946,20898,3963],{"class":3952},[3946,20900,19217],{"class":4403},[3946,20902,5783],{"class":3952},[3946,20904,6453],{"class":4255},[3946,20906,4427],{"class":3952},[3946,20908,20909,20911,20914,20916,20919,20921,20924,20926,20929,20931,20933,20936,20938,20940,20942,20944,20946,20948,20950,20952],{"class":3948,"line":9627},[3946,20910,5018],{"class":4255},[3946,20912,20913],{"class":4286}," userNotes",[3946,20915,4290],{"class":3952},[3946,20917,20918],{"class":4262},"notes",[3946,20920,4298],{"class":3952},[3946,20922,20923],{"class":4224},"filter",[3946,20925,8135],{"class":3952},[3946,20927,20928],{"class":4262},"note",[3946,20930,5783],{"class":3952},[3946,20932,6453],{"class":4255},[3946,20934,20935],{"class":4262}," note",[3946,20937,4298],{"class":3952},[3946,20939,20745],{"class":4262},[3946,20941,8816],{"class":3952},[3946,20943,19532],{"class":4262},[3946,20945,4298],{"class":3952},[3946,20947,10775],{"class":4262},[3946,20949,4298],{"class":3952},[3946,20951,20745],{"class":4262},[3946,20953,4337],{"class":3952},[3946,20955,20956,20958,20960,20962,20964,20967],{"class":3948,"line":9636},[3946,20957,20095],{"class":4262},[3946,20959,4298],{"class":3952},[3946,20961,3942],{"class":4224},[3946,20963,4331],{"class":3952},[3946,20965,20966],{"class":4262},"userNotes",[3946,20968,4337],{"class":3952},[3946,20970,20971],{"class":3948,"line":9645},[3946,20972,13276],{"class":3952},[3946,20974,20975],{"class":3948,"line":9650},[3946,20976,4278],{"emptyLinePlaceholder":4277},[3946,20978,20979,20981,20983,20985,20987,20989,20991,20993,20995,20997,20999,21001,21003,21005,21007,21009,21011,21013],{"class":3948,"line":9655},[3946,20980,19314],{"class":4262},[3946,20982,4298],{"class":3952},[3946,20984,8960],{"class":4224},[3946,20986,4331],{"class":3952},[3946,20988,20880],{"class":3966},[3946,20990,4447],{"class":3952},[3946,20992,20682],{"class":4262},[3946,20994,19686],{"class":3952},[3946,20996,19532],{"class":4262},[3946,20998,3963],{"class":3952},[3946,21000,19212],{"class":4403},[3946,21002,4447],{"class":3952},[3946,21004,19541],{"class":4262},[3946,21006,3963],{"class":3952},[3946,21008,19217],{"class":4403},[3946,21010,5783],{"class":3952},[3946,21012,6453],{"class":4255},[3946,21014,4427],{"class":3952},[3946,21016,21017,21019,21021,21023,21025,21028,21030,21032,21034,21036],{"class":3948,"line":9660},[3946,21018,5018],{"class":4255},[3946,21020,6817],{"class":3952},[3946,21022,15121],{"class":4286},[3946,21024,4447],{"class":3952},[3946,21026,21027],{"class":4286},"content",[3946,21029,13049],{"class":3952},[3946,21031,19532],{"class":4262},[3946,21033,4298],{"class":3952},[3946,21035,19845],{"class":4262},[3946,21037,4272],{"class":3952},[3946,21039,21040],{"class":3948,"line":9665},[3946,21041,4278],{"emptyLinePlaceholder":4277},[3946,21043,21044,21046,21049],{"class":3948,"line":9671},[3946,21045,5018],{"class":4255},[3946,21047,21048],{"class":4286}," newNote",[3946,21050,5893],{"class":3952},[3946,21052,21053,21055,21057,21059,21061,21063,21065,21067,21069],{"class":3948,"line":9676},[3946,21054,19359],{"class":4262},[3946,21056,20346],{"class":4224},[3946,21058,4331],{"class":3952},[3946,21060,20918],{"class":4262},[3946,21062,4298],{"class":3952},[3946,21064,20355],{"class":4262},[3946,21066,20358],{"class":3952},[3946,21068,19610],{"class":4020},[3946,21070,16266],{"class":3952},[3946,21072,21073,21075,21078,21080,21082,21084,21086],{"class":3948,"line":9700},[3946,21074,19446],{"class":4262},[3946,21076,21077],{"class":4262}," req",[3946,21079,4298],{"class":3952},[3946,21081,10775],{"class":4262},[3946,21083,4298],{"class":3952},[3946,21085,20745],{"class":4262},[3946,21087,3970],{"class":3952},[3946,21089,21090,21093],{"class":3948,"line":9721},[3946,21091,21092],{"class":4262},"    title",[3946,21094,3970],{"class":3952},[3946,21096,21097,21100],{"class":3948,"line":9756},[3946,21098,21099],{"class":4262},"    content",[3946,21101,3970],{"class":3952},[3946,21103,21104,21106,21108,21110,21112,21114],{"class":3948,"line":9778},[3946,21105,19475],{"class":4262},[3946,21107,7150],{"class":4255},[3946,21109,7015],{"class":4224},[3946,21111,19482],{"class":3952},[3946,21113,19485],{"class":4224},[3946,21115,19488],{"class":3952},[3946,21117,21118,21120,21122,21124,21126,21128],{"class":3948,"line":9783},[3946,21119,19493],{"class":4262},[3946,21121,7150],{"class":4255},[3946,21123,7015],{"class":4224},[3946,21125,19482],{"class":3952},[3946,21127,19485],{"class":4224},[3946,21129,19488],{"class":3952},[3946,21131,21132],{"class":3948,"line":9789},[3946,21133,15539],{"class":3952},[3946,21135,21136],{"class":3948,"line":9801},[3946,21137,4278],{"emptyLinePlaceholder":4277},[3946,21139,21140,21143,21145,21147,21149,21152],{"class":3948,"line":9813},[3946,21141,21142],{"class":4262},"  notes",[3946,21144,4298],{"class":3952},[3946,21146,20416],{"class":4224},[3946,21148,4331],{"class":3952},[3946,21150,21151],{"class":4262},"newNote",[3946,21153,4337],{"class":3952},[3946,21155,21156,21158,21160,21162,21164,21166,21168,21170,21172,21174],{"class":3948,"line":9830},[3946,21157,20095],{"class":4262},[3946,21159,4298],{"class":3952},[3946,21161,8813],{"class":4224},[3946,21163,4331],{"class":3952},[3946,21165,20568],{"class":4020},[3946,21167,19644],{"class":3952},[3946,21169,3942],{"class":4224},[3946,21171,4331],{"class":3952},[3946,21173,21151],{"class":4262},[3946,21175,4337],{"class":3952},[3946,21177,21178],{"class":3948,"line":9840},[3946,21179,13276],{"class":3952},[3946,21181,21182],{"class":3948,"line":9856},[3946,21183,4278],{"emptyLinePlaceholder":4277},[3946,21185,21186,21188,21190,21193,21195,21198,21201,21203],{"class":3948,"line":9866},[3946,21187,19314],{"class":4262},[3946,21189,4298],{"class":3952},[3946,21191,21192],{"class":4224},"listen",[3946,21194,4331],{"class":3952},[3946,21196,21197],{"class":4286},"PORT",[3946,21199,21200],{"class":3952},", () ",[3946,21202,6453],{"class":4255},[3946,21204,4427],{"class":3952},[3946,21206,21207,21209,21211,21213,21215,21218,21220,21222,21224,21226],{"class":3948,"line":9882},[3946,21208,4323],{"class":4262},[3946,21210,4298],{"class":3952},[3946,21212,4461],{"class":4224},[3946,21214,4331],{"class":3952},[3946,21216,21217],{"class":3966},"`✅ Server running on http:\u002F\u002Flocalhost:",[3946,21219,8669],{"class":4255},[3946,21221,21197],{"class":4286},[3946,21223,8674],{"class":4255},[3946,21225,8677],{"class":3966},[3946,21227,4337],{"class":3952},[3946,21229,21230],{"class":3948,"line":9892},[3946,21231,13276],{"class":3952},[3750,21233,21235],{"id":21234},"_74-ui-components-базові-компоненти","7.4. UI Components — Базові Компоненти",[3847,21237,21239],{"id":21238},"button-component","Button Component",[3857,21241,21243],{"className":4242,"code":21242,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fshared\u002Fcomponents\u002FButton.tsx\n\nimport React from 'react';\nimport {\n  TouchableOpacity,\n  Text,\n  StyleSheet,\n  ActivityIndicator,\n  TouchableOpacityProps,\n} from 'react-native';\n\ninterface ButtonProps extends TouchableOpacityProps {\n  title: string;\n  loading?: boolean;\n  variant?: 'primary' | 'secondary' | 'outline';\n}\n\nexport function Button({\n  title,\n  loading = false,\n  variant = 'primary',\n  disabled,\n  style,\n  ...rest\n}: ButtonProps) {\n  return (\n    \u003CTouchableOpacity\n      style={[\n        styles.button,\n        styles[variant],\n        (disabled || loading) && styles.disabled,\n        style,\n      ]}\n      disabled={disabled || loading}\n      {...rest}\n    >\n      {loading ? (\n        \u003CActivityIndicator color=\"#FFFFFF\" \u002F>\n      ) : (\n        \u003CText\n          style={[\n            styles.text,\n            variant === 'outline' && styles.outlineText,\n          ]}\n        >\n          {title}\n        \u003C\u002FText>\n      )}\n    \u003C\u002FTouchableOpacity>\n  );\n}\n\nconst styles = StyleSheet.create({\n  button: {\n    paddingVertical: 14,\n    paddingHorizontal: 24,\n    borderRadius: 12,\n    alignItems: 'center',\n    justifyContent: 'center',\n    minHeight: 50,\n  },\n  primary: {\n    backgroundColor: '#007AFF',\n  },\n  secondary: {\n    backgroundColor: '#5856D6',\n  },\n  outline: {\n    backgroundColor: 'transparent',\n    borderWidth: 2,\n    borderColor: '#007AFF',\n  },\n  disabled: {\n    opacity: 0.5,\n  },\n  text: {\n    color: '#FFFFFF',\n    fontSize: 16,\n    fontWeight: '600',\n  },\n  outlineText: {\n    color: '#007AFF',\n  },\n});\n",[3782,21244,21245,21250,21254,21266,21272,21279,21286,21293,21300,21307,21317,21321,21335,21346,21357,21379,21383,21387,21398,21404,21414,21424,21431,21438,21446,21456,21462,21468,21478,21483,21488,21505,21510,21515,21520,21525,21529,21534,21539,21546,21553,21562,21567,21584,21589,21594,21599,21604,21609,21614,21618,21622,21626,21631,21637,21646,21654,21662,21670,21678,21688,21692,21699,21707,21711,21718,21727,21731,21738,21747,21757,21766,21770,21777,21787,21791,21798,21806,21814,21822,21826,21833,21841,21845],{"__ignoreMap":3865},[3946,21246,21247],{"class":3948,"line":3949},[3946,21248,21249],{"class":4342},"\u002F\u002F src\u002Fshared\u002Fcomponents\u002FButton.tsx\n",[3946,21251,21252],{"class":3948,"line":3956},[3946,21253,4278],{"emptyLinePlaceholder":4277},[3946,21255,21256,21258,21260,21262,21264],{"class":3948,"line":3973},[3946,21257,4252],{"class":4251},[3946,21259,10244],{"class":4262},[3946,21261,4266],{"class":4251},[3946,21263,10304],{"class":3966},[3946,21265,4272],{"class":3952},[3946,21267,21268,21270],{"class":3948,"line":3986},[3946,21269,4252],{"class":4251},[3946,21271,4427],{"class":3952},[3946,21273,21274,21277],{"class":3948,"line":3999},[3946,21275,21276],{"class":4262},"  TouchableOpacity",[3946,21278,3970],{"class":3952},[3946,21280,21281,21284],{"class":3948,"line":4012},[3946,21282,21283],{"class":4262},"  Text",[3946,21285,3970],{"class":3952},[3946,21287,21288,21291],{"class":3948,"line":4026},[3946,21289,21290],{"class":4262},"  StyleSheet",[3946,21292,3970],{"class":3952},[3946,21294,21295,21298],{"class":3948,"line":4037},[3946,21296,21297],{"class":4262},"  ActivityIndicator",[3946,21299,3970],{"class":3952},[3946,21301,21302,21305],{"class":3948,"line":4487},[3946,21303,21304],{"class":4262},"  TouchableOpacityProps",[3946,21306,3970],{"class":3952},[3946,21308,21309,21311,21313,21315],{"class":3948,"line":4507},[3946,21310,5928],{"class":3952},[3946,21312,6826],{"class":4251},[3946,21314,12943],{"class":3966},[3946,21316,4272],{"class":3952},[3946,21318,21319],{"class":3948,"line":4518},[3946,21320,4278],{"emptyLinePlaceholder":4277},[3946,21322,21323,21325,21328,21330,21333],{"class":3948,"line":4524},[3946,21324,4801],{"class":4255},[3946,21326,21327],{"class":4403}," ButtonProps",[3946,21329,6190],{"class":4255},[3946,21331,21332],{"class":4403}," TouchableOpacityProps",[3946,21334,4427],{"class":3952},[3946,21336,21337,21340,21342,21344],{"class":3948,"line":4529},[3946,21338,21339],{"class":4262},"  title",[3946,21341,3963],{"class":3952},[3946,21343,4404],{"class":4403},[3946,21345,4272],{"class":3952},[3946,21347,21348,21351,21353,21355],{"class":3948,"line":4534},[3946,21349,21350],{"class":4262},"  loading",[3946,21352,4814],{"class":3952},[3946,21354,4848],{"class":4403},[3946,21356,4272],{"class":3952},[3946,21358,21359,21362,21364,21367,21369,21372,21374,21377],{"class":3948,"line":4540},[3946,21360,21361],{"class":4262},"  variant",[3946,21363,4814],{"class":3952},[3946,21365,21366],{"class":3966},"'primary'",[3946,21368,4559],{"class":3952},[3946,21370,21371],{"class":3966},"'secondary'",[3946,21373,4559],{"class":3952},[3946,21375,21376],{"class":3966},"'outline'",[3946,21378,4272],{"class":3952},[3946,21380,21381],{"class":3948,"line":4567},[3946,21382,4040],{"class":3952},[3946,21384,21385],{"class":3948,"line":4574},[3946,21386,4278],{"emptyLinePlaceholder":4277},[3946,21388,21389,21391,21393,21396],{"class":3948,"line":4600},[3946,21390,6030],{"class":4251},[3946,21392,4390],{"class":4255},[3946,21394,21395],{"class":4224}," Button",[3946,21397,8512],{"class":3952},[3946,21399,21400,21402],{"class":3948,"line":4610},[3946,21401,21339],{"class":4262},[3946,21403,3970],{"class":3952},[3946,21405,21406,21408,21410,21412],{"class":3948,"line":4623},[3946,21407,21350],{"class":4262},[3946,21409,4290],{"class":3952},[3946,21411,13575],{"class":4255},[3946,21413,3970],{"class":3952},[3946,21415,21416,21418,21420,21422],{"class":3948,"line":4643},[3946,21417,21361],{"class":4262},[3946,21419,4290],{"class":3952},[3946,21421,21366],{"class":3966},[3946,21423,3970],{"class":3952},[3946,21425,21426,21429],{"class":3948,"line":4653},[3946,21427,21428],{"class":4262},"  disabled",[3946,21430,3970],{"class":3952},[3946,21432,21433,21436],{"class":3948,"line":4658},[3946,21434,21435],{"class":4262},"  style",[3946,21437,3970],{"class":3952},[3946,21439,21440,21443],{"class":3948,"line":4663},[3946,21441,21442],{"class":3952},"  ...",[3946,21444,21445],{"class":4262},"rest\n",[3946,21447,21448,21451,21454],{"class":3948,"line":4668},[3946,21449,21450],{"class":3952},"}: ",[3946,21452,21453],{"class":4403},"ButtonProps",[3946,21455,4318],{"class":3952},[3946,21457,21458,21460],{"class":3948,"line":4674},[3946,21459,5062],{"class":4251},[3946,21461,13079],{"class":3952},[3946,21463,21464,21466],{"class":3948,"line":4694},[3946,21465,13158],{"class":3952},[3946,21467,15436],{"class":4262},[3946,21469,21470,21473,21475],{"class":3948,"line":4701},[3946,21471,21472],{"class":4262},"      style",[3946,21474,12602],{"class":3952},[3946,21476,21477],{"class":4262},"[\n",[3946,21479,21480],{"class":3948,"line":4719},[3946,21481,21482],{"class":4262},"        styles.button,\n",[3946,21484,21485],{"class":3948,"line":4735},[3946,21486,21487],{"class":4262},"        styles[variant],\n",[3946,21489,21490,21493,21496,21499,21502],{"class":3948,"line":4748},[3946,21491,21492],{"class":4262},"        (disabled ",[3946,21494,21495],{"class":3952},"||",[3946,21497,21498],{"class":4262}," loading) ",[3946,21500,21501],{"class":3952},"&&",[3946,21503,21504],{"class":4262}," styles.disabled,\n",[3946,21506,21507],{"class":3948,"line":4768},[3946,21508,21509],{"class":4262},"        style,\n",[3946,21511,21512],{"class":3948,"line":4777},[3946,21513,21514],{"class":4262},"      ]}\n",[3946,21516,21517],{"class":3948,"line":4782},[3946,21518,21519],{"class":4262},"      disabled={disabled || loading}\n",[3946,21521,21522],{"class":3948,"line":6262},[3946,21523,21524],{"class":4262},"      {...rest}\n",[3946,21526,21527],{"class":3948,"line":6273},[3946,21528,13602],{"class":4262},[3946,21530,21531],{"class":3948,"line":6284},[3946,21532,21533],{"class":4262},"      {loading ? (\n",[3946,21535,21536],{"class":3948,"line":6299},[3946,21537,21538],{"class":4262},"        \u003CActivityIndicator color=\"#FFFFFF\" \u002F>\n",[3946,21540,21541,21544],{"class":3948,"line":6304},[3946,21542,21543],{"class":4262},"      ) :",[3946,21545,13079],{"class":3952},[3946,21547,21548,21550],{"class":3948,"line":6309},[3946,21549,13103],{"class":3952},[3946,21551,21552],{"class":4262},"Text\n",[3946,21554,21555,21558,21560],{"class":3948,"line":6314},[3946,21556,21557],{"class":4262},"          style",[3946,21559,12602],{"class":3952},[3946,21561,21477],{"class":4262},[3946,21563,21564],{"class":3948,"line":6320},[3946,21565,21566],{"class":4262},"            styles.text,\n",[3946,21568,21569,21572,21575,21578,21581],{"class":3948,"line":6325},[3946,21570,21571],{"class":4262},"            variant ",[3946,21573,21574],{"class":3952},"===",[3946,21576,21577],{"class":3966}," 'outline'",[3946,21579,21580],{"class":3952}," &&",[3946,21582,21583],{"class":4262}," styles.outlineText,\n",[3946,21585,21586],{"class":3948,"line":6337},[3946,21587,21588],{"class":4262},"          ]}\n",[3946,21590,21591],{"class":3948,"line":6352},[3946,21592,21593],{"class":4262},"        >\n",[3946,21595,21596],{"class":3948,"line":6364},[3946,21597,21598],{"class":4262},"          {title}\n",[3946,21600,21601],{"class":3948,"line":6376},[3946,21602,21603],{"class":4262},"        \u003C\u002FText>\n",[3946,21605,21606],{"class":3948,"line":6392},[3946,21607,21608],{"class":4262},"      )}\n",[3946,21610,21611],{"class":3948,"line":6397},[3946,21612,21613],{"class":4262},"    \u003C\u002FTouchableOpacity>\n",[3946,21615,21616],{"class":3948,"line":6402},[3946,21617,10875],{"class":4262},[3946,21619,21620],{"class":3948,"line":6407},[3946,21621,4040],{"class":4262},[3946,21623,21624],{"class":3948,"line":6413},[3946,21625,4278],{"emptyLinePlaceholder":4277},[3946,21627,21628],{"class":3948,"line":6418},[3946,21629,21630],{"class":4262},"const styles = StyleSheet.create({\n",[3946,21632,21633,21635],{"class":3948,"line":6434},[3946,21634,15718],{"class":4262},[3946,21636,4427],{"class":3952},[3946,21638,21639,21641,21644],{"class":3948,"line":6466},[3946,21640,15743],{"class":4262},[3946,21642,21643],{"class":4020}," 14",[3946,21645,3970],{"class":3952},[3946,21647,21648,21650,21652],{"class":3948,"line":6493},[3946,21649,15734],{"class":4262},[3946,21651,15631],{"class":4020},[3946,21653,3970],{"class":3952},[3946,21655,21656,21658,21660],{"class":3948,"line":6512},[3946,21657,15752],{"class":4262},[3946,21659,15661],{"class":4020},[3946,21661,3970],{"class":3952},[3946,21663,21664,21666,21668],{"class":3948,"line":6530},[3946,21665,13252],{"class":4262},[3946,21667,13245],{"class":3966},[3946,21669,3970],{"class":3952},[3946,21671,21672,21674,21676],{"class":3948,"line":6545},[3946,21673,13242],{"class":4262},[3946,21675,13245],{"class":3966},[3946,21677,3970],{"class":3952},[3946,21679,21680,21683,21686],{"class":3948,"line":6550},[3946,21681,21682],{"class":4262},"    minHeight:",[3946,21684,21685],{"class":4020}," 50",[3946,21687,3970],{"class":3952},[3946,21689,21690],{"class":3948,"line":6555},[3946,21691,13271],{"class":3952},[3946,21693,21694,21697],{"class":3948,"line":6560},[3946,21695,21696],{"class":4262},"  primary:",[3946,21698,4427],{"class":3952},[3946,21700,21701,21703,21705],{"class":3948,"line":6566},[3946,21702,13261],{"class":4262},[3946,21704,15727],{"class":3966},[3946,21706,3970],{"class":3952},[3946,21708,21709],{"class":3948,"line":6571},[3946,21710,13271],{"class":3952},[3946,21712,21713,21716],{"class":3948,"line":6588},[3946,21714,21715],{"class":4262},"  secondary:",[3946,21717,4427],{"class":3952},[3946,21719,21720,21722,21725],{"class":3948,"line":6597},[3946,21721,13261],{"class":4262},[3946,21723,21724],{"class":3966}," '#5856D6'",[3946,21726,3970],{"class":3952},[3946,21728,21729],{"class":3948,"line":6609},[3946,21730,13271],{"class":3952},[3946,21732,21733,21736],{"class":3948,"line":6640},[3946,21734,21735],{"class":4262},"  outline:",[3946,21737,4427],{"class":3952},[3946,21739,21740,21742,21745],{"class":3948,"line":6653},[3946,21741,13261],{"class":4262},[3946,21743,21744],{"class":3966}," 'transparent'",[3946,21746,3970],{"class":3952},[3946,21748,21749,21752,21755],{"class":3948,"line":6659},[3946,21750,21751],{"class":4262},"    borderWidth:",[3946,21753,21754],{"class":4020}," 2",[3946,21756,3970],{"class":3952},[3946,21758,21759,21762,21764],{"class":3948,"line":6671},[3946,21760,21761],{"class":4262},"    borderColor:",[3946,21763,15727],{"class":3966},[3946,21765,3970],{"class":3952},[3946,21767,21768],{"class":3948,"line":6689},[3946,21769,13271],{"class":3952},[3946,21771,21772,21775],{"class":3948,"line":6694},[3946,21773,21774],{"class":4262},"  disabled:",[3946,21776,4427],{"class":3952},[3946,21778,21779,21782,21785],{"class":3948,"line":6699},[3946,21780,21781],{"class":4262},"    opacity:",[3946,21783,21784],{"class":4020}," 0.5",[3946,21786,3970],{"class":3952},[3946,21788,21789],{"class":3948,"line":6704},[3946,21790,13271],{"class":3952},[3946,21792,21793,21796],{"class":3948,"line":6709},[3946,21794,21795],{"class":4262},"  text:",[3946,21797,4427],{"class":3952},[3946,21799,21800,21802,21804],{"class":3948,"line":6715},[3946,21801,15648],{"class":4262},[3946,21803,13264],{"class":3966},[3946,21805,3970],{"class":3952},[3946,21807,21808,21810,21812],{"class":3948,"line":6720},[3946,21809,15628],{"class":4262},[3946,21811,15681],{"class":4020},[3946,21813,3970],{"class":3952},[3946,21815,21816,21818,21820],{"class":3948,"line":6732},[3946,21817,15638],{"class":4262},[3946,21819,15791],{"class":3966},[3946,21821,3970],{"class":3952},[3946,21823,21824],{"class":3948,"line":6743},[3946,21825,13271],{"class":3952},[3946,21827,21828,21831],{"class":3948,"line":6754},[3946,21829,21830],{"class":4262},"  outlineText:",[3946,21832,4427],{"class":3952},[3946,21834,21835,21837,21839],{"class":3948,"line":6768},[3946,21836,15648],{"class":4262},[3946,21838,15727],{"class":3966},[3946,21840,3970],{"class":3952},[3946,21842,21843],{"class":3948,"line":7572},[3946,21844,13271],{"class":3952},[3946,21846,21847],{"class":3948,"line":7590},[3946,21848,13276],{"class":3952},[3847,21850,21852],{"id":21851},"input-component","Input Component",[3857,21854,21856],{"className":4242,"code":21855,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fshared\u002Fcomponents\u002FInput.tsx\n\nimport React, { useState } from 'react';\nimport {\n  View,\n  TextInput,\n  Text,\n  StyleSheet,\n  TextInputProps,\n  TouchableOpacity,\n} from 'react-native';\nimport { Ionicons } from '@expo\u002Fvector-icons';\n\ninterface InputProps extends TextInputProps {\n  label?: string;\n  error?: string;\n  secureTextEntry?: boolean;\n}\n\nexport function Input({\n  label,\n  error,\n  secureTextEntry,\n  style,\n  ...rest\n}: InputProps) {\n  const [isSecure, setIsSecure] = useState(secureTextEntry);\n\n  return (\n    \u003CView style={styles.container}>\n      {label && \u003CText style={styles.label}>{label}\u003C\u002FText>}\n      \n      \u003CView style={styles.inputContainer}>\n        \u003CTextInput\n          style={[\n            styles.input,\n            error && styles.inputError,\n            secureTextEntry && styles.inputWithIcon,\n            style,\n          ]}\n          secureTextEntry={isSecure}\n          placeholderTextColor=\"#999999\"\n          {...rest}\n        \u002F>\n        \n        {secureTextEntry && (\n          \u003CTouchableOpacity\n            style={styles.eyeIcon}\n            onPress={() => setIsSecure(!isSecure)}\n          >\n            \u003CIonicons\n              name={isSecure ? 'eye-off-outline' : 'eye-outline'}\n              size={22}\n              color=\"#999999\"\n            \u002F>\n          \u003C\u002FTouchableOpacity>\n        )}\n      \u003C\u002FView>\n      \n      {error && \u003CText style={styles.errorText}>{error}\u003C\u002FText>}\n    \u003C\u002FView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    marginBottom: 16,\n  },\n  label: {\n    fontSize: 14,\n    fontWeight: '600',\n    color: '#000000',\n    marginBottom: 8,\n  },\n  inputContainer: {\n    position: 'relative',\n  },\n  input: {\n    backgroundColor: '#F5F5F5',\n    borderRadius: 12,\n    paddingHorizontal: 16,\n    paddingVertical: 14,\n    fontSize: 16,\n    color: '#000000',\n    borderWidth: 1,\n    borderColor: 'transparent',\n  },\n  inputWithIcon: {\n    paddingRight: 50,\n  },\n  inputError: {\n    borderColor: '#FF3B30',\n  },\n  eyeIcon: {\n    position: 'absolute',\n    right: 16,\n    top: 14,\n  },\n  errorText: {\n    fontSize: 12,\n    color: '#FF3B30',\n    marginTop: 4,\n  },\n});\n",[3782,21857,21858,21863,21867,21885,21891,21898,21905,21911,21917,21924,21930,21940,21956,21960,21974,21985,21995,22006,22010,22014,22025,22031,22037,22043,22049,22055,22064,22089,22093,22099,22113,22142,22146,22161,22168,22176,22181,22191,22201,22206,22210,22215,22220,22225,22230,22234,22239,22244,22249,22254,22258,22263,22273,22285,22295,22300,22308,22313,22321,22325,22357,22365,22369,22373,22377,22393,22399,22407,22411,22418,22426,22434,22442,22450,22454,22461,22471,22475,22482,22491,22499,22507,22515,22523,22531,22539,22547,22551,22558,22567,22571,22578,22586,22590,22597,22606,22615,22624,22628,22635,22643,22651,22661,22665],{"__ignoreMap":3865},[3946,21859,21860],{"class":3948,"line":3949},[3946,21861,21862],{"class":4342},"\u002F\u002F src\u002Fshared\u002Fcomponents\u002FInput.tsx\n",[3946,21864,21865],{"class":3948,"line":3956},[3946,21866,4278],{"emptyLinePlaceholder":4277},[3946,21868,21869,21871,21873,21875,21877,21879,21881,21883],{"class":3948,"line":3973},[3946,21870,4252],{"class":4251},[3946,21872,10244],{"class":4262},[3946,21874,8290],{"class":3952},[3946,21876,10543],{"class":4262},[3946,21878,6823],{"class":3952},[3946,21880,6826],{"class":4251},[3946,21882,10304],{"class":3966},[3946,21884,4272],{"class":3952},[3946,21886,21887,21889],{"class":3948,"line":3986},[3946,21888,4252],{"class":4251},[3946,21890,4427],{"class":3952},[3946,21892,21893,21896],{"class":3948,"line":3999},[3946,21894,21895],{"class":4262},"  View",[3946,21897,3970],{"class":3952},[3946,21899,21900,21903],{"class":3948,"line":4012},[3946,21901,21902],{"class":4262},"  TextInput",[3946,21904,3970],{"class":3952},[3946,21906,21907,21909],{"class":3948,"line":4026},[3946,21908,21283],{"class":4262},[3946,21910,3970],{"class":3952},[3946,21912,21913,21915],{"class":3948,"line":4037},[3946,21914,21290],{"class":4262},[3946,21916,3970],{"class":3952},[3946,21918,21919,21922],{"class":3948,"line":4487},[3946,21920,21921],{"class":4262},"  TextInputProps",[3946,21923,3970],{"class":3952},[3946,21925,21926,21928],{"class":3948,"line":4507},[3946,21927,21276],{"class":4262},[3946,21929,3970],{"class":3952},[3946,21931,21932,21934,21936,21938],{"class":3948,"line":4518},[3946,21933,5928],{"class":3952},[3946,21935,6826],{"class":4251},[3946,21937,12943],{"class":3966},[3946,21939,4272],{"class":3952},[3946,21941,21942,21944,21946,21948,21950,21952,21954],{"class":3948,"line":4524},[3946,21943,4252],{"class":4251},[3946,21945,6817],{"class":3952},[3946,21947,13775],{"class":4262},[3946,21949,6823],{"class":3952},[3946,21951,6826],{"class":4251},[3946,21953,13782],{"class":3966},[3946,21955,4272],{"class":3952},[3946,21957,21958],{"class":3948,"line":4529},[3946,21959,4278],{"emptyLinePlaceholder":4277},[3946,21961,21962,21964,21967,21969,21972],{"class":3948,"line":4534},[3946,21963,4801],{"class":4255},[3946,21965,21966],{"class":4403}," InputProps",[3946,21968,6190],{"class":4255},[3946,21970,21971],{"class":4403}," TextInputProps",[3946,21973,4427],{"class":3952},[3946,21975,21976,21979,21981,21983],{"class":3948,"line":4540},[3946,21977,21978],{"class":4262},"  label",[3946,21980,4814],{"class":3952},[3946,21982,4404],{"class":4403},[3946,21984,4272],{"class":3952},[3946,21986,21987,21989,21991,21993],{"class":3948,"line":4567},[3946,21988,6379],{"class":4262},[3946,21990,4814],{"class":3952},[3946,21992,4404],{"class":4403},[3946,21994,4272],{"class":3952},[3946,21996,21997,22000,22002,22004],{"class":3948,"line":4574},[3946,21998,21999],{"class":4262},"  secureTextEntry",[3946,22001,4814],{"class":3952},[3946,22003,4848],{"class":4403},[3946,22005,4272],{"class":3952},[3946,22007,22008],{"class":3948,"line":4600},[3946,22009,4040],{"class":3952},[3946,22011,22012],{"class":3948,"line":4610},[3946,22013,4278],{"emptyLinePlaceholder":4277},[3946,22015,22016,22018,22020,22023],{"class":3948,"line":4623},[3946,22017,6030],{"class":4251},[3946,22019,4390],{"class":4255},[3946,22021,22022],{"class":4224}," Input",[3946,22024,8512],{"class":3952},[3946,22026,22027,22029],{"class":3948,"line":4643},[3946,22028,21978],{"class":4262},[3946,22030,3970],{"class":3952},[3946,22032,22033,22035],{"class":3948,"line":4653},[3946,22034,6379],{"class":4262},[3946,22036,3970],{"class":3952},[3946,22038,22039,22041],{"class":3948,"line":4658},[3946,22040,21999],{"class":4262},[3946,22042,3970],{"class":3952},[3946,22044,22045,22047],{"class":3948,"line":4663},[3946,22046,21435],{"class":4262},[3946,22048,3970],{"class":3952},[3946,22050,22051,22053],{"class":3948,"line":4668},[3946,22052,21442],{"class":3952},[3946,22054,21445],{"class":4262},[3946,22056,22057,22059,22062],{"class":3948,"line":4674},[3946,22058,21450],{"class":3952},[3946,22060,22061],{"class":4403},"InputProps",[3946,22063,4318],{"class":3952},[3946,22065,22066,22068,22070,22073,22075,22078,22080,22082,22084,22087],{"class":3948,"line":4694},[3946,22067,5018],{"class":4255},[3946,22069,10529],{"class":3952},[3946,22071,22072],{"class":4286},"isSecure",[3946,22074,4447],{"class":3952},[3946,22076,22077],{"class":4286},"setIsSecure",[3946,22079,10540],{"class":3952},[3946,22081,10543],{"class":4224},[3946,22083,4331],{"class":3952},[3946,22085,22086],{"class":4262},"secureTextEntry",[3946,22088,4337],{"class":3952},[3946,22090,22091],{"class":3948,"line":4701},[3946,22092,4278],{"emptyLinePlaceholder":4277},[3946,22094,22095,22097],{"class":3948,"line":4719},[3946,22096,5062],{"class":4251},[3946,22098,13079],{"class":3952},[3946,22100,22101,22103,22105,22107,22109,22111],{"class":3948,"line":4735},[3946,22102,13158],{"class":3952},[3946,22104,12926],{"class":4262},[3946,22106,13089],{"class":4262},[3946,22108,13092],{"class":3952},[3946,22110,15105],{"class":4262},[3946,22112,13098],{"class":3952},[3946,22114,22115,22117,22120,22123,22125,22127,22129,22131,22133,22135,22137,22139],{"class":3948,"line":4748},[3946,22116,13167],{"class":3952},[3946,22118,22119],{"class":4262},"label",[3946,22121,22122],{"class":3952}," && \u003C",[3946,22124,14762],{"class":4262},[3946,22126,13089],{"class":4262},[3946,22128,13092],{"class":3952},[3946,22130,22119],{"class":4262},[3946,22132,12608],{"class":3952},[3946,22134,22119],{"class":4262},[3946,22136,12613],{"class":3952},[3946,22138,14762],{"class":4262},[3946,22140,22141],{"class":3952},">}\n",[3946,22143,22144],{"class":3948,"line":4768},[3946,22145,7095],{"class":3952},[3946,22147,22148,22150,22152,22154,22156,22159],{"class":3948,"line":4777},[3946,22149,13084],{"class":3952},[3946,22151,12926],{"class":4262},[3946,22153,13089],{"class":4262},[3946,22155,13092],{"class":3952},[3946,22157,22158],{"class":4262},"inputContainer",[3946,22160,13098],{"class":3952},[3946,22162,22163,22165],{"class":3948,"line":4782},[3946,22164,13103],{"class":3952},[3946,22166,22167],{"class":4262},"TextInput\n",[3946,22169,22170,22172,22174],{"class":3948,"line":6262},[3946,22171,21557],{"class":4262},[3946,22173,12602],{"class":3952},[3946,22175,21477],{"class":4262},[3946,22177,22178],{"class":3948,"line":6273},[3946,22179,22180],{"class":4262},"            styles.input,\n",[3946,22182,22183,22186,22188],{"class":3948,"line":6284},[3946,22184,22185],{"class":4262},"            error ",[3946,22187,21501],{"class":3952},[3946,22189,22190],{"class":4262}," styles.inputError,\n",[3946,22192,22193,22196,22198],{"class":3948,"line":6299},[3946,22194,22195],{"class":4262},"            secureTextEntry ",[3946,22197,21501],{"class":3952},[3946,22199,22200],{"class":4262}," styles.inputWithIcon,\n",[3946,22202,22203],{"class":3948,"line":6304},[3946,22204,22205],{"class":4262},"            style,\n",[3946,22207,22208],{"class":3948,"line":6309},[3946,22209,21588],{"class":4262},[3946,22211,22212],{"class":3948,"line":6314},[3946,22213,22214],{"class":4262},"          secureTextEntry={isSecure}\n",[3946,22216,22217],{"class":3948,"line":6320},[3946,22218,22219],{"class":4262},"          placeholderTextColor=\"#999999\"\n",[3946,22221,22222],{"class":3948,"line":6325},[3946,22223,22224],{"class":4262},"          {...rest}\n",[3946,22226,22227],{"class":3948,"line":6337},[3946,22228,22229],{"class":4262},"        \u002F>\n",[3946,22231,22232],{"class":3948,"line":6352},[3946,22233,8635],{"class":4262},[3946,22235,22236],{"class":3948,"line":6364},[3946,22237,22238],{"class":4262},"        {secureTextEntry && (\n",[3946,22240,22241],{"class":3948,"line":6376},[3946,22242,22243],{"class":4262},"          \u003CTouchableOpacity\n",[3946,22245,22246],{"class":3948,"line":6392},[3946,22247,22248],{"class":4262},"            style={styles.eyeIcon}\n",[3946,22250,22251],{"class":3948,"line":6397},[3946,22252,22253],{"class":4262},"            onPress={() => setIsSecure(!isSecure)}\n",[3946,22255,22256],{"class":3948,"line":6402},[3946,22257,15460],{"class":4262},[3946,22259,22260],{"class":3948,"line":6407},[3946,22261,22262],{"class":4262},"            \u003CIonicons\n",[3946,22264,22265,22268,22271],{"class":3948,"line":6413},[3946,22266,22267],{"class":4262},"              name={isSecure ? 'eye-off-outline' :",[3946,22269,22270],{"class":3966}," 'eye-outline'",[3946,22272,4040],{"class":3952},[3946,22274,22275,22278,22280,22283],{"class":3948,"line":6418},[3946,22276,22277],{"class":4262},"              size",[3946,22279,12602],{"class":3952},[3946,22281,22282],{"class":4020},"22",[3946,22284,4040],{"class":3952},[3946,22286,22287,22290,22292],{"class":3948,"line":6434},[3946,22288,22289],{"class":4262},"              color",[3946,22291,13111],{"class":3952},[3946,22293,22294],{"class":3966},"\"#999999\"\n",[3946,22296,22297],{"class":3948,"line":6466},[3946,22298,22299],{"class":3952},"            \u002F>\n",[3946,22301,22302,22304,22306],{"class":3948,"line":6493},[3946,22303,15182],{"class":3952},[3946,22305,14771],{"class":4262},[3946,22307,13135],{"class":3952},[3946,22309,22310],{"class":3948,"line":6512},[3946,22311,22312],{"class":3952},"        )}\n",[3946,22314,22315,22317,22319],{"class":3948,"line":6530},[3946,22316,13130],{"class":3952},[3946,22318,12926],{"class":4262},[3946,22320,13135],{"class":3952},[3946,22322,22323],{"class":3948,"line":6545},[3946,22324,7095],{"class":3952},[3946,22326,22327,22329,22331,22333,22335,22337,22339,22342,22344,22347,22349,22351,22353,22355],{"class":3948,"line":6550},[3946,22328,13167],{"class":3952},[3946,22330,4482],{"class":4262},[3946,22332,22122],{"class":3952},[3946,22334,14762],{"class":4403},[3946,22336,13089],{"class":4403},[3946,22338,12602],{"class":3952},[3946,22340,22341],{"class":4403},"styles",[3946,22343,4298],{"class":3952},[3946,22345,22346],{"class":4262},"errorText",[3946,22348,12608],{"class":3952},[3946,22350,4482],{"class":4262},[3946,22352,12613],{"class":3952},[3946,22354,14762],{"class":4262},[3946,22356,22141],{"class":3952},[3946,22358,22359,22361,22363],{"class":3948,"line":6555},[3946,22360,13187],{"class":3952},[3946,22362,12926],{"class":4262},[3946,22364,13135],{"class":3952},[3946,22366,22367],{"class":3948,"line":6560},[3946,22368,10875],{"class":3952},[3946,22370,22371],{"class":3948,"line":6566},[3946,22372,4040],{"class":3952},[3946,22374,22375],{"class":3948,"line":6571},[3946,22376,4278],{"emptyLinePlaceholder":4277},[3946,22378,22379,22381,22383,22385,22387,22389,22391],{"class":3948,"line":6588},[3946,22380,4283],{"class":4255},[3946,22382,13210],{"class":4286},[3946,22384,4290],{"class":3952},[3946,22386,12936],{"class":4262},[3946,22388,4298],{"class":3952},[3946,22390,8509],{"class":4224},[3946,22392,8512],{"class":3952},[3946,22394,22395,22397],{"class":3948,"line":6597},[3946,22396,15568],{"class":4262},[3946,22398,4427],{"class":3952},[3946,22400,22401,22403,22405],{"class":3948,"line":6609},[3946,22402,15658],{"class":4262},[3946,22404,15681],{"class":4020},[3946,22406,3970],{"class":3952},[3946,22408,22409],{"class":3948,"line":6640},[3946,22410,13271],{"class":3952},[3946,22412,22413,22416],{"class":3948,"line":6653},[3946,22414,22415],{"class":4262},"  label:",[3946,22417,4427],{"class":3952},[3946,22419,22420,22422,22424],{"class":3948,"line":6659},[3946,22421,15628],{"class":4262},[3946,22423,21643],{"class":4020},[3946,22425,3970],{"class":3952},[3946,22427,22428,22430,22432],{"class":3948,"line":6671},[3946,22429,15638],{"class":4262},[3946,22431,15791],{"class":3966},[3946,22433,3970],{"class":3952},[3946,22435,22436,22438,22440],{"class":3948,"line":6689},[3946,22437,15648],{"class":4262},[3946,22439,15651],{"class":3966},[3946,22441,3970],{"class":3952},[3946,22443,22444,22446,22448],{"class":3948,"line":6694},[3946,22445,15658],{"class":4262},[3946,22447,15755],{"class":4020},[3946,22449,3970],{"class":3952},[3946,22451,22452],{"class":3948,"line":6699},[3946,22453,13271],{"class":3952},[3946,22455,22456,22459],{"class":3948,"line":6704},[3946,22457,22458],{"class":4262},"  inputContainer:",[3946,22460,4427],{"class":3952},[3946,22462,22463,22466,22469],{"class":3948,"line":6709},[3946,22464,22465],{"class":4262},"    position:",[3946,22467,22468],{"class":3966}," 'relative'",[3946,22470,3970],{"class":3952},[3946,22472,22473],{"class":3948,"line":6715},[3946,22474,13271],{"class":3952},[3946,22476,22477,22480],{"class":3948,"line":6720},[3946,22478,22479],{"class":4262},"  input:",[3946,22481,4427],{"class":3952},[3946,22483,22484,22486,22489],{"class":3948,"line":6732},[3946,22485,13261],{"class":4262},[3946,22487,22488],{"class":3966}," '#F5F5F5'",[3946,22490,3970],{"class":3952},[3946,22492,22493,22495,22497],{"class":3948,"line":6743},[3946,22494,15752],{"class":4262},[3946,22496,15661],{"class":4020},[3946,22498,3970],{"class":3952},[3946,22500,22501,22503,22505],{"class":3948,"line":6754},[3946,22502,15734],{"class":4262},[3946,22504,15681],{"class":4020},[3946,22506,3970],{"class":3952},[3946,22508,22509,22511,22513],{"class":3948,"line":6768},[3946,22510,15743],{"class":4262},[3946,22512,21643],{"class":4020},[3946,22514,3970],{"class":3952},[3946,22516,22517,22519,22521],{"class":3948,"line":7572},[3946,22518,15628],{"class":4262},[3946,22520,15681],{"class":4020},[3946,22522,3970],{"class":3952},[3946,22524,22525,22527,22529],{"class":3948,"line":7590},[3946,22526,15648],{"class":4262},[3946,22528,15651],{"class":3966},[3946,22530,3970],{"class":3952},[3946,22532,22533,22535,22537],{"class":3948,"line":7609},[3946,22534,21751],{"class":4262},[3946,22536,13235],{"class":4020},[3946,22538,3970],{"class":3952},[3946,22540,22541,22543,22545],{"class":3948,"line":7615},[3946,22542,21761],{"class":4262},[3946,22544,21744],{"class":3966},[3946,22546,3970],{"class":3952},[3946,22548,22549],{"class":3948,"line":7633},[3946,22550,13271],{"class":3952},[3946,22552,22553,22556],{"class":3948,"line":7638},[3946,22554,22555],{"class":4262},"  inputWithIcon:",[3946,22557,4427],{"class":3952},[3946,22559,22560,22563,22565],{"class":3948,"line":7644},[3946,22561,22562],{"class":4262},"    paddingRight:",[3946,22564,21685],{"class":4020},[3946,22566,3970],{"class":3952},[3946,22568,22569],{"class":3948,"line":7677},[3946,22570,13271],{"class":3952},[3946,22572,22573,22576],{"class":3948,"line":7682},[3946,22574,22575],{"class":4262},"  inputError:",[3946,22577,4427],{"class":3952},[3946,22579,22580,22582,22584],{"class":3948,"line":7694},[3946,22581,21761],{"class":4262},[3946,22583,18618],{"class":3966},[3946,22585,3970],{"class":3952},[3946,22587,22588],{"class":3948,"line":7710},[3946,22589,13271],{"class":3952},[3946,22591,22592,22595],{"class":3948,"line":7715},[3946,22593,22594],{"class":4262},"  eyeIcon:",[3946,22596,4427],{"class":3952},[3946,22598,22599,22601,22604],{"class":3948,"line":7720},[3946,22600,22465],{"class":4262},[3946,22602,22603],{"class":3966}," 'absolute'",[3946,22605,3970],{"class":3952},[3946,22607,22608,22611,22613],{"class":3948,"line":7729},[3946,22609,22610],{"class":4262},"    right:",[3946,22612,15681],{"class":4020},[3946,22614,3970],{"class":3952},[3946,22616,22617,22620,22622],{"class":3948,"line":7734},[3946,22618,22619],{"class":4262},"    top:",[3946,22621,21643],{"class":4020},[3946,22623,3970],{"class":3952},[3946,22625,22626],{"class":3948,"line":7739},[3946,22627,13271],{"class":3952},[3946,22629,22630,22633],{"class":3948,"line":7744},[3946,22631,22632],{"class":4262},"  errorText:",[3946,22634,4427],{"class":3952},[3946,22636,22637,22639,22641],{"class":3948,"line":7750},[3946,22638,15628],{"class":4262},[3946,22640,15661],{"class":4020},[3946,22642,3970],{"class":3952},[3946,22644,22645,22647,22649],{"class":3948,"line":7755},[3946,22646,15648],{"class":4262},[3946,22648,18618],{"class":3966},[3946,22650,3970],{"class":3952},[3946,22652,22653,22656,22659],{"class":3948,"line":7765},[3946,22654,22655],{"class":4262},"    marginTop:",[3946,22657,22658],{"class":4020}," 4",[3946,22660,3970],{"class":3952},[3946,22662,22663],{"class":3948,"line":7777},[3946,22664,13271],{"class":3952},[3946,22666,22667],{"class":3948,"line":7786},[3946,22668,13276],{"class":3952},[3750,22670,22672],{"id":22671},"_75-login-screen-повна-реалізація","7.5. Login Screen — Повна Реалізація",[3857,22674,22676],{"className":4242,"code":22675,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen.tsx\n\nimport React, { useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  Alert,\n} from 'react-native';\nimport { NativeStackNavigationProp } from '@react-navigation\u002Fnative-stack';\nimport { AuthStackParamList } from '..\u002F..\u002F..\u002Fnavigation\u002FAuthNavigator';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\nimport { Input } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FInput';\nimport { Button } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FButton';\n\ntype LoginScreenNavigationProp = NativeStackNavigationProp\u003C\n  AuthStackParamList,\n  'Login'\n>;\n\ninterface Props {\n  navigation: LoginScreenNavigationProp;\n}\n\nexport function LoginScreen({ navigation }: Props) {\n  const { login, isLoading, error, clearError } = useAuth();\n  \n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n  const [validationErrors, setValidationErrors] = useState({\n    email: '',\n    password: '',\n  });\n\n  \u002F**\n   * Валідація форми\n   *\u002F\n  const validateForm = (): boolean => {\n    const errors = { email: '', password: '' };\n    let isValid = true;\n\n    \u002F\u002F Email validation\n    if (!email.trim()) {\n      errors.email = 'Email обов\\'язковий';\n      isValid = false;\n    } else if (!\u002F^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\u002F.test(email)) {\n      errors.email = 'Невірний формат email';\n      isValid = false;\n    }\n\n    \u002F\u002F Password validation\n    if (!password) {\n      errors.password = 'Пароль обов\\'язковий';\n      isValid = false;\n    } else if (password.length \u003C 6) {\n      errors.password = 'Пароль повинен містити мінімум 6 символів';\n      isValid = false;\n    }\n\n    setValidationErrors(errors);\n    return isValid;\n  };\n\n  \u002F**\n   * Обробка входу\n   *\u002F\n  const handleLogin = async () => {\n    clearError();\n    \n    if (!validateForm()) {\n      return;\n    }\n\n    try {\n      await login({ email: email.trim(), password });\n      \u002F\u002F Успіх — RootNavigator автоматично перенаправить на App Stack\n    } catch (err) {\n      \u002F\u002F Помилка вже в контексті, показуємо Alert\n      Alert.alert(\n        'Помилка входу',\n        error || 'Не вдалося увійти в систему',\n        [{ text: 'OK' }]\n      );\n    }\n  };\n\n  \u002F**\n   * Навігація на реєстрацію\n   *\u002F\n  const handleNavigateToRegister = () => {\n    clearError();\n    navigation.navigate('Register');\n  };\n\n  return (\n    \u003CKeyboardAvoidingView\n      style={styles.container}\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n    >\n      \u003CScrollView\n        contentContainerStyle={styles.scrollContent}\n        keyboardShouldPersistTaps=\"handled\"\n      >\n        {\u002F* Header *\u002F}\n        \u003CView style={styles.header}>\n          \u003CText style={styles.title}>Секретні Нотатки\u003C\u002FText>\n          \u003CText style={styles.subtitle}>\n            Увійдіть для доступу до ваших приватних нотаток\n          \u003C\u002FText>\n        \u003C\u002FView>\n\n        {\u002F* Form *\u002F}\n        \u003CView style={styles.form}>\n          \u003CInput\n            label=\"Email\"\n            placeholder=\"example@email.com\"\n            value={email}\n            onChangeText={setEmail}\n            error={validationErrors.email}\n            keyboardType=\"email-address\"\n            autoCapitalize=\"none\"\n            autoComplete=\"email\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CInput\n            label=\"Пароль\"\n            placeholder=\"Введіть пароль\"\n            value={password}\n            onChangeText={setPassword}\n            error={validationErrors.password}\n            secureTextEntry\n            autoComplete=\"password\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CButton\n            title=\"Увійти\"\n            onPress={handleLogin}\n            loading={isLoading}\n            style={styles.loginButton}\n          \u002F>\n\n          \u003CButton\n            title=\"Створити акаунт\"\n            onPress={handleNavigateToRegister}\n            variant=\"outline\"\n            disabled={isLoading}\n          \u002F>\n        \u003C\u002FView>\n\n        {\u002F* Demo credentials *\u002F}\n        \u003CView style={styles.demoBox}>\n          \u003CText style={styles.demoTitle}>Демо-доступ:\u003C\u002FText>\n          \u003CText style={styles.demoText}>Email: demo@example.com\u003C\u002FText>\n          \u003CText style={styles.demoText}>Пароль: password123\u003C\u002FText>\n        \u003C\u002FView>\n      \u003C\u002FScrollView>\n    \u003C\u002FKeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  scrollContent: {\n    flexGrow: 1,\n    padding: 24,\n    justifyContent: 'center',\n  },\n  header: {\n    marginBottom: 40,\n    alignItems: 'center',\n  },\n  title: {\n    fontSize: 32,\n    fontWeight: 'bold',\n    color: '#000000',\n    marginBottom: 8,\n  },\n  subtitle: {\n    fontSize: 16,\n    color: '#666666',\n    textAlign: 'center',\n  },\n  form: {\n    marginBottom: 24,\n  },\n  loginButton: {\n    marginBottom: 12,\n  },\n  demoBox: {\n    backgroundColor: '#F5F5F5',\n    padding: 16,\n    borderRadius: 12,\n    marginTop: 20,\n  },\n  demoTitle: {\n    fontSize: 14,\n    fontWeight: '600',\n    color: '#000000',\n    marginBottom: 8,\n  },\n  demoText: {\n    fontSize: 12,\n    color: '#666666',\n    marginBottom: 4,\n  },\n});\n",[3782,22677,22678,22683,22687,22705,22711,22717,22723,22729,22736,22743,22750,22757,22767,22784,22801,22817,22835,22853,22857,22872,22879,22884,22888,22892,22900,22912,22916,22920,22939,22965,22969,22993,23016,23036,23045,23053,23057,23061,23065,23070,23074,23091,23114,23127,23131,23136,23152,23175,23186,23254,23269,23279,23283,23287,23292,23302,23321,23331,23354,23369,23379,23383,23387,23399,23407,23411,23415,23419,23424,23428,23445,23452,23456,23467,23473,23477,23481,23487,23511,23516,23528,23533,23545,23552,23564,23578,23582,23586,23590,23594,23598,23603,23607,23620,23626,23643,23647,23651,23657,23664,23674,23702,23706,23713,23725,23735,23740,23750,23765,23791,23806,23827,23835,23843,23847,23856,23871,23878,23888,23898,23909,23920,23932,23942,23952,23962,23974,23979,23983,23989,23998,24007,24017,24027,24037,24042,24051,24061,24065,24069,24076,24086,24097,24108,24119,24123,24127,24133,24142,24153,24163,24174,24178,24186,24190,24199,24214,24244,24283,24311,24319,24328,24337,24341,24345,24349,24365,24371,24379,24387,24391,24398,24407,24415,24423,24427,24434,24443,24451,24455,24461,24470,24478,24486,24494,24498,24505,24513,24521,24529,24533,24540,24548,24552,24559,24567,24571,24578,24586,24594,24602,24610,24614,24621,24629,24637,24645,24653,24657,24664,24672,24680,24688,24692],{"__ignoreMap":3865},[3946,22679,22680],{"class":3948,"line":3949},[3946,22681,22682],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen.tsx\n",[3946,22684,22685],{"class":3948,"line":3956},[3946,22686,4278],{"emptyLinePlaceholder":4277},[3946,22688,22689,22691,22693,22695,22697,22699,22701,22703],{"class":3948,"line":3973},[3946,22690,4252],{"class":4251},[3946,22692,10244],{"class":4262},[3946,22694,8290],{"class":3952},[3946,22696,10543],{"class":4262},[3946,22698,6823],{"class":3952},[3946,22700,6826],{"class":4251},[3946,22702,10304],{"class":3966},[3946,22704,4272],{"class":3952},[3946,22706,22707,22709],{"class":3948,"line":3986},[3946,22708,4252],{"class":4251},[3946,22710,4427],{"class":3952},[3946,22712,22713,22715],{"class":3948,"line":3999},[3946,22714,21895],{"class":4262},[3946,22716,3970],{"class":3952},[3946,22718,22719,22721],{"class":3948,"line":4012},[3946,22720,21283],{"class":4262},[3946,22722,3970],{"class":3952},[3946,22724,22725,22727],{"class":3948,"line":4026},[3946,22726,21290],{"class":4262},[3946,22728,3970],{"class":3952},[3946,22730,22731,22734],{"class":3948,"line":4037},[3946,22732,22733],{"class":4262},"  KeyboardAvoidingView",[3946,22735,3970],{"class":3952},[3946,22737,22738,22741],{"class":3948,"line":4487},[3946,22739,22740],{"class":4262},"  Platform",[3946,22742,3970],{"class":3952},[3946,22744,22745,22748],{"class":3948,"line":4507},[3946,22746,22747],{"class":4262},"  ScrollView",[3946,22749,3970],{"class":3952},[3946,22751,22752,22755],{"class":3948,"line":4518},[3946,22753,22754],{"class":4262},"  Alert",[3946,22756,3970],{"class":3952},[3946,22758,22759,22761,22763,22765],{"class":3948,"line":4524},[3946,22760,5928],{"class":3952},[3946,22762,6826],{"class":4251},[3946,22764,12943],{"class":3966},[3946,22766,4272],{"class":3952},[3946,22768,22769,22771,22773,22776,22778,22780,22782],{"class":3948,"line":4529},[3946,22770,4252],{"class":4251},[3946,22772,6817],{"class":3952},[3946,22774,22775],{"class":4262},"NativeStackNavigationProp",[3946,22777,6823],{"class":3952},[3946,22779,6826],{"class":4251},[3946,22781,13355],{"class":3966},[3946,22783,4272],{"class":3952},[3946,22785,22786,22788,22790,22792,22794,22796,22799],{"class":3948,"line":4534},[3946,22787,4252],{"class":4251},[3946,22789,6817],{"class":3952},[3946,22791,13497],{"class":4262},[3946,22793,6823],{"class":3952},[3946,22795,6826],{"class":4251},[3946,22797,22798],{"class":3966}," '..\u002F..\u002F..\u002Fnavigation\u002FAuthNavigator'",[3946,22800,4272],{"class":3952},[3946,22802,22803,22805,22807,22809,22811,22813,22815],{"class":3948,"line":4540},[3946,22804,4252],{"class":4251},[3946,22806,6817],{"class":3952},[3946,22808,12954],{"class":4262},[3946,22810,6823],{"class":3952},[3946,22812,6826],{"class":4251},[3946,22814,14794],{"class":3966},[3946,22816,4272],{"class":3952},[3946,22818,22819,22821,22823,22826,22828,22830,22833],{"class":3948,"line":4567},[3946,22820,4252],{"class":4251},[3946,22822,6817],{"class":3952},[3946,22824,22825],{"class":4262},"Input",[3946,22827,6823],{"class":3952},[3946,22829,6826],{"class":4251},[3946,22831,22832],{"class":3966}," '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FInput'",[3946,22834,4272],{"class":3952},[3946,22836,22837,22839,22841,22844,22846,22848,22851],{"class":3948,"line":4574},[3946,22838,4252],{"class":4251},[3946,22840,6817],{"class":3952},[3946,22842,22843],{"class":4262},"Button",[3946,22845,6823],{"class":3952},[3946,22847,6826],{"class":4251},[3946,22849,22850],{"class":3966}," '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FButton'",[3946,22852,4272],{"class":3952},[3946,22854,22855],{"class":3948,"line":4600},[3946,22856,4278],{"emptyLinePlaceholder":4277},[3946,22858,22859,22862,22865,22867,22869],{"class":3948,"line":4610},[3946,22860,22861],{"class":4255},"type",[3946,22863,22864],{"class":4403}," LoginScreenNavigationProp",[3946,22866,4290],{"class":3952},[3946,22868,22775],{"class":4403},[3946,22870,22871],{"class":3952},"\u003C\n",[3946,22873,22874,22877],{"class":3948,"line":4623},[3946,22875,22876],{"class":4403},"  AuthStackParamList",[3946,22878,3970],{"class":3952},[3946,22880,22881],{"class":3948,"line":4643},[3946,22882,22883],{"class":3966},"  'Login'\n",[3946,22885,22886],{"class":3948,"line":4653},[3946,22887,6463],{"class":3952},[3946,22889,22890],{"class":3948,"line":4658},[3946,22891,4278],{"emptyLinePlaceholder":4277},[3946,22893,22894,22896,22898],{"class":3948,"line":4663},[3946,22895,4801],{"class":4255},[3946,22897,17922],{"class":4403},[3946,22899,4427],{"class":3952},[3946,22901,22902,22905,22907,22910],{"class":3948,"line":4668},[3946,22903,22904],{"class":4262},"  navigation",[3946,22906,3963],{"class":3952},[3946,22908,22909],{"class":4403},"LoginScreenNavigationProp",[3946,22911,4272],{"class":3952},[3946,22913,22914],{"class":3948,"line":4674},[3946,22915,4040],{"class":3952},[3946,22917,22918],{"class":3948,"line":4694},[3946,22919,4278],{"emptyLinePlaceholder":4277},[3946,22921,22922,22924,22926,22929,22931,22933,22935,22937],{"class":3948,"line":4701},[3946,22923,6030],{"class":4251},[3946,22925,4390],{"class":4255},[3946,22927,22928],{"class":4224}," LoginScreen",[3946,22930,10506],{"class":3952},[3946,22932,16226],{"class":4262},[3946,22934,10512],{"class":3952},[3946,22936,18038],{"class":4403},[3946,22938,4318],{"class":3952},[3946,22940,22941,22943,22945,22947,22949,22951,22953,22955,22957,22959,22961,22963],{"class":3948,"line":4719},[3946,22942,5018],{"class":4255},[3946,22944,6817],{"class":3952},[3946,22946,11402],{"class":4286},[3946,22948,4447],{"class":3952},[3946,22950,13046],{"class":4286},[3946,22952,4447],{"class":3952},[3946,22954,4482],{"class":4286},[3946,22956,4447],{"class":3952},[3946,22958,12569],{"class":4286},[3946,22960,13049],{"class":3952},[3946,22962,12954],{"class":4224},[3946,22964,4304],{"class":3952},[3946,22966,22967],{"class":3948,"line":4735},[3946,22968,5795],{"class":3952},[3946,22970,22971,22973,22975,22977,22979,22982,22984,22986,22988,22991],{"class":3948,"line":4748},[3946,22972,5018],{"class":4255},[3946,22974,10529],{"class":3952},[3946,22976,10853],{"class":4286},[3946,22978,4447],{"class":3952},[3946,22980,22981],{"class":4286},"setEmail",[3946,22983,10540],{"class":3952},[3946,22985,10543],{"class":4224},[3946,22987,4331],{"class":3952},[3946,22989,22990],{"class":3966},"''",[3946,22992,4337],{"class":3952},[3946,22994,22995,22997,22999,23001,23003,23006,23008,23010,23012,23014],{"class":3948,"line":4768},[3946,22996,5018],{"class":4255},[3946,22998,10529],{"class":3952},[3946,23000,19836],{"class":4286},[3946,23002,4447],{"class":3952},[3946,23004,23005],{"class":4286},"setPassword",[3946,23007,10540],{"class":3952},[3946,23009,10543],{"class":4224},[3946,23011,4331],{"class":3952},[3946,23013,22990],{"class":3966},[3946,23015,4337],{"class":3952},[3946,23017,23018,23020,23022,23025,23027,23030,23032,23034],{"class":3948,"line":4777},[3946,23019,5018],{"class":4255},[3946,23021,10529],{"class":3952},[3946,23023,23024],{"class":4286},"validationErrors",[3946,23026,4447],{"class":3952},[3946,23028,23029],{"class":4286},"setValidationErrors",[3946,23031,10540],{"class":3952},[3946,23033,10543],{"class":4224},[3946,23035,8512],{"class":3952},[3946,23037,23038,23040,23043],{"class":3948,"line":4782},[3946,23039,19369],{"class":4262},[3946,23041,23042],{"class":3966}," ''",[3946,23044,3970],{"class":3952},[3946,23046,23047,23049,23051],{"class":3948,"line":6262},[3946,23048,19379],{"class":4262},[3946,23050,23042],{"class":3966},[3946,23052,3970],{"class":3952},[3946,23054,23055],{"class":3948,"line":6273},[3946,23056,4977],{"class":3952},[3946,23058,23059],{"class":3948,"line":6284},[3946,23060,4278],{"emptyLinePlaceholder":4277},[3946,23062,23063],{"class":3948,"line":6299},[3946,23064,6908],{"class":4342},[3946,23066,23067],{"class":3948,"line":6304},[3946,23068,23069],{"class":4342},"   * Валідація форми\n",[3946,23071,23072],{"class":3948,"line":6309},[3946,23073,6918],{"class":4342},[3946,23075,23076,23078,23081,23084,23086,23089],{"class":3948,"line":6314},[3946,23077,5018],{"class":4255},[3946,23079,23080],{"class":4224}," validateForm",[3946,23082,23083],{"class":3952}," = (): ",[3946,23085,4848],{"class":4403},[3946,23087,23088],{"class":4255}," =>",[3946,23090,4427],{"class":3952},[3946,23092,23093,23095,23098,23101,23103,23105,23107,23110,23112],{"class":3948,"line":6320},[3946,23094,4577],{"class":4255},[3946,23096,23097],{"class":4286}," errors",[3946,23099,23100],{"class":3952}," = { ",[3946,23102,19989],{"class":4262},[3946,23104,23042],{"class":3966},[3946,23106,4447],{"class":3952},[3946,23108,23109],{"class":4262},"password:",[3946,23111,23042],{"class":3966},[3946,23113,13912],{"class":3952},[3946,23115,23116,23119,23121,23123,23125],{"class":3948,"line":6325},[3946,23117,23118],{"class":4255},"    let",[3946,23120,7649],{"class":4262},[3946,23122,4290],{"class":3952},[3946,23124,17493],{"class":4255},[3946,23126,4272],{"class":3952},[3946,23128,23129],{"class":3948,"line":6337},[3946,23130,4278],{"emptyLinePlaceholder":4277},[3946,23132,23133],{"class":3948,"line":6352},[3946,23134,23135],{"class":4342},"    \u002F\u002F Email validation\n",[3946,23137,23138,23140,23142,23144,23146,23149],{"class":3948,"line":6364},[3946,23139,5503],{"class":4251},[3946,23141,4312],{"class":3952},[3946,23143,10853],{"class":4262},[3946,23145,4298],{"class":3952},[3946,23147,23148],{"class":4224},"trim",[3946,23150,23151],{"class":3952},"()) {\n",[3946,23153,23154,23157,23159,23161,23163,23166,23170,23173],{"class":3948,"line":6376},[3946,23155,23156],{"class":4262},"      errors",[3946,23158,4298],{"class":3952},[3946,23160,10853],{"class":4262},[3946,23162,4290],{"class":3952},[3946,23164,23165],{"class":3966},"'Email обов",[3946,23167,23169],{"class":23168},"sjcCO","\\'",[3946,23171,23172],{"class":3966},"язковий'",[3946,23174,4272],{"class":3952},[3946,23176,23177,23180,23182,23184],{"class":3948,"line":6392},[3946,23178,23179],{"class":4262},"      isValid",[3946,23181,4290],{"class":3952},[3946,23183,13575],{"class":4255},[3946,23185,4272],{"class":3952},[3946,23187,23188,23190,23193,23196,23198,23200,23203,23207,23210,23213,23217,23219,23221,23223,23225,23227,23230,23232,23234,23236,23238,23241,23243,23245,23248,23250,23252],{"class":3948,"line":6397},[3946,23189,7115],{"class":3952},[3946,23191,23192],{"class":4251},"else",[3946,23194,23195],{"class":4251}," if",[3946,23197,4312],{"class":3952},[3946,23199,5129],{"class":16996},[3946,23201,23202],{"class":17000},"^",[3946,23204,23206],{"class":23205},"sAV2Q","[^",[3946,23208,23209],{"class":16996},"\\s@",[3946,23211,23212],{"class":23205},"]",[3946,23214,23216],{"class":23215},"sYsli","+",[3946,23218,5132],{"class":16996},[3946,23220,23206],{"class":23205},[3946,23222,23209],{"class":16996},[3946,23224,23212],{"class":23205},[3946,23226,23216],{"class":23215},[3946,23228,23229],{"class":23168},"\\.",[3946,23231,23206],{"class":23205},[3946,23233,23209],{"class":16996},[3946,23235,23212],{"class":23205},[3946,23237,23216],{"class":23215},[3946,23239,23240],{"class":17000},"$",[3946,23242,5129],{"class":16996},[3946,23244,4298],{"class":3952},[3946,23246,23247],{"class":4224},"test",[3946,23249,4331],{"class":3952},[3946,23251,10853],{"class":4262},[3946,23253,9718],{"class":3952},[3946,23255,23256,23258,23260,23262,23264,23267],{"class":3948,"line":6402},[3946,23257,23156],{"class":4262},[3946,23259,4298],{"class":3952},[3946,23261,10853],{"class":4262},[3946,23263,4290],{"class":3952},[3946,23265,23266],{"class":3966},"'Невірний формат email'",[3946,23268,4272],{"class":3952},[3946,23270,23271,23273,23275,23277],{"class":3948,"line":6407},[3946,23272,23179],{"class":4262},[3946,23274,4290],{"class":3952},[3946,23276,13575],{"class":4255},[3946,23278,4272],{"class":3952},[3946,23280,23281],{"class":3948,"line":6413},[3946,23282,5550],{"class":3952},[3946,23284,23285],{"class":3948,"line":6418},[3946,23286,4278],{"emptyLinePlaceholder":4277},[3946,23288,23289],{"class":3948,"line":6434},[3946,23290,23291],{"class":4342},"    \u002F\u002F Password validation\n",[3946,23293,23294,23296,23298,23300],{"class":3948,"line":6466},[3946,23295,5503],{"class":4251},[3946,23297,4312],{"class":3952},[3946,23299,19836],{"class":4262},[3946,23301,4318],{"class":3952},[3946,23303,23304,23306,23308,23310,23312,23315,23317,23319],{"class":3948,"line":6493},[3946,23305,23156],{"class":4262},[3946,23307,4298],{"class":3952},[3946,23309,19836],{"class":4262},[3946,23311,4290],{"class":3952},[3946,23313,23314],{"class":3966},"'Пароль обов",[3946,23316,23169],{"class":23168},[3946,23318,23172],{"class":3966},[3946,23320,4272],{"class":3952},[3946,23322,23323,23325,23327,23329],{"class":3948,"line":6512},[3946,23324,23179],{"class":4262},[3946,23326,4290],{"class":3952},[3946,23328,13575],{"class":4255},[3946,23330,4272],{"class":3952},[3946,23332,23333,23335,23337,23339,23341,23343,23345,23347,23349,23352],{"class":3948,"line":6530},[3946,23334,7115],{"class":3952},[3946,23336,23192],{"class":4251},[3946,23338,23195],{"class":4251},[3946,23340,4479],{"class":3952},[3946,23342,19836],{"class":4262},[3946,23344,4298],{"class":3952},[3946,23346,20355],{"class":4262},[3946,23348,16838],{"class":3952},[3946,23350,23351],{"class":4020},"6",[3946,23353,4318],{"class":3952},[3946,23355,23356,23358,23360,23362,23364,23367],{"class":3948,"line":6545},[3946,23357,23156],{"class":4262},[3946,23359,4298],{"class":3952},[3946,23361,19836],{"class":4262},[3946,23363,4290],{"class":3952},[3946,23365,23366],{"class":3966},"'Пароль повинен містити мінімум 6 символів'",[3946,23368,4272],{"class":3952},[3946,23370,23371,23373,23375,23377],{"class":3948,"line":6550},[3946,23372,23179],{"class":4262},[3946,23374,4290],{"class":3952},[3946,23376,13575],{"class":4255},[3946,23378,4272],{"class":3952},[3946,23380,23381],{"class":3948,"line":6555},[3946,23382,5550],{"class":3952},[3946,23384,23385],{"class":3948,"line":6560},[3946,23386,4278],{"emptyLinePlaceholder":4277},[3946,23388,23389,23392,23394,23397],{"class":3948,"line":6566},[3946,23390,23391],{"class":4224},"    setValidationErrors",[3946,23393,4331],{"class":3952},[3946,23395,23396],{"class":4262},"errors",[3946,23398,4337],{"class":3952},[3946,23400,23401,23403,23405],{"class":3948,"line":6571},[3946,23402,4603],{"class":4251},[3946,23404,7649],{"class":4262},[3946,23406,4272],{"class":3952},[3946,23408,23409],{"class":3948,"line":6588},[3946,23410,15539],{"class":3952},[3946,23412,23413],{"class":3948,"line":6597},[3946,23414,4278],{"emptyLinePlaceholder":4277},[3946,23416,23417],{"class":3948,"line":6609},[3946,23418,6908],{"class":4342},[3946,23420,23421],{"class":3948,"line":6640},[3946,23422,23423],{"class":4342},"   * Обробка входу\n",[3946,23425,23426],{"class":3948,"line":6653},[3946,23427,6918],{"class":4342},[3946,23429,23430,23432,23435,23437,23439,23441,23443],{"class":3948,"line":6659},[3946,23431,5018],{"class":4255},[3946,23433,23434],{"class":4224}," handleLogin",[3946,23436,4290],{"class":3952},[3946,23438,4387],{"class":4255},[3946,23440,11004],{"class":3952},[3946,23442,6453],{"class":4255},[3946,23444,4427],{"class":3952},[3946,23446,23447,23450],{"class":3948,"line":6671},[3946,23448,23449],{"class":4224},"    clearError",[3946,23451,4304],{"class":3952},[3946,23453,23454],{"class":3948,"line":6689},[3946,23455,7612],{"class":3952},[3946,23457,23458,23460,23462,23465],{"class":3948,"line":6694},[3946,23459,5503],{"class":4251},[3946,23461,4312],{"class":3952},[3946,23463,23464],{"class":4224},"validateForm",[3946,23466,23151],{"class":3952},[3946,23468,23469,23471],{"class":3948,"line":6699},[3946,23470,7405],{"class":4251},[3946,23472,4272],{"class":3952},[3946,23474,23475],{"class":3948,"line":6704},[3946,23476,5550],{"class":3952},[3946,23478,23479],{"class":3948,"line":6709},[3946,23480,4278],{"emptyLinePlaceholder":4277},[3946,23482,23483,23485],{"class":3948,"line":6715},[3946,23484,6977],{"class":4251},[3946,23486,4427],{"class":3952},[3946,23488,23489,23491,23493,23495,23497,23500,23502,23504,23507,23509],{"class":3948,"line":6720},[3946,23490,7069],{"class":4251},[3946,23492,8914],{"class":4224},[3946,23494,10506],{"class":3952},[3946,23496,19989],{"class":4262},[3946,23498,23499],{"class":4262}," email",[3946,23501,4298],{"class":3952},[3946,23503,23148],{"class":4224},[3946,23505,23506],{"class":3952},"(), ",[3946,23508,19836],{"class":4262},[3946,23510,10726],{"class":3952},[3946,23512,23513],{"class":3948,"line":6732},[3946,23514,23515],{"class":4342},"      \u002F\u002F Успіх — RootNavigator автоматично перенаправить на App Stack\n",[3946,23517,23518,23520,23522,23524,23526],{"class":3948,"line":6743},[3946,23519,7115],{"class":3952},[3946,23521,4476],{"class":4251},[3946,23523,4479],{"class":3952},[3946,23525,19689],{"class":4262},[3946,23527,4318],{"class":3952},[3946,23529,23530],{"class":3948,"line":6754},[3946,23531,23532],{"class":4342},"      \u002F\u002F Помилка вже в контексті, показуємо Alert\n",[3946,23534,23535,23538,23540,23543],{"class":3948,"line":6768},[3946,23536,23537],{"class":4262},"      Alert",[3946,23539,4298],{"class":3952},[3946,23541,23542],{"class":4224},"alert",[3946,23544,6594],{"class":3952},[3946,23546,23547,23550],{"class":3948,"line":7572},[3946,23548,23549],{"class":3966},"        'Помилка входу'",[3946,23551,3970],{"class":3952},[3946,23553,23554,23557,23559,23562],{"class":3948,"line":7590},[3946,23555,23556],{"class":4262},"        error",[3946,23558,9745],{"class":3952},[3946,23560,23561],{"class":3966},"'Не вдалося увійти в систему'",[3946,23563,3970],{"class":3952},[3946,23565,23566,23569,23572,23575],{"class":3948,"line":7609},[3946,23567,23568],{"class":3952},"        [{ ",[3946,23570,23571],{"class":4262},"text:",[3946,23573,23574],{"class":3966}," 'OK'",[3946,23576,23577],{"class":3952}," }]\n",[3946,23579,23580],{"class":3948,"line":7615},[3946,23581,8984],{"class":3952},[3946,23583,23584],{"class":3948,"line":7633},[3946,23585,5550],{"class":3952},[3946,23587,23588],{"class":3948,"line":7638},[3946,23589,15539],{"class":3952},[3946,23591,23592],{"class":3948,"line":7644},[3946,23593,4278],{"emptyLinePlaceholder":4277},[3946,23595,23596],{"class":3948,"line":7677},[3946,23597,6908],{"class":4342},[3946,23599,23600],{"class":3948,"line":7682},[3946,23601,23602],{"class":4342},"   * Навігація на реєстрацію\n",[3946,23604,23605],{"class":3948,"line":7694},[3946,23606,6918],{"class":4342},[3946,23608,23609,23611,23614,23616,23618],{"class":3948,"line":7710},[3946,23610,5018],{"class":4255},[3946,23612,23613],{"class":4224}," handleNavigateToRegister",[3946,23615,18252],{"class":3952},[3946,23617,6453],{"class":4255},[3946,23619,4427],{"class":3952},[3946,23621,23622,23624],{"class":3948,"line":7715},[3946,23623,23449],{"class":4224},[3946,23625,4304],{"class":3952},[3946,23627,23628,23631,23633,23636,23638,23641],{"class":3948,"line":7720},[3946,23629,23630],{"class":4262},"    navigation",[3946,23632,4298],{"class":3952},[3946,23634,23635],{"class":4224},"navigate",[3946,23637,4331],{"class":3952},[3946,23639,23640],{"class":3966},"'Register'",[3946,23642,4337],{"class":3952},[3946,23644,23645],{"class":3948,"line":7729},[3946,23646,15539],{"class":3952},[3946,23648,23649],{"class":3948,"line":7734},[3946,23650,4278],{"emptyLinePlaceholder":4277},[3946,23652,23653,23655],{"class":3948,"line":7739},[3946,23654,5062],{"class":4251},[3946,23656,13079],{"class":3952},[3946,23658,23659,23661],{"class":3948,"line":7744},[3946,23660,13158],{"class":3952},[3946,23662,23663],{"class":4262},"KeyboardAvoidingView\n",[3946,23665,23666,23668,23670,23672],{"class":3948,"line":7750},[3946,23667,21472],{"class":4262},[3946,23669,13092],{"class":3952},[3946,23671,15105],{"class":4262},[3946,23673,4040],{"class":3952},[3946,23675,23676,23679,23682,23685,23687,23690,23692,23695,23697,23700],{"class":3948,"line":7755},[3946,23677,23678],{"class":4262},"      behavior",[3946,23680,23681],{"class":3952},"={Platform.",[3946,23683,23684],{"class":4286},"OS",[3946,23686,8816],{"class":3952},[3946,23688,23689],{"class":3966},"'ios'",[3946,23691,11523],{"class":3952},[3946,23693,23694],{"class":3966},"'padding'",[3946,23696,11532],{"class":3952},[3946,23698,23699],{"class":3966},"'height'",[3946,23701,4040],{"class":3952},[3946,23703,23704],{"class":3948,"line":7765},[3946,23705,13602],{"class":3952},[3946,23707,23708,23710],{"class":3948,"line":7777},[3946,23709,13084],{"class":3952},[3946,23711,23712],{"class":4262},"ScrollView\n",[3946,23714,23715,23718,23720,23723],{"class":3948,"line":7786},[3946,23716,23717],{"class":4262},"        contentContainerStyle",[3946,23719,13092],{"class":3952},[3946,23721,23722],{"class":4262},"scrollContent",[3946,23724,4040],{"class":3952},[3946,23726,23727,23730,23732],{"class":3948,"line":7799},[3946,23728,23729],{"class":4262},"        keyboardShouldPersistTaps",[3946,23731,13111],{"class":3952},[3946,23733,23734],{"class":3966},"\"handled\"\n",[3946,23736,23737],{"class":3948,"line":7818},[3946,23738,23739],{"class":3952},"      >\n",[3946,23741,23742,23745,23748],{"class":3948,"line":7823},[3946,23743,23744],{"class":3952},"        {",[3946,23746,23747],{"class":4342},"\u002F* Header *\u002F",[3946,23749,4040],{"class":3952},[3946,23751,23752,23754,23756,23758,23760,23763],{"class":3948,"line":7834},[3946,23753,13103],{"class":3952},[3946,23755,12926],{"class":4262},[3946,23757,13089],{"class":4262},[3946,23759,13092],{"class":3952},[3946,23761,23762],{"class":4262},"header",[3946,23764,13098],{"class":3952},[3946,23766,23767,23769,23771,23773,23775,23777,23779,23782,23785,23787,23789],{"class":3948,"line":7850},[3946,23768,15112],{"class":3952},[3946,23770,14762],{"class":4262},[3946,23772,13089],{"class":4262},[3946,23774,13092],{"class":3952},[3946,23776,15121],{"class":4262},[3946,23778,15124],{"class":3952},[3946,23780,23781],{"class":4262},"Секретні",[3946,23783,23784],{"class":4262}," Нотатки",[3946,23786,15133],{"class":3952},[3946,23788,14762],{"class":4262},[3946,23790,13135],{"class":3952},[3946,23792,23793,23795,23797,23799,23801,23804],{"class":3948,"line":7855},[3946,23794,15112],{"class":3952},[3946,23796,14762],{"class":4262},[3946,23798,13089],{"class":4262},[3946,23800,13092],{"class":3952},[3946,23802,23803],{"class":4262},"subtitle",[3946,23805,13098],{"class":3952},[3946,23807,23808,23811,23814,23816,23818,23821,23824],{"class":3948,"line":7860},[3946,23809,23810],{"class":4262},"            Увійдіть",[3946,23812,23813],{"class":4262}," для",[3946,23815,15385],{"class":4262},[3946,23817,15234],{"class":4262},[3946,23819,23820],{"class":4262}," ваших",[3946,23822,23823],{"class":4262}," приватних",[3946,23825,23826],{"class":4262}," нотаток\n",[3946,23828,23829,23831,23833],{"class":3948,"line":7891},[3946,23830,15182],{"class":3952},[3946,23832,14762],{"class":4262},[3946,23834,13135],{"class":3952},[3946,23836,23837,23839,23841],{"class":3948,"line":7896},[3946,23838,15256],{"class":3952},[3946,23840,12926],{"class":4262},[3946,23842,13135],{"class":3952},[3946,23844,23845],{"class":3948,"line":7901},[3946,23846,4278],{"emptyLinePlaceholder":4277},[3946,23848,23849,23851,23854],{"class":3948,"line":7906},[3946,23850,23744],{"class":3952},[3946,23852,23853],{"class":4342},"\u002F* Form *\u002F",[3946,23855,4040],{"class":3952},[3946,23857,23858,23860,23862,23864,23866,23869],{"class":3948,"line":7912},[3946,23859,13103],{"class":3952},[3946,23861,12926],{"class":4262},[3946,23863,13089],{"class":4262},[3946,23865,13092],{"class":3952},[3946,23867,23868],{"class":4262},"form",[3946,23870,13098],{"class":3952},[3946,23872,23873,23875],{"class":3948,"line":7917},[3946,23874,15112],{"class":3952},[3946,23876,23877],{"class":4262},"Input\n",[3946,23879,23880,23883,23885],{"class":3948,"line":7935},[3946,23881,23882],{"class":4262},"            label",[3946,23884,13111],{"class":3952},[3946,23886,23887],{"class":3966},"\"Email\"\n",[3946,23889,23890,23893,23895],{"class":3948,"line":7942},[3946,23891,23892],{"class":4262},"            placeholder",[3946,23894,13111],{"class":3952},[3946,23896,23897],{"class":3966},"\"example@email.com\"\n",[3946,23899,23900,23903,23905,23907],{"class":3948,"line":7963},[3946,23901,23902],{"class":4262},"            value",[3946,23904,12602],{"class":3952},[3946,23906,10853],{"class":4262},[3946,23908,4040],{"class":3952},[3946,23910,23911,23914,23916,23918],{"class":3948,"line":7979},[3946,23912,23913],{"class":4262},"            onChangeText",[3946,23915,12602],{"class":3952},[3946,23917,22981],{"class":4262},[3946,23919,4040],{"class":3952},[3946,23921,23922,23925,23928,23930],{"class":3948,"line":7992},[3946,23923,23924],{"class":4262},"            error",[3946,23926,23927],{"class":3952},"={validationErrors.",[3946,23929,10853],{"class":4262},[3946,23931,4040],{"class":3952},[3946,23933,23934,23937,23939],{"class":3948,"line":8012},[3946,23935,23936],{"class":4262},"            keyboardType",[3946,23938,13111],{"class":3952},[3946,23940,23941],{"class":3966},"\"email-address\"\n",[3946,23943,23944,23947,23949],{"class":3948,"line":8018},[3946,23945,23946],{"class":4262},"            autoCapitalize",[3946,23948,13111],{"class":3952},[3946,23950,23951],{"class":3966},"\"none\"\n",[3946,23953,23954,23957,23959],{"class":3948,"line":8023},[3946,23955,23956],{"class":4262},"            autoComplete",[3946,23958,13111],{"class":3952},[3946,23960,23961],{"class":3966},"\"email\"\n",[3946,23963,23964,23967,23970,23972],{"class":3948,"line":8028},[3946,23965,23966],{"class":4262},"            editable",[3946,23968,23969],{"class":3952},"={!",[3946,23971,13046],{"class":4262},[3946,23973,4040],{"class":3952},[3946,23975,23976],{"class":3948,"line":8033},[3946,23977,23978],{"class":3952},"          \u002F>\n",[3946,23980,23981],{"class":3948,"line":8038},[3946,23982,4278],{"emptyLinePlaceholder":4277},[3946,23984,23985,23987],{"class":3948,"line":8044},[3946,23986,15112],{"class":3952},[3946,23988,23877],{"class":4262},[3946,23990,23991,23993,23995],{"class":3948,"line":8049},[3946,23992,23882],{"class":4262},[3946,23994,13111],{"class":3952},[3946,23996,23997],{"class":3966},"\"Пароль\"\n",[3946,23999,24000,24002,24004],{"class":3948,"line":8071},[3946,24001,23892],{"class":4262},[3946,24003,13111],{"class":3952},[3946,24005,24006],{"class":3966},"\"Введіть пароль\"\n",[3946,24008,24009,24011,24013,24015],{"class":3948,"line":8090},[3946,24010,23902],{"class":4262},[3946,24012,12602],{"class":3952},[3946,24014,19836],{"class":4262},[3946,24016,4040],{"class":3952},[3946,24018,24019,24021,24023,24025],{"class":3948,"line":8095},[3946,24020,23913],{"class":4262},[3946,24022,12602],{"class":3952},[3946,24024,23005],{"class":4262},[3946,24026,4040],{"class":3952},[3946,24028,24029,24031,24033,24035],{"class":3948,"line":8112},[3946,24030,23924],{"class":4262},[3946,24032,23927],{"class":3952},[3946,24034,19836],{"class":4262},[3946,24036,4040],{"class":3952},[3946,24038,24039],{"class":3948,"line":8117},[3946,24040,24041],{"class":4262},"            secureTextEntry\n",[3946,24043,24044,24046,24048],{"class":3948,"line":8160},[3946,24045,23956],{"class":4262},[3946,24047,13111],{"class":3952},[3946,24049,24050],{"class":3966},"\"password\"\n",[3946,24052,24053,24055,24057,24059],{"class":3948,"line":8185},[3946,24054,23966],{"class":4262},[3946,24056,23969],{"class":3952},[3946,24058,13046],{"class":4262},[3946,24060,4040],{"class":3952},[3946,24062,24063],{"class":3948,"line":8190},[3946,24064,23978],{"class":3952},[3946,24066,24067],{"class":3948,"line":8195},[3946,24068,4278],{"emptyLinePlaceholder":4277},[3946,24070,24071,24073],{"class":3948,"line":8200},[3946,24072,15112],{"class":3952},[3946,24074,24075],{"class":4262},"Button\n",[3946,24077,24078,24081,24083],{"class":3948,"line":8206},[3946,24079,24080],{"class":4262},"            title",[3946,24082,13111],{"class":3952},[3946,24084,24085],{"class":3966},"\"Увійти\"\n",[3946,24087,24088,24090,24092,24095],{"class":3948,"line":9571},[3946,24089,15452],{"class":4262},[3946,24091,12602],{"class":3952},[3946,24093,24094],{"class":4262},"handleLogin",[3946,24096,4040],{"class":3952},[3946,24098,24099,24102,24104,24106],{"class":3948,"line":9589},[3946,24100,24101],{"class":4262},"            loading",[3946,24103,12602],{"class":3952},[3946,24105,13046],{"class":4262},[3946,24107,4040],{"class":3952},[3946,24109,24110,24112,24114,24117],{"class":3948,"line":9596},[3946,24111,15441],{"class":4262},[3946,24113,13092],{"class":3952},[3946,24115,24116],{"class":4262},"loginButton",[3946,24118,4040],{"class":3952},[3946,24120,24121],{"class":3948,"line":9618},[3946,24122,23978],{"class":3952},[3946,24124,24125],{"class":3948,"line":9627},[3946,24126,4278],{"emptyLinePlaceholder":4277},[3946,24128,24129,24131],{"class":3948,"line":9636},[3946,24130,15112],{"class":3952},[3946,24132,24075],{"class":4262},[3946,24134,24135,24137,24139],{"class":3948,"line":9645},[3946,24136,24080],{"class":4262},[3946,24138,13111],{"class":3952},[3946,24140,24141],{"class":3966},"\"Створити акаунт\"\n",[3946,24143,24144,24146,24148,24151],{"class":3948,"line":9650},[3946,24145,15452],{"class":4262},[3946,24147,12602],{"class":3952},[3946,24149,24150],{"class":4262},"handleNavigateToRegister",[3946,24152,4040],{"class":3952},[3946,24154,24155,24158,24160],{"class":3948,"line":9655},[3946,24156,24157],{"class":4262},"            variant",[3946,24159,13111],{"class":3952},[3946,24161,24162],{"class":3966},"\"outline\"\n",[3946,24164,24165,24168,24170,24172],{"class":3948,"line":9660},[3946,24166,24167],{"class":4262},"            disabled",[3946,24169,12602],{"class":3952},[3946,24171,13046],{"class":4262},[3946,24173,4040],{"class":3952},[3946,24175,24176],{"class":3948,"line":9665},[3946,24177,23978],{"class":3952},[3946,24179,24180,24182,24184],{"class":3948,"line":9671},[3946,24181,15256],{"class":3952},[3946,24183,12926],{"class":4262},[3946,24185,13135],{"class":3952},[3946,24187,24188],{"class":3948,"line":9676},[3946,24189,4278],{"emptyLinePlaceholder":4277},[3946,24191,24192,24194,24197],{"class":3948,"line":9700},[3946,24193,23744],{"class":3952},[3946,24195,24196],{"class":4342},"\u002F* Demo credentials *\u002F",[3946,24198,4040],{"class":3952},[3946,24200,24201,24203,24205,24207,24209,24212],{"class":3948,"line":9721},[3946,24202,13103],{"class":3952},[3946,24204,12926],{"class":4262},[3946,24206,13089],{"class":4262},[3946,24208,13092],{"class":3952},[3946,24210,24211],{"class":4262},"demoBox",[3946,24213,13098],{"class":3952},[3946,24215,24216,24218,24220,24222,24224,24227,24229,24232,24234,24237,24240,24242],{"class":3948,"line":9756},[3946,24217,15112],{"class":3952},[3946,24219,14762],{"class":4262},[3946,24221,13089],{"class":4262},[3946,24223,13092],{"class":3952},[3946,24225,24226],{"class":4262},"demoTitle",[3946,24228,15124],{"class":3952},[3946,24230,24231],{"class":4262},"Демо",[3946,24233,5121],{"class":3952},[3946,24235,24236],{"class":4224},"доступ",[3946,24238,24239],{"class":3952},":\u003C\u002F",[3946,24241,14762],{"class":4403},[3946,24243,13135],{"class":3952},[3946,24245,24246,24248,24250,24252,24254,24257,24259,24262,24264,24267,24269,24272,24274,24277,24279,24281],{"class":3948,"line":9778},[3946,24247,15112],{"class":3952},[3946,24249,14762],{"class":4262},[3946,24251,13089],{"class":4262},[3946,24253,13092],{"class":3952},[3946,24255,24256],{"class":4262},"demoText",[3946,24258,15124],{"class":3952},[3946,24260,24261],{"class":4262},"Email",[3946,24263,3963],{"class":3952},[3946,24265,24266],{"class":4403},"demo",[3946,24268,5132],{"class":3952},[3946,24270,24271],{"class":4403},"example",[3946,24273,4298],{"class":3952},[3946,24275,24276],{"class":4403},"com",[3946,24278,15133],{"class":3952},[3946,24280,14762],{"class":4403},[3946,24282,13135],{"class":3952},[3946,24284,24285,24287,24289,24291,24293,24295,24297,24300,24302,24305,24307,24309],{"class":3948,"line":9783},[3946,24286,15112],{"class":3952},[3946,24288,14762],{"class":4262},[3946,24290,13089],{"class":4262},[3946,24292,13092],{"class":3952},[3946,24294,24256],{"class":4262},[3946,24296,15124],{"class":3952},[3946,24298,24299],{"class":4262},"Пароль",[3946,24301,3963],{"class":3952},[3946,24303,24304],{"class":4403},"password123",[3946,24306,15133],{"class":3952},[3946,24308,14762],{"class":4403},[3946,24310,13135],{"class":3952},[3946,24312,24313,24315,24317],{"class":3948,"line":9789},[3946,24314,15256],{"class":3952},[3946,24316,12926],{"class":4262},[3946,24318,13135],{"class":3952},[3946,24320,24321,24323,24326],{"class":3948,"line":9801},[3946,24322,13130],{"class":3952},[3946,24324,24325],{"class":4262},"ScrollView",[3946,24327,13135],{"class":3952},[3946,24329,24330,24332,24335],{"class":3948,"line":9813},[3946,24331,13187],{"class":3952},[3946,24333,24334],{"class":4262},"KeyboardAvoidingView",[3946,24336,13135],{"class":3952},[3946,24338,24339],{"class":3948,"line":9830},[3946,24340,10875],{"class":3952},[3946,24342,24343],{"class":3948,"line":9840},[3946,24344,4040],{"class":3952},[3946,24346,24347],{"class":3948,"line":9856},[3946,24348,4278],{"emptyLinePlaceholder":4277},[3946,24350,24351,24353,24355,24357,24359,24361,24363],{"class":3948,"line":9866},[3946,24352,4283],{"class":4255},[3946,24354,13210],{"class":4286},[3946,24356,4290],{"class":3952},[3946,24358,12936],{"class":4262},[3946,24360,4298],{"class":3952},[3946,24362,8509],{"class":4224},[3946,24364,8512],{"class":3952},[3946,24366,24367,24369],{"class":3948,"line":9882},[3946,24368,15568],{"class":4262},[3946,24370,4427],{"class":3952},[3946,24372,24373,24375,24377],{"class":3948,"line":9892},[3946,24374,13232],{"class":4262},[3946,24376,13235],{"class":4020},[3946,24378,3970],{"class":3952},[3946,24380,24381,24383,24385],{"class":3948,"line":9908},[3946,24382,13261],{"class":4262},[3946,24384,13264],{"class":3966},[3946,24386,3970],{"class":3952},[3946,24388,24389],{"class":3948,"line":9918},[3946,24390,13271],{"class":3952},[3946,24392,24393,24396],{"class":3948,"line":9934},[3946,24394,24395],{"class":4262},"  scrollContent:",[3946,24397,4427],{"class":3952},[3946,24399,24400,24403,24405],{"class":3948,"line":9944},[3946,24401,24402],{"class":4262},"    flexGrow:",[3946,24404,13235],{"class":4020},[3946,24406,3970],{"class":3952},[3946,24408,24409,24411,24413],{"class":3948,"line":9960},[3946,24410,15599],{"class":4262},[3946,24412,15631],{"class":4020},[3946,24414,3970],{"class":3952},[3946,24416,24417,24419,24421],{"class":3948,"line":9970},[3946,24418,13242],{"class":4262},[3946,24420,13245],{"class":3966},[3946,24422,3970],{"class":3952},[3946,24424,24425],{"class":3948,"line":9986},[3946,24426,13271],{"class":3952},[3946,24428,24429,24432],{"class":3948,"line":9994},[3946,24430,24431],{"class":4262},"  header:",[3946,24433,4427],{"class":3952},[3946,24435,24436,24438,24441],{"class":3948,"line":10014},[3946,24437,15658],{"class":4262},[3946,24439,24440],{"class":4020}," 40",[3946,24442,3970],{"class":3952},[3946,24444,24445,24447,24449],{"class":3948,"line":10019},[3946,24446,13252],{"class":4262},[3946,24448,13245],{"class":3966},[3946,24450,3970],{"class":3952},[3946,24452,24453],{"class":3948,"line":10024},[3946,24454,13271],{"class":3952},[3946,24456,24457,24459],{"class":3948,"line":10029},[3946,24458,15621],{"class":4262},[3946,24460,4427],{"class":3952},[3946,24462,24463,24465,24468],{"class":3948,"line":10044},[3946,24464,15628],{"class":4262},[3946,24466,24467],{"class":4020}," 32",[3946,24469,3970],{"class":3952},[3946,24471,24472,24474,24476],{"class":3948,"line":10053},[3946,24473,15638],{"class":4262},[3946,24475,15641],{"class":3966},[3946,24477,3970],{"class":3952},[3946,24479,24480,24482,24484],{"class":3948,"line":10058},[3946,24481,15648],{"class":4262},[3946,24483,15651],{"class":3966},[3946,24485,3970],{"class":3952},[3946,24487,24488,24490,24492],{"class":3948,"line":10063},[3946,24489,15658],{"class":4262},[3946,24491,15755],{"class":4020},[3946,24493,3970],{"class":3952},[3946,24495,24496],{"class":3948,"line":10079},[3946,24497,13271],{"class":3952},[3946,24499,24500,24503],{"class":3948,"line":10084},[3946,24501,24502],{"class":4262},"  subtitle:",[3946,24504,4427],{"class":3952},[3946,24506,24507,24509,24511],{"class":3948,"line":10089},[3946,24508,15628],{"class":4262},[3946,24510,15681],{"class":4020},[3946,24512,3970],{"class":3952},[3946,24514,24515,24517,24519],{"class":3948,"line":10094},[3946,24516,15648],{"class":4262},[3946,24518,15690],{"class":3966},[3946,24520,3970],{"class":3952},[3946,24522,24523,24525,24527],{"class":3948,"line":10099},[3946,24524,15697],{"class":4262},[3946,24526,13245],{"class":3966},[3946,24528,3970],{"class":3952},[3946,24530,24531],{"class":3948,"line":11862},[3946,24532,13271],{"class":3952},[3946,24534,24535,24538],{"class":3948,"line":11871},[3946,24536,24537],{"class":4262},"  form:",[3946,24539,4427],{"class":3952},[3946,24541,24542,24544,24546],{"class":3948,"line":11876},[3946,24543,15658],{"class":4262},[3946,24545,15631],{"class":4020},[3946,24547,3970],{"class":3952},[3946,24549,24550],{"class":3948,"line":11881},[3946,24551,13271],{"class":3952},[3946,24553,24554,24557],{"class":3948,"line":11894},[3946,24555,24556],{"class":4262},"  loginButton:",[3946,24558,4427],{"class":3952},[3946,24560,24561,24563,24565],{"class":3948,"line":11899},[3946,24562,15658],{"class":4262},[3946,24564,15661],{"class":4020},[3946,24566,3970],{"class":3952},[3946,24568,24569],{"class":3948,"line":11904},[3946,24570,13271],{"class":3952},[3946,24572,24573,24576],{"class":3948,"line":11909},[3946,24574,24575],{"class":4262},"  demoBox:",[3946,24577,4427],{"class":3952},[3946,24579,24580,24582,24584],{"class":3948,"line":11915},[3946,24581,13261],{"class":4262},[3946,24583,22488],{"class":3966},[3946,24585,3970],{"class":3952},[3946,24587,24588,24590,24592],{"class":3948,"line":11920},[3946,24589,15599],{"class":4262},[3946,24591,15681],{"class":4020},[3946,24593,3970],{"class":3952},[3946,24595,24596,24598,24600],{"class":3948,"line":11941},[3946,24597,15752],{"class":4262},[3946,24599,15661],{"class":4020},[3946,24601,3970],{"class":3952},[3946,24603,24604,24606,24608],{"class":3948,"line":11948},[3946,24605,22655],{"class":4262},[3946,24607,15602],{"class":4020},[3946,24609,3970],{"class":3952},[3946,24611,24612],{"class":3948,"line":11961},[3946,24613,13271],{"class":3952},[3946,24615,24616,24619],{"class":3948,"line":11966},[3946,24617,24618],{"class":4262},"  demoTitle:",[3946,24620,4427],{"class":3952},[3946,24622,24623,24625,24627],{"class":3948,"line":11972},[3946,24624,15628],{"class":4262},[3946,24626,21643],{"class":4020},[3946,24628,3970],{"class":3952},[3946,24630,24631,24633,24635],{"class":3948,"line":11986},[3946,24632,15638],{"class":4262},[3946,24634,15791],{"class":3966},[3946,24636,3970],{"class":3952},[3946,24638,24639,24641,24643],{"class":3948,"line":11999},[3946,24640,15648],{"class":4262},[3946,24642,15651],{"class":3966},[3946,24644,3970],{"class":3952},[3946,24646,24647,24649,24651],{"class":3948,"line":12018},[3946,24648,15658],{"class":4262},[3946,24650,15755],{"class":4020},[3946,24652,3970],{"class":3952},[3946,24654,24655],{"class":3948,"line":12024},[3946,24656,13271],{"class":3952},[3946,24658,24659,24662],{"class":3948,"line":12034},[3946,24660,24661],{"class":4262},"  demoText:",[3946,24663,4427],{"class":3952},[3946,24665,24666,24668,24670],{"class":3948,"line":12040},[3946,24667,15628],{"class":4262},[3946,24669,15661],{"class":4020},[3946,24671,3970],{"class":3952},[3946,24673,24674,24676,24678],{"class":3948,"line":12053},[3946,24675,15648],{"class":4262},[3946,24677,15690],{"class":3966},[3946,24679,3970],{"class":3952},[3946,24681,24682,24684,24686],{"class":3948,"line":12058},[3946,24683,15658],{"class":4262},[3946,24685,22658],{"class":4020},[3946,24687,3970],{"class":3952},[3946,24689,24690],{"class":3948,"line":12064},[3946,24691,13271],{"class":3952},[3946,24693,24694],{"class":3948,"line":12071},[3946,24695,13276],{"class":3952},[3750,24697,24699],{"id":24698},"_76-register-screen","7.6. Register Screen",[3857,24701,24703],{"className":4242,"code":24702,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FRegisterScreen.tsx\n\nimport React, { useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  Alert,\n} from 'react-native';\nimport { NativeStackNavigationProp } from '@react-navigation\u002Fnative-stack';\nimport { AuthStackParamList } from '..\u002F..\u002F..\u002Fnavigation\u002FAuthNavigator';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\nimport { Input } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FInput';\nimport { Button } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FButton';\n\ntype RegisterScreenNavigationProp = NativeStackNavigationProp\u003C\n  AuthStackParamList,\n  'Register'\n>;\n\ninterface Props {\n  navigation: RegisterScreenNavigationProp;\n}\n\ninterface FormData {\n  name: string;\n  email: string;\n  password: string;\n  confirmPassword: string;\n}\n\nexport function RegisterScreen({ navigation }: Props) {\n  const { register, isLoading, error, clearError } = useAuth();\n  \n  const [formData, setFormData] = useState\u003CFormData>({\n    name: '',\n    email: '',\n    password: '',\n    confirmPassword: '',\n  });\n  \n  const [validationErrors, setValidationErrors] = useState\u003C\n    Partial\u003CFormData>\n  >({});\n\n  \u002F**\n   * Оновлення поля форми\n   *\u002F\n  const updateField = (field: keyof FormData, value: string) => {\n    setFormData((prev) => ({ ...prev, [field]: value }));\n    \u002F\u002F Очищаємо помилку при введенні\n    if (validationErrors[field]) {\n      setValidationErrors((prev) => ({ ...prev, [field]: '' }));\n    }\n  };\n\n  \u002F**\n   * Валідація форми\n   *\u002F\n  const validateForm = (): boolean => {\n    const errors: Partial\u003CFormData> = {};\n    let isValid = true;\n\n    \u002F\u002F Name validation\n    if (!formData.name.trim()) {\n      errors.name = 'Ім\\'я обов\\'язкове';\n      isValid = false;\n    } else if (formData.name.trim().length \u003C 2) {\n      errors.name = 'Ім\\'я повинно містити мінімум 2 символи';\n      isValid = false;\n    }\n\n    \u002F\u002F Email validation\n    if (!formData.email.trim()) {\n      errors.email = 'Email обов\\'язковий';\n      isValid = false;\n    } else if (!\u002F^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\u002F.test(formData.email)) {\n      errors.email = 'Невірний формат email';\n      isValid = false;\n    }\n\n    \u002F\u002F Password validation\n    if (!formData.password) {\n      errors.password = 'Пароль обов\\'язковий';\n      isValid = false;\n    } else if (formData.password.length \u003C 8) {\n      errors.password = 'Пароль повинен містити мінімум 8 символів';\n      isValid = false;\n    } else if (!\u002F(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)\u002F.test(formData.password)) {\n      errors.password =\n        'Пароль повинен містити великі, малі літери та цифри';\n      isValid = false;\n    }\n\n    \u002F\u002F Confirm password validation\n    if (!formData.confirmPassword) {\n      errors.confirmPassword = 'Підтвердження паролю обов\\'язкове';\n      isValid = false;\n    } else if (formData.password !== formData.confirmPassword) {\n      errors.confirmPassword = 'Паролі не співпадають';\n      isValid = false;\n    }\n\n    setValidationErrors(errors);\n    return isValid;\n  };\n\n  \u002F**\n   * Обробка реєстрації\n   *\u002F\n  const handleRegister = async () => {\n    clearError();\n    \n    if (!validateForm()) {\n      return;\n    }\n\n    try {\n      await register({\n        name: formData.name.trim(),\n        email: formData.email.trim(),\n        password: formData.password,\n        confirmPassword: formData.confirmPassword,\n      });\n      \u002F\u002F Успіх — автоматичний перехід на App Stack\n    } catch (err) {\n      Alert.alert(\n        'Помилка реєстрації',\n        error || 'Не вдалося створити акаунт',\n        [{ text: 'OK' }]\n      );\n    }\n  };\n\n  \u002F**\n   * Повернення на екран входу\n   *\u002F\n  const handleBackToLogin = () => {\n    clearError();\n    navigation.goBack();\n  };\n\n  return (\n    \u003CKeyboardAvoidingView\n      style={styles.container}\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n    >\n      \u003CScrollView\n        contentContainerStyle={styles.scrollContent}\n        keyboardShouldPersistTaps=\"handled\"\n      >\n        {\u002F* Header *\u002F}\n        \u003CView style={styles.header}>\n          \u003CText style={styles.title}>Створити акаунт\u003C\u002FText>\n          \u003CText style={styles.subtitle}>\n            Заповніть форму для реєстрації\n          \u003C\u002FText>\n        \u003C\u002FView>\n\n        {\u002F* Form *\u002F}\n        \u003CView style={styles.form}>\n          \u003CInput\n            label=\"Ім'я\"\n            placeholder=\"Ваше ім'я\"\n            value={formData.name}\n            onChangeText={(value) => updateField('name', value)}\n            error={validationErrors.name}\n            autoComplete=\"name\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CInput\n            label=\"Email\"\n            placeholder=\"example@email.com\"\n            value={formData.email}\n            onChangeText={(value) => updateField('email', value)}\n            error={validationErrors.email}\n            keyboardType=\"email-address\"\n            autoCapitalize=\"none\"\n            autoComplete=\"email\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CInput\n            label=\"Пароль\"\n            placeholder=\"Мінімум 8 символів\"\n            value={formData.password}\n            onChangeText={(value) => updateField('password', value)}\n            error={validationErrors.password}\n            secureTextEntry\n            autoComplete=\"password-new\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CInput\n            label=\"Підтвердження паролю\"\n            placeholder=\"Повторіть пароль\"\n            value={formData.confirmPassword}\n            onChangeText={(value) => updateField('confirmPassword', value)}\n            error={validationErrors.confirmPassword}\n            secureTextEntry\n            autoComplete=\"password-new\"\n            editable={!isLoading}\n          \u002F>\n\n          \u003CButton\n            title=\"Зареєструватися\"\n            onPress={handleRegister}\n            loading={isLoading}\n            style={styles.registerButton}\n          \u002F>\n\n          \u003CButton\n            title=\"Вже є акаунт? Увійти\"\n            onPress={handleBackToLogin}\n            variant=\"outline\"\n            disabled={isLoading}\n          \u002F>\n        \u003C\u002FView>\n      \u003C\u002FScrollView>\n    \u003C\u002FKeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  scrollContent: {\n    flexGrow: 1,\n    padding: 24,\n    justifyContent: 'center',\n  },\n  header: {\n    marginBottom: 40,\n    alignItems: 'center',\n  },\n  title: {\n    fontSize: 32,\n    fontWeight: 'bold',\n    color: '#000000',\n    marginBottom: 8,\n  },\n  subtitle: {\n    fontSize: 16,\n    color: '#666666',\n    textAlign: 'center',\n  },\n  form: {\n    marginBottom: 24,\n  },\n  registerButton: {\n    marginBottom: 12,\n  },\n});\n",[3782,24704,24705,24710,24714,24732,24738,24744,24750,24756,24762,24768,24774,24780,24790,24806,24822,24838,24854,24870,24874,24887,24893,24898,24902,24906,24914,24925,24929,24933,24942,24952,24962,24972,24982,24986,24990,25009,25035,25039,25064,25072,25080,25088,25097,25101,25105,25123,25134,25139,25143,25147,25152,25156,25189,25215,25220,25235,25260,25264,25268,25272,25276,25280,25284,25298,25315,25327,25331,25336,25354,25379,25389,25420,25439,25449,25453,25457,25461,25479,25497,25507,25567,25581,25591,25595,25599,25603,25617,25635,25645,25672,25687,25697,25762,25772,25779,25789,25793,25797,25802,25817,25836,25846,25872,25887,25897,25901,25905,25915,25923,25927,25931,25935,25940,25944,25961,25967,25971,25981,25987,25991,25995,26001,26009,26027,26044,26057,26070,26074,26079,26091,26101,26108,26119,26129,26133,26137,26141,26145,26149,26154,26158,26171,26177,26187,26191,26195,26201,26207,26217,26239,26243,26249,26259,26267,26271,26279,26293,26319,26333,26346,26354,26362,26366,26374,26388,26394,26403,26412,26423,26445,26455,26464,26474,26478,26482,26488,26496,26504,26514,26533,26543,26551,26559,26567,26577,26581,26585,26591,26599,26608,26618,26637,26647,26651,26660,26670,26674,26678,26684,26693,26702,26712,26731,26741,26745,26753,26763,26767,26771,26777,26786,26797,26807,26818,26822,26826,26832,26841,26852,26860,26870,26874,26882,26890,26898,26902,26906,26910,26926,26932,26940,26948,26952,26958,26966,26974,26982,26986,26992,27000,27008,27012,27018,27026,27034,27042,27050,27054,27060,27068,27076,27084,27088,27094,27102,27106,27113,27121,27125],{"__ignoreMap":3865},[3946,24706,24707],{"class":3948,"line":3949},[3946,24708,24709],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FRegisterScreen.tsx\n",[3946,24711,24712],{"class":3948,"line":3956},[3946,24713,4278],{"emptyLinePlaceholder":4277},[3946,24715,24716,24718,24720,24722,24724,24726,24728,24730],{"class":3948,"line":3973},[3946,24717,4252],{"class":4251},[3946,24719,10244],{"class":4262},[3946,24721,8290],{"class":3952},[3946,24723,10543],{"class":4262},[3946,24725,6823],{"class":3952},[3946,24727,6826],{"class":4251},[3946,24729,10304],{"class":3966},[3946,24731,4272],{"class":3952},[3946,24733,24734,24736],{"class":3948,"line":3986},[3946,24735,4252],{"class":4251},[3946,24737,4427],{"class":3952},[3946,24739,24740,24742],{"class":3948,"line":3999},[3946,24741,21895],{"class":4262},[3946,24743,3970],{"class":3952},[3946,24745,24746,24748],{"class":3948,"line":4012},[3946,24747,21283],{"class":4262},[3946,24749,3970],{"class":3952},[3946,24751,24752,24754],{"class":3948,"line":4026},[3946,24753,21290],{"class":4262},[3946,24755,3970],{"class":3952},[3946,24757,24758,24760],{"class":3948,"line":4037},[3946,24759,22733],{"class":4262},[3946,24761,3970],{"class":3952},[3946,24763,24764,24766],{"class":3948,"line":4487},[3946,24765,22740],{"class":4262},[3946,24767,3970],{"class":3952},[3946,24769,24770,24772],{"class":3948,"line":4507},[3946,24771,22747],{"class":4262},[3946,24773,3970],{"class":3952},[3946,24775,24776,24778],{"class":3948,"line":4518},[3946,24777,22754],{"class":4262},[3946,24779,3970],{"class":3952},[3946,24781,24782,24784,24786,24788],{"class":3948,"line":4524},[3946,24783,5928],{"class":3952},[3946,24785,6826],{"class":4251},[3946,24787,12943],{"class":3966},[3946,24789,4272],{"class":3952},[3946,24791,24792,24794,24796,24798,24800,24802,24804],{"class":3948,"line":4529},[3946,24793,4252],{"class":4251},[3946,24795,6817],{"class":3952},[3946,24797,22775],{"class":4262},[3946,24799,6823],{"class":3952},[3946,24801,6826],{"class":4251},[3946,24803,13355],{"class":3966},[3946,24805,4272],{"class":3952},[3946,24807,24808,24810,24812,24814,24816,24818,24820],{"class":3948,"line":4534},[3946,24809,4252],{"class":4251},[3946,24811,6817],{"class":3952},[3946,24813,13497],{"class":4262},[3946,24815,6823],{"class":3952},[3946,24817,6826],{"class":4251},[3946,24819,22798],{"class":3966},[3946,24821,4272],{"class":3952},[3946,24823,24824,24826,24828,24830,24832,24834,24836],{"class":3948,"line":4540},[3946,24825,4252],{"class":4251},[3946,24827,6817],{"class":3952},[3946,24829,12954],{"class":4262},[3946,24831,6823],{"class":3952},[3946,24833,6826],{"class":4251},[3946,24835,14794],{"class":3966},[3946,24837,4272],{"class":3952},[3946,24839,24840,24842,24844,24846,24848,24850,24852],{"class":3948,"line":4567},[3946,24841,4252],{"class":4251},[3946,24843,6817],{"class":3952},[3946,24845,22825],{"class":4262},[3946,24847,6823],{"class":3952},[3946,24849,6826],{"class":4251},[3946,24851,22832],{"class":3966},[3946,24853,4272],{"class":3952},[3946,24855,24856,24858,24860,24862,24864,24866,24868],{"class":3948,"line":4574},[3946,24857,4252],{"class":4251},[3946,24859,6817],{"class":3952},[3946,24861,22843],{"class":4262},[3946,24863,6823],{"class":3952},[3946,24865,6826],{"class":4251},[3946,24867,22850],{"class":3966},[3946,24869,4272],{"class":3952},[3946,24871,24872],{"class":3948,"line":4600},[3946,24873,4278],{"emptyLinePlaceholder":4277},[3946,24875,24876,24878,24881,24883,24885],{"class":3948,"line":4610},[3946,24877,22861],{"class":4255},[3946,24879,24880],{"class":4403}," RegisterScreenNavigationProp",[3946,24882,4290],{"class":3952},[3946,24884,22775],{"class":4403},[3946,24886,22871],{"class":3952},[3946,24888,24889,24891],{"class":3948,"line":4623},[3946,24890,22876],{"class":4403},[3946,24892,3970],{"class":3952},[3946,24894,24895],{"class":3948,"line":4643},[3946,24896,24897],{"class":3966},"  'Register'\n",[3946,24899,24900],{"class":3948,"line":4653},[3946,24901,6463],{"class":3952},[3946,24903,24904],{"class":3948,"line":4658},[3946,24905,4278],{"emptyLinePlaceholder":4277},[3946,24907,24908,24910,24912],{"class":3948,"line":4663},[3946,24909,4801],{"class":4255},[3946,24911,17922],{"class":4403},[3946,24913,4427],{"class":3952},[3946,24915,24916,24918,24920,24923],{"class":3948,"line":4668},[3946,24917,22904],{"class":4262},[3946,24919,3963],{"class":3952},[3946,24921,24922],{"class":4403},"RegisterScreenNavigationProp",[3946,24924,4272],{"class":3952},[3946,24926,24927],{"class":3948,"line":4674},[3946,24928,4040],{"class":3952},[3946,24930,24931],{"class":3948,"line":4694},[3946,24932,4278],{"emptyLinePlaceholder":4277},[3946,24934,24935,24937,24940],{"class":3948,"line":4701},[3946,24936,4801],{"class":4255},[3946,24938,24939],{"class":4403}," FormData",[3946,24941,4427],{"class":3952},[3946,24943,24944,24946,24948,24950],{"class":3948,"line":4719},[3946,24945,6065],{"class":4262},[3946,24947,3963],{"class":3952},[3946,24949,4404],{"class":4403},[3946,24951,4272],{"class":3952},[3946,24953,24954,24956,24958,24960],{"class":3948,"line":4735},[3946,24955,6054],{"class":4262},[3946,24957,3963],{"class":3952},[3946,24959,4404],{"class":4403},[3946,24961,4272],{"class":3952},[3946,24963,24964,24966,24968,24970],{"class":3948,"line":4748},[3946,24965,6151],{"class":4262},[3946,24967,3963],{"class":3952},[3946,24969,4404],{"class":4403},[3946,24971,4272],{"class":3952},[3946,24973,24974,24976,24978,24980],{"class":3948,"line":4768},[3946,24975,6209],{"class":4262},[3946,24977,3963],{"class":3952},[3946,24979,4404],{"class":4403},[3946,24981,4272],{"class":3952},[3946,24983,24984],{"class":3948,"line":4777},[3946,24985,4040],{"class":3952},[3946,24987,24988],{"class":3948,"line":4782},[3946,24989,4278],{"emptyLinePlaceholder":4277},[3946,24991,24992,24994,24996,24999,25001,25003,25005,25007],{"class":3948,"line":6262},[3946,24993,6030],{"class":4251},[3946,24995,4390],{"class":4255},[3946,24997,24998],{"class":4224}," RegisterScreen",[3946,25000,10506],{"class":3952},[3946,25002,16226],{"class":4262},[3946,25004,10512],{"class":3952},[3946,25006,18038],{"class":4403},[3946,25008,4318],{"class":3952},[3946,25010,25011,25013,25015,25017,25019,25021,25023,25025,25027,25029,25031,25033],{"class":3948,"line":6273},[3946,25012,5018],{"class":4255},[3946,25014,6817],{"class":3952},[3946,25016,11702],{"class":4286},[3946,25018,4447],{"class":3952},[3946,25020,13046],{"class":4286},[3946,25022,4447],{"class":3952},[3946,25024,4482],{"class":4286},[3946,25026,4447],{"class":3952},[3946,25028,12569],{"class":4286},[3946,25030,13049],{"class":3952},[3946,25032,12954],{"class":4224},[3946,25034,4304],{"class":3952},[3946,25036,25037],{"class":3948,"line":6284},[3946,25038,5795],{"class":3952},[3946,25040,25041,25043,25045,25048,25050,25053,25055,25057,25059,25062],{"class":3948,"line":6299},[3946,25042,5018],{"class":4255},[3946,25044,10529],{"class":3952},[3946,25046,25047],{"class":4286},"formData",[3946,25049,4447],{"class":3952},[3946,25051,25052],{"class":4286},"setFormData",[3946,25054,10540],{"class":3952},[3946,25056,10543],{"class":4224},[3946,25058,4413],{"class":3952},[3946,25060,25061],{"class":4403},"FormData",[3946,25063,10551],{"class":3952},[3946,25065,25066,25068,25070],{"class":3948,"line":6304},[3946,25067,19392],{"class":4262},[3946,25069,23042],{"class":3966},[3946,25071,3970],{"class":3952},[3946,25073,25074,25076,25078],{"class":3948,"line":6309},[3946,25075,19369],{"class":4262},[3946,25077,23042],{"class":3966},[3946,25079,3970],{"class":3952},[3946,25081,25082,25084,25086],{"class":3948,"line":6314},[3946,25083,19379],{"class":4262},[3946,25085,23042],{"class":3966},[3946,25087,3970],{"class":3952},[3946,25089,25090,25093,25095],{"class":3948,"line":6320},[3946,25091,25092],{"class":4262},"    confirmPassword:",[3946,25094,23042],{"class":3966},[3946,25096,3970],{"class":3952},[3946,25098,25099],{"class":3948,"line":6325},[3946,25100,4977],{"class":3952},[3946,25102,25103],{"class":3948,"line":6337},[3946,25104,5795],{"class":3952},[3946,25106,25107,25109,25111,25113,25115,25117,25119,25121],{"class":3948,"line":6352},[3946,25108,5018],{"class":4255},[3946,25110,10529],{"class":3952},[3946,25112,23024],{"class":4286},[3946,25114,4447],{"class":3952},[3946,25116,23029],{"class":4286},[3946,25118,10540],{"class":3952},[3946,25120,10543],{"class":4262},[3946,25122,22871],{"class":3952},[3946,25124,25125,25128,25130,25132],{"class":3948,"line":6364},[3946,25126,25127],{"class":4262},"    Partial",[3946,25129,4413],{"class":3952},[3946,25131,25061],{"class":4262},[3946,25133,13135],{"class":3952},[3946,25135,25136],{"class":3948,"line":6376},[3946,25137,25138],{"class":3952},"  >({});\n",[3946,25140,25141],{"class":3948,"line":6392},[3946,25142,4278],{"emptyLinePlaceholder":4277},[3946,25144,25145],{"class":3948,"line":6397},[3946,25146,6908],{"class":4342},[3946,25148,25149],{"class":3948,"line":6402},[3946,25150,25151],{"class":4342},"   * Оновлення поля форми\n",[3946,25153,25154],{"class":3948,"line":6407},[3946,25155,6918],{"class":4342},[3946,25157,25158,25160,25163,25166,25169,25171,25173,25175,25177,25179,25181,25183,25185,25187],{"class":3948,"line":6413},[3946,25159,5018],{"class":4255},[3946,25161,25162],{"class":4224}," updateField",[3946,25164,25165],{"class":3952}," = (",[3946,25167,25168],{"class":4262},"field",[3946,25170,3963],{"class":3952},[3946,25172,14105],{"class":4255},[3946,25174,24939],{"class":4403},[3946,25176,4447],{"class":3952},[3946,25178,12605],{"class":4262},[3946,25180,3963],{"class":3952},[3946,25182,4404],{"class":4403},[3946,25184,5783],{"class":3952},[3946,25186,6453],{"class":4255},[3946,25188,4427],{"class":3952},[3946,25190,25191,25194,25196,25198,25200,25202,25204,25206,25208,25211,25213],{"class":3948,"line":6418},[3946,25192,25193],{"class":4224},"    setFormData",[3946,25195,8135],{"class":3952},[3946,25197,10654],{"class":4262},[3946,25199,5783],{"class":3952},[3946,25201,6453],{"class":4255},[3946,25203,10661],{"class":3952},[3946,25205,10654],{"class":4262},[3946,25207,4447],{"class":3952},[3946,25209,25210],{"class":4262},"[field]:",[3946,25212,12462],{"class":4262},[3946,25214,10671],{"class":3952},[3946,25216,25217],{"class":3948,"line":6434},[3946,25218,25219],{"class":4342},"    \u002F\u002F Очищаємо помилку при введенні\n",[3946,25221,25222,25224,25226,25228,25230,25232],{"class":3948,"line":6466},[3946,25223,5503],{"class":4251},[3946,25225,4479],{"class":3952},[3946,25227,23024],{"class":4262},[3946,25229,19575],{"class":3952},[3946,25231,25168],{"class":4262},[3946,25233,25234],{"class":3952},"]) {\n",[3946,25236,25237,25240,25242,25244,25246,25248,25250,25252,25254,25256,25258],{"class":3948,"line":6493},[3946,25238,25239],{"class":4224},"      setValidationErrors",[3946,25241,8135],{"class":3952},[3946,25243,10654],{"class":4262},[3946,25245,5783],{"class":3952},[3946,25247,6453],{"class":4255},[3946,25249,10661],{"class":3952},[3946,25251,10654],{"class":4262},[3946,25253,4447],{"class":3952},[3946,25255,25210],{"class":4262},[3946,25257,23042],{"class":3966},[3946,25259,10671],{"class":3952},[3946,25261,25262],{"class":3948,"line":6512},[3946,25263,5550],{"class":3952},[3946,25265,25266],{"class":3948,"line":6530},[3946,25267,15539],{"class":3952},[3946,25269,25270],{"class":3948,"line":6545},[3946,25271,4278],{"emptyLinePlaceholder":4277},[3946,25273,25274],{"class":3948,"line":6550},[3946,25275,6908],{"class":4342},[3946,25277,25278],{"class":3948,"line":6555},[3946,25279,23069],{"class":4342},[3946,25281,25282],{"class":3948,"line":6560},[3946,25283,6918],{"class":4342},[3946,25285,25286,25288,25290,25292,25294,25296],{"class":3948,"line":6566},[3946,25287,5018],{"class":4255},[3946,25289,23080],{"class":4224},[3946,25291,23083],{"class":3952},[3946,25293,4848],{"class":4403},[3946,25295,23088],{"class":4255},[3946,25297,4427],{"class":3952},[3946,25299,25300,25302,25304,25306,25308,25310,25312],{"class":3948,"line":6571},[3946,25301,4577],{"class":4255},[3946,25303,23097],{"class":4286},[3946,25305,3963],{"class":3952},[3946,25307,10633],{"class":4403},[3946,25309,4413],{"class":3952},[3946,25311,25061],{"class":4403},[3946,25313,25314],{"class":3952},"> = {};\n",[3946,25316,25317,25319,25321,25323,25325],{"class":3948,"line":6588},[3946,25318,23118],{"class":4255},[3946,25320,7649],{"class":4262},[3946,25322,4290],{"class":3952},[3946,25324,17493],{"class":4255},[3946,25326,4272],{"class":3952},[3946,25328,25329],{"class":3948,"line":6597},[3946,25330,4278],{"emptyLinePlaceholder":4277},[3946,25332,25333],{"class":3948,"line":6609},[3946,25334,25335],{"class":4342},"    \u002F\u002F Name validation\n",[3946,25337,25338,25340,25342,25344,25346,25348,25350,25352],{"class":3948,"line":6640},[3946,25339,5503],{"class":4251},[3946,25341,4312],{"class":3952},[3946,25343,25047],{"class":4262},[3946,25345,4298],{"class":3952},[3946,25347,6679],{"class":4262},[3946,25349,4298],{"class":3952},[3946,25351,23148],{"class":4224},[3946,25353,23151],{"class":3952},[3946,25355,25356,25358,25360,25362,25364,25367,25369,25372,25374,25377],{"class":3948,"line":6653},[3946,25357,23156],{"class":4262},[3946,25359,4298],{"class":3952},[3946,25361,6679],{"class":4262},[3946,25363,4290],{"class":3952},[3946,25365,25366],{"class":3966},"'Ім",[3946,25368,23169],{"class":23168},[3946,25370,25371],{"class":3966},"я обов",[3946,25373,23169],{"class":23168},[3946,25375,25376],{"class":3966},"язкове'",[3946,25378,4272],{"class":3952},[3946,25380,25381,25383,25385,25387],{"class":3948,"line":6659},[3946,25382,23179],{"class":4262},[3946,25384,4290],{"class":3952},[3946,25386,13575],{"class":4255},[3946,25388,4272],{"class":3952},[3946,25390,25391,25393,25395,25397,25399,25401,25403,25405,25407,25409,25411,25413,25415,25418],{"class":3948,"line":6671},[3946,25392,7115],{"class":3952},[3946,25394,23192],{"class":4251},[3946,25396,23195],{"class":4251},[3946,25398,4479],{"class":3952},[3946,25400,25047],{"class":4262},[3946,25402,4298],{"class":3952},[3946,25404,6679],{"class":4262},[3946,25406,4298],{"class":3952},[3946,25408,23148],{"class":4224},[3946,25410,19482],{"class":3952},[3946,25412,20355],{"class":4262},[3946,25414,16838],{"class":3952},[3946,25416,25417],{"class":4020},"2",[3946,25419,4318],{"class":3952},[3946,25421,25422,25424,25426,25428,25430,25432,25434,25437],{"class":3948,"line":6689},[3946,25423,23156],{"class":4262},[3946,25425,4298],{"class":3952},[3946,25427,6679],{"class":4262},[3946,25429,4290],{"class":3952},[3946,25431,25366],{"class":3966},[3946,25433,23169],{"class":23168},[3946,25435,25436],{"class":3966},"я повинно містити мінімум 2 символи'",[3946,25438,4272],{"class":3952},[3946,25440,25441,25443,25445,25447],{"class":3948,"line":6694},[3946,25442,23179],{"class":4262},[3946,25444,4290],{"class":3952},[3946,25446,13575],{"class":4255},[3946,25448,4272],{"class":3952},[3946,25450,25451],{"class":3948,"line":6699},[3946,25452,5550],{"class":3952},[3946,25454,25455],{"class":3948,"line":6704},[3946,25456,4278],{"emptyLinePlaceholder":4277},[3946,25458,25459],{"class":3948,"line":6709},[3946,25460,23135],{"class":4342},[3946,25462,25463,25465,25467,25469,25471,25473,25475,25477],{"class":3948,"line":6715},[3946,25464,5503],{"class":4251},[3946,25466,4312],{"class":3952},[3946,25468,25047],{"class":4262},[3946,25470,4298],{"class":3952},[3946,25472,10853],{"class":4262},[3946,25474,4298],{"class":3952},[3946,25476,23148],{"class":4224},[3946,25478,23151],{"class":3952},[3946,25480,25481,25483,25485,25487,25489,25491,25493,25495],{"class":3948,"line":6720},[3946,25482,23156],{"class":4262},[3946,25484,4298],{"class":3952},[3946,25486,10853],{"class":4262},[3946,25488,4290],{"class":3952},[3946,25490,23165],{"class":3966},[3946,25492,23169],{"class":23168},[3946,25494,23172],{"class":3966},[3946,25496,4272],{"class":3952},[3946,25498,25499,25501,25503,25505],{"class":3948,"line":6732},[3946,25500,23179],{"class":4262},[3946,25502,4290],{"class":3952},[3946,25504,13575],{"class":4255},[3946,25506,4272],{"class":3952},[3946,25508,25509,25511,25513,25515,25517,25519,25521,25523,25525,25527,25529,25531,25533,25535,25537,25539,25541,25543,25545,25547,25549,25551,25553,25555,25557,25559,25561,25563,25565],{"class":3948,"line":6743},[3946,25510,7115],{"class":3952},[3946,25512,23192],{"class":4251},[3946,25514,23195],{"class":4251},[3946,25516,4312],{"class":3952},[3946,25518,5129],{"class":16996},[3946,25520,23202],{"class":17000},[3946,25522,23206],{"class":23205},[3946,25524,23209],{"class":16996},[3946,25526,23212],{"class":23205},[3946,25528,23216],{"class":23215},[3946,25530,5132],{"class":16996},[3946,25532,23206],{"class":23205},[3946,25534,23209],{"class":16996},[3946,25536,23212],{"class":23205},[3946,25538,23216],{"class":23215},[3946,25540,23229],{"class":23168},[3946,25542,23206],{"class":23205},[3946,25544,23209],{"class":16996},[3946,25546,23212],{"class":23205},[3946,25548,23216],{"class":23215},[3946,25550,23240],{"class":17000},[3946,25552,5129],{"class":16996},[3946,25554,4298],{"class":3952},[3946,25556,23247],{"class":4224},[3946,25558,4331],{"class":3952},[3946,25560,25047],{"class":4262},[3946,25562,4298],{"class":3952},[3946,25564,10853],{"class":4262},[3946,25566,9718],{"class":3952},[3946,25568,25569,25571,25573,25575,25577,25579],{"class":3948,"line":6754},[3946,25570,23156],{"class":4262},[3946,25572,4298],{"class":3952},[3946,25574,10853],{"class":4262},[3946,25576,4290],{"class":3952},[3946,25578,23266],{"class":3966},[3946,25580,4272],{"class":3952},[3946,25582,25583,25585,25587,25589],{"class":3948,"line":6768},[3946,25584,23179],{"class":4262},[3946,25586,4290],{"class":3952},[3946,25588,13575],{"class":4255},[3946,25590,4272],{"class":3952},[3946,25592,25593],{"class":3948,"line":7572},[3946,25594,5550],{"class":3952},[3946,25596,25597],{"class":3948,"line":7590},[3946,25598,4278],{"emptyLinePlaceholder":4277},[3946,25600,25601],{"class":3948,"line":7609},[3946,25602,23291],{"class":4342},[3946,25604,25605,25607,25609,25611,25613,25615],{"class":3948,"line":7615},[3946,25606,5503],{"class":4251},[3946,25608,4312],{"class":3952},[3946,25610,25047],{"class":4262},[3946,25612,4298],{"class":3952},[3946,25614,19836],{"class":4262},[3946,25616,4318],{"class":3952},[3946,25618,25619,25621,25623,25625,25627,25629,25631,25633],{"class":3948,"line":7633},[3946,25620,23156],{"class":4262},[3946,25622,4298],{"class":3952},[3946,25624,19836],{"class":4262},[3946,25626,4290],{"class":3952},[3946,25628,23314],{"class":3966},[3946,25630,23169],{"class":23168},[3946,25632,23172],{"class":3966},[3946,25634,4272],{"class":3952},[3946,25636,25637,25639,25641,25643],{"class":3948,"line":7638},[3946,25638,23179],{"class":4262},[3946,25640,4290],{"class":3952},[3946,25642,13575],{"class":4255},[3946,25644,4272],{"class":3952},[3946,25646,25647,25649,25651,25653,25655,25657,25659,25661,25663,25665,25667,25670],{"class":3948,"line":7644},[3946,25648,7115],{"class":3952},[3946,25650,23192],{"class":4251},[3946,25652,23195],{"class":4251},[3946,25654,4479],{"class":3952},[3946,25656,25047],{"class":4262},[3946,25658,4298],{"class":3952},[3946,25660,19836],{"class":4262},[3946,25662,4298],{"class":3952},[3946,25664,20355],{"class":4262},[3946,25666,16838],{"class":3952},[3946,25668,25669],{"class":4020},"8",[3946,25671,4318],{"class":3952},[3946,25673,25674,25676,25678,25680,25682,25685],{"class":3948,"line":7677},[3946,25675,23156],{"class":4262},[3946,25677,4298],{"class":3952},[3946,25679,19836],{"class":4262},[3946,25681,4290],{"class":3952},[3946,25683,25684],{"class":3966},"'Пароль повинен містити мінімум 8 символів'",[3946,25686,4272],{"class":3952},[3946,25688,25689,25691,25693,25695],{"class":3948,"line":7682},[3946,25690,23179],{"class":4262},[3946,25692,4290],{"class":3952},[3946,25694,13575],{"class":4255},[3946,25696,4272],{"class":3952},[3946,25698,25699,25701,25703,25705,25707,25709,25712,25714,25717,25719,25722,25725,25727,25729,25731,25734,25736,25738,25740,25743,25746,25748,25750,25752,25754,25756,25758,25760],{"class":3948,"line":7694},[3946,25700,7115],{"class":3952},[3946,25702,23192],{"class":4251},[3946,25704,23195],{"class":4251},[3946,25706,4312],{"class":3952},[3946,25708,5129],{"class":16996},[3946,25710,25711],{"class":23205},"(?=",[3946,25713,4298],{"class":16996},[3946,25715,25716],{"class":23215},"*",[3946,25718,19575],{"class":23205},[3946,25720,25721],{"class":16996},"a-z",[3946,25723,25724],{"class":23205},"])(?=",[3946,25726,4298],{"class":16996},[3946,25728,25716],{"class":23215},[3946,25730,19575],{"class":23205},[3946,25732,25733],{"class":16996},"A-Z",[3946,25735,25724],{"class":23205},[3946,25737,4298],{"class":16996},[3946,25739,25716],{"class":23215},[3946,25741,25742],{"class":16996},"\\d",[3946,25744,25745],{"class":23205},")",[3946,25747,5129],{"class":16996},[3946,25749,4298],{"class":3952},[3946,25751,23247],{"class":4224},[3946,25753,4331],{"class":3952},[3946,25755,25047],{"class":4262},[3946,25757,4298],{"class":3952},[3946,25759,19836],{"class":4262},[3946,25761,9718],{"class":3952},[3946,25763,25764,25766,25768,25770],{"class":3948,"line":7710},[3946,25765,23156],{"class":4262},[3946,25767,4298],{"class":3952},[3946,25769,19836],{"class":4262},[3946,25771,11511],{"class":3952},[3946,25773,25774,25777],{"class":3948,"line":7715},[3946,25775,25776],{"class":3966},"        'Пароль повинен містити великі, малі літери та цифри'",[3946,25778,4272],{"class":3952},[3946,25780,25781,25783,25785,25787],{"class":3948,"line":7720},[3946,25782,23179],{"class":4262},[3946,25784,4290],{"class":3952},[3946,25786,13575],{"class":4255},[3946,25788,4272],{"class":3952},[3946,25790,25791],{"class":3948,"line":7729},[3946,25792,5550],{"class":3952},[3946,25794,25795],{"class":3948,"line":7734},[3946,25796,4278],{"emptyLinePlaceholder":4277},[3946,25798,25799],{"class":3948,"line":7739},[3946,25800,25801],{"class":4342},"    \u002F\u002F Confirm password validation\n",[3946,25803,25804,25806,25808,25810,25812,25815],{"class":3948,"line":7744},[3946,25805,5503],{"class":4251},[3946,25807,4312],{"class":3952},[3946,25809,25047],{"class":4262},[3946,25811,4298],{"class":3952},[3946,25813,25814],{"class":4262},"confirmPassword",[3946,25816,4318],{"class":3952},[3946,25818,25819,25821,25823,25825,25827,25830,25832,25834],{"class":3948,"line":7750},[3946,25820,23156],{"class":4262},[3946,25822,4298],{"class":3952},[3946,25824,25814],{"class":4262},[3946,25826,4290],{"class":3952},[3946,25828,25829],{"class":3966},"'Підтвердження паролю обов",[3946,25831,23169],{"class":23168},[3946,25833,25376],{"class":3966},[3946,25835,4272],{"class":3952},[3946,25837,25838,25840,25842,25844],{"class":3948,"line":7755},[3946,25839,23179],{"class":4262},[3946,25841,4290],{"class":3952},[3946,25843,13575],{"class":4255},[3946,25845,4272],{"class":3952},[3946,25847,25848,25850,25852,25854,25856,25858,25860,25862,25864,25866,25868,25870],{"class":3948,"line":7765},[3946,25849,7115],{"class":3952},[3946,25851,23192],{"class":4251},[3946,25853,23195],{"class":4251},[3946,25855,4479],{"class":3952},[3946,25857,25047],{"class":4262},[3946,25859,4298],{"class":3952},[3946,25861,19836],{"class":4262},[3946,25863,15303],{"class":3952},[3946,25865,25047],{"class":4262},[3946,25867,4298],{"class":3952},[3946,25869,25814],{"class":4262},[3946,25871,4318],{"class":3952},[3946,25873,25874,25876,25878,25880,25882,25885],{"class":3948,"line":7777},[3946,25875,23156],{"class":4262},[3946,25877,4298],{"class":3952},[3946,25879,25814],{"class":4262},[3946,25881,4290],{"class":3952},[3946,25883,25884],{"class":3966},"'Паролі не співпадають'",[3946,25886,4272],{"class":3952},[3946,25888,25889,25891,25893,25895],{"class":3948,"line":7786},[3946,25890,23179],{"class":4262},[3946,25892,4290],{"class":3952},[3946,25894,13575],{"class":4255},[3946,25896,4272],{"class":3952},[3946,25898,25899],{"class":3948,"line":7799},[3946,25900,5550],{"class":3952},[3946,25902,25903],{"class":3948,"line":7818},[3946,25904,4278],{"emptyLinePlaceholder":4277},[3946,25906,25907,25909,25911,25913],{"class":3948,"line":7823},[3946,25908,23391],{"class":4224},[3946,25910,4331],{"class":3952},[3946,25912,23396],{"class":4262},[3946,25914,4337],{"class":3952},[3946,25916,25917,25919,25921],{"class":3948,"line":7834},[3946,25918,4603],{"class":4251},[3946,25920,7649],{"class":4262},[3946,25922,4272],{"class":3952},[3946,25924,25925],{"class":3948,"line":7850},[3946,25926,15539],{"class":3952},[3946,25928,25929],{"class":3948,"line":7855},[3946,25930,4278],{"emptyLinePlaceholder":4277},[3946,25932,25933],{"class":3948,"line":7860},[3946,25934,6908],{"class":4342},[3946,25936,25937],{"class":3948,"line":7891},[3946,25938,25939],{"class":4342},"   * Обробка реєстрації\n",[3946,25941,25942],{"class":3948,"line":7896},[3946,25943,6918],{"class":4342},[3946,25945,25946,25948,25951,25953,25955,25957,25959],{"class":3948,"line":7901},[3946,25947,5018],{"class":4255},[3946,25949,25950],{"class":4224}," handleRegister",[3946,25952,4290],{"class":3952},[3946,25954,4387],{"class":4255},[3946,25956,11004],{"class":3952},[3946,25958,6453],{"class":4255},[3946,25960,4427],{"class":3952},[3946,25962,25963,25965],{"class":3948,"line":7906},[3946,25964,23449],{"class":4224},[3946,25966,4304],{"class":3952},[3946,25968,25969],{"class":3948,"line":7912},[3946,25970,7612],{"class":3952},[3946,25972,25973,25975,25977,25979],{"class":3948,"line":7917},[3946,25974,5503],{"class":4251},[3946,25976,4312],{"class":3952},[3946,25978,23464],{"class":4224},[3946,25980,23151],{"class":3952},[3946,25982,25983,25985],{"class":3948,"line":7935},[3946,25984,7405],{"class":4251},[3946,25986,4272],{"class":3952},[3946,25988,25989],{"class":3948,"line":7942},[3946,25990,5550],{"class":3952},[3946,25992,25993],{"class":3948,"line":7963},[3946,25994,4278],{"emptyLinePlaceholder":4277},[3946,25996,25997,25999],{"class":3948,"line":7979},[3946,25998,6977],{"class":4251},[3946,26000,4427],{"class":3952},[3946,26002,26003,26005,26007],{"class":3948,"line":7992},[3946,26004,7069],{"class":4251},[3946,26006,9061],{"class":4224},[3946,26008,8512],{"class":3952},[3946,26010,26011,26014,26017,26019,26021,26023,26025],{"class":3948,"line":8012},[3946,26012,26013],{"class":4262},"        name:",[3946,26015,26016],{"class":4262}," formData",[3946,26018,4298],{"class":3952},[3946,26020,6679],{"class":4262},[3946,26022,4298],{"class":3952},[3946,26024,23148],{"class":4224},[3946,26026,19488],{"class":3952},[3946,26028,26029,26032,26034,26036,26038,26040,26042],{"class":3948,"line":8018},[3946,26030,26031],{"class":4262},"        email:",[3946,26033,26016],{"class":4262},[3946,26035,4298],{"class":3952},[3946,26037,10853],{"class":4262},[3946,26039,4298],{"class":3952},[3946,26041,23148],{"class":4224},[3946,26043,19488],{"class":3952},[3946,26045,26046,26049,26051,26053,26055],{"class":3948,"line":8023},[3946,26047,26048],{"class":4262},"        password:",[3946,26050,26016],{"class":4262},[3946,26052,4298],{"class":3952},[3946,26054,19836],{"class":4262},[3946,26056,3970],{"class":3952},[3946,26058,26059,26062,26064,26066,26068],{"class":3948,"line":8028},[3946,26060,26061],{"class":4262},"        confirmPassword:",[3946,26063,26016],{"class":4262},[3946,26065,4298],{"class":3952},[3946,26067,25814],{"class":4262},[3946,26069,3970],{"class":3952},[3946,26071,26072],{"class":3948,"line":8033},[3946,26073,10831],{"class":3952},[3946,26075,26076],{"class":3948,"line":8038},[3946,26077,26078],{"class":4342},"      \u002F\u002F Успіх — автоматичний перехід на App Stack\n",[3946,26080,26081,26083,26085,26087,26089],{"class":3948,"line":8044},[3946,26082,7115],{"class":3952},[3946,26084,4476],{"class":4251},[3946,26086,4479],{"class":3952},[3946,26088,19689],{"class":4262},[3946,26090,4318],{"class":3952},[3946,26092,26093,26095,26097,26099],{"class":3948,"line":8049},[3946,26094,23537],{"class":4262},[3946,26096,4298],{"class":3952},[3946,26098,23542],{"class":4224},[3946,26100,6594],{"class":3952},[3946,26102,26103,26106],{"class":3948,"line":8071},[3946,26104,26105],{"class":3966},"        'Помилка реєстрації'",[3946,26107,3970],{"class":3952},[3946,26109,26110,26112,26114,26117],{"class":3948,"line":8090},[3946,26111,23556],{"class":4262},[3946,26113,9745],{"class":3952},[3946,26115,26116],{"class":3966},"'Не вдалося створити акаунт'",[3946,26118,3970],{"class":3952},[3946,26120,26121,26123,26125,26127],{"class":3948,"line":8095},[3946,26122,23568],{"class":3952},[3946,26124,23571],{"class":4262},[3946,26126,23574],{"class":3966},[3946,26128,23577],{"class":3952},[3946,26130,26131],{"class":3948,"line":8112},[3946,26132,8984],{"class":3952},[3946,26134,26135],{"class":3948,"line":8117},[3946,26136,5550],{"class":3952},[3946,26138,26139],{"class":3948,"line":8160},[3946,26140,15539],{"class":3952},[3946,26142,26143],{"class":3948,"line":8185},[3946,26144,4278],{"emptyLinePlaceholder":4277},[3946,26146,26147],{"class":3948,"line":8190},[3946,26148,6908],{"class":4342},[3946,26150,26151],{"class":3948,"line":8195},[3946,26152,26153],{"class":4342},"   * Повернення на екран входу\n",[3946,26155,26156],{"class":3948,"line":8200},[3946,26157,6918],{"class":4342},[3946,26159,26160,26162,26165,26167,26169],{"class":3948,"line":8206},[3946,26161,5018],{"class":4255},[3946,26163,26164],{"class":4224}," handleBackToLogin",[3946,26166,18252],{"class":3952},[3946,26168,6453],{"class":4255},[3946,26170,4427],{"class":3952},[3946,26172,26173,26175],{"class":3948,"line":9571},[3946,26174,23449],{"class":4224},[3946,26176,4304],{"class":3952},[3946,26178,26179,26181,26183,26185],{"class":3948,"line":9589},[3946,26180,23630],{"class":4262},[3946,26182,4298],{"class":3952},[3946,26184,16197],{"class":4224},[3946,26186,4304],{"class":3952},[3946,26188,26189],{"class":3948,"line":9596},[3946,26190,15539],{"class":3952},[3946,26192,26193],{"class":3948,"line":9618},[3946,26194,4278],{"emptyLinePlaceholder":4277},[3946,26196,26197,26199],{"class":3948,"line":9627},[3946,26198,5062],{"class":4251},[3946,26200,13079],{"class":3952},[3946,26202,26203,26205],{"class":3948,"line":9636},[3946,26204,13158],{"class":3952},[3946,26206,23663],{"class":4262},[3946,26208,26209,26211,26213,26215],{"class":3948,"line":9645},[3946,26210,21472],{"class":4262},[3946,26212,13092],{"class":3952},[3946,26214,15105],{"class":4262},[3946,26216,4040],{"class":3952},[3946,26218,26219,26221,26223,26225,26227,26229,26231,26233,26235,26237],{"class":3948,"line":9650},[3946,26220,23678],{"class":4262},[3946,26222,23681],{"class":3952},[3946,26224,23684],{"class":4286},[3946,26226,8816],{"class":3952},[3946,26228,23689],{"class":3966},[3946,26230,11523],{"class":3952},[3946,26232,23694],{"class":3966},[3946,26234,11532],{"class":3952},[3946,26236,23699],{"class":3966},[3946,26238,4040],{"class":3952},[3946,26240,26241],{"class":3948,"line":9655},[3946,26242,13602],{"class":3952},[3946,26244,26245,26247],{"class":3948,"line":9660},[3946,26246,13084],{"class":3952},[3946,26248,23712],{"class":4262},[3946,26250,26251,26253,26255,26257],{"class":3948,"line":9665},[3946,26252,23717],{"class":4262},[3946,26254,13092],{"class":3952},[3946,26256,23722],{"class":4262},[3946,26258,4040],{"class":3952},[3946,26260,26261,26263,26265],{"class":3948,"line":9671},[3946,26262,23729],{"class":4262},[3946,26264,13111],{"class":3952},[3946,26266,23734],{"class":3966},[3946,26268,26269],{"class":3948,"line":9676},[3946,26270,23739],{"class":3952},[3946,26272,26273,26275,26277],{"class":3948,"line":9700},[3946,26274,23744],{"class":3952},[3946,26276,23747],{"class":4342},[3946,26278,4040],{"class":3952},[3946,26280,26281,26283,26285,26287,26289,26291],{"class":3948,"line":9721},[3946,26282,13103],{"class":3952},[3946,26284,12926],{"class":4262},[3946,26286,13089],{"class":4262},[3946,26288,13092],{"class":3952},[3946,26290,23762],{"class":4262},[3946,26292,13098],{"class":3952},[3946,26294,26295,26297,26299,26301,26303,26305,26307,26310,26313,26315,26317],{"class":3948,"line":9756},[3946,26296,15112],{"class":3952},[3946,26298,14762],{"class":4262},[3946,26300,13089],{"class":4262},[3946,26302,13092],{"class":3952},[3946,26304,15121],{"class":4262},[3946,26306,15124],{"class":3952},[3946,26308,26309],{"class":4262},"Створити",[3946,26311,26312],{"class":4262}," акаунт",[3946,26314,15133],{"class":3952},[3946,26316,14762],{"class":4262},[3946,26318,13135],{"class":3952},[3946,26320,26321,26323,26325,26327,26329,26331],{"class":3948,"line":9778},[3946,26322,15112],{"class":3952},[3946,26324,14762],{"class":4262},[3946,26326,13089],{"class":4262},[3946,26328,13092],{"class":3952},[3946,26330,23803],{"class":4262},[3946,26332,13098],{"class":3952},[3946,26334,26335,26338,26341,26343],{"class":3948,"line":9783},[3946,26336,26337],{"class":4262},"            Заповніть",[3946,26339,26340],{"class":4262}," форму",[3946,26342,23813],{"class":4262},[3946,26344,26345],{"class":4262}," реєстрації\n",[3946,26347,26348,26350,26352],{"class":3948,"line":9789},[3946,26349,15182],{"class":3952},[3946,26351,14762],{"class":4262},[3946,26353,13135],{"class":3952},[3946,26355,26356,26358,26360],{"class":3948,"line":9801},[3946,26357,15256],{"class":3952},[3946,26359,12926],{"class":4262},[3946,26361,13135],{"class":3952},[3946,26363,26364],{"class":3948,"line":9813},[3946,26365,4278],{"emptyLinePlaceholder":4277},[3946,26367,26368,26370,26372],{"class":3948,"line":9830},[3946,26369,23744],{"class":3952},[3946,26371,23853],{"class":4342},[3946,26373,4040],{"class":3952},[3946,26375,26376,26378,26380,26382,26384,26386],{"class":3948,"line":9840},[3946,26377,13103],{"class":3952},[3946,26379,12926],{"class":4262},[3946,26381,13089],{"class":4262},[3946,26383,13092],{"class":3952},[3946,26385,23868],{"class":4262},[3946,26387,13098],{"class":3952},[3946,26389,26390,26392],{"class":3948,"line":9856},[3946,26391,15112],{"class":3952},[3946,26393,23877],{"class":4262},[3946,26395,26396,26398,26400],{"class":3948,"line":9866},[3946,26397,23882],{"class":4262},[3946,26399,13111],{"class":3952},[3946,26401,26402],{"class":3966},"\"Ім'я\"\n",[3946,26404,26405,26407,26409],{"class":3948,"line":9882},[3946,26406,23892],{"class":4262},[3946,26408,13111],{"class":3952},[3946,26410,26411],{"class":3966},"\"Ваше ім'я\"\n",[3946,26413,26414,26416,26419,26421],{"class":3948,"line":9892},[3946,26415,23902],{"class":4262},[3946,26417,26418],{"class":3952},"={formData.",[3946,26420,6679],{"class":4262},[3946,26422,4040],{"class":3952},[3946,26424,26425,26427,26430,26433,26435,26438,26440,26442],{"class":3948,"line":9908},[3946,26426,23913],{"class":4262},[3946,26428,26429],{"class":3952},"={(value) => ",[3946,26431,26432],{"class":4224},"updateField",[3946,26434,4331],{"class":3952},[3946,26436,26437],{"class":3966},"'name'",[3946,26439,4447],{"class":3952},[3946,26441,12605],{"class":4262},[3946,26443,26444],{"class":3952},")}\n",[3946,26446,26447,26449,26451,26453],{"class":3948,"line":9918},[3946,26448,23924],{"class":4262},[3946,26450,23927],{"class":3952},[3946,26452,6679],{"class":4262},[3946,26454,4040],{"class":3952},[3946,26456,26457,26459,26461],{"class":3948,"line":9934},[3946,26458,23956],{"class":4262},[3946,26460,13111],{"class":3952},[3946,26462,26463],{"class":3966},"\"name\"\n",[3946,26465,26466,26468,26470,26472],{"class":3948,"line":9944},[3946,26467,23966],{"class":4262},[3946,26469,23969],{"class":3952},[3946,26471,13046],{"class":4262},[3946,26473,4040],{"class":3952},[3946,26475,26476],{"class":3948,"line":9960},[3946,26477,23978],{"class":3952},[3946,26479,26480],{"class":3948,"line":9970},[3946,26481,4278],{"emptyLinePlaceholder":4277},[3946,26483,26484,26486],{"class":3948,"line":9986},[3946,26485,15112],{"class":3952},[3946,26487,23877],{"class":4262},[3946,26489,26490,26492,26494],{"class":3948,"line":9994},[3946,26491,23882],{"class":4262},[3946,26493,13111],{"class":3952},[3946,26495,23887],{"class":3966},[3946,26497,26498,26500,26502],{"class":3948,"line":10014},[3946,26499,23892],{"class":4262},[3946,26501,13111],{"class":3952},[3946,26503,23897],{"class":3966},[3946,26505,26506,26508,26510,26512],{"class":3948,"line":10019},[3946,26507,23902],{"class":4262},[3946,26509,26418],{"class":3952},[3946,26511,10853],{"class":4262},[3946,26513,4040],{"class":3952},[3946,26515,26516,26518,26520,26522,26524,26527,26529,26531],{"class":3948,"line":10024},[3946,26517,23913],{"class":4262},[3946,26519,26429],{"class":3952},[3946,26521,26432],{"class":4224},[3946,26523,4331],{"class":3952},[3946,26525,26526],{"class":3966},"'email'",[3946,26528,4447],{"class":3952},[3946,26530,12605],{"class":4262},[3946,26532,26444],{"class":3952},[3946,26534,26535,26537,26539,26541],{"class":3948,"line":10029},[3946,26536,23924],{"class":4262},[3946,26538,23927],{"class":3952},[3946,26540,10853],{"class":4262},[3946,26542,4040],{"class":3952},[3946,26544,26545,26547,26549],{"class":3948,"line":10044},[3946,26546,23936],{"class":4262},[3946,26548,13111],{"class":3952},[3946,26550,23941],{"class":3966},[3946,26552,26553,26555,26557],{"class":3948,"line":10053},[3946,26554,23946],{"class":4262},[3946,26556,13111],{"class":3952},[3946,26558,23951],{"class":3966},[3946,26560,26561,26563,26565],{"class":3948,"line":10058},[3946,26562,23956],{"class":4262},[3946,26564,13111],{"class":3952},[3946,26566,23961],{"class":3966},[3946,26568,26569,26571,26573,26575],{"class":3948,"line":10063},[3946,26570,23966],{"class":4262},[3946,26572,23969],{"class":3952},[3946,26574,13046],{"class":4262},[3946,26576,4040],{"class":3952},[3946,26578,26579],{"class":3948,"line":10079},[3946,26580,23978],{"class":3952},[3946,26582,26583],{"class":3948,"line":10084},[3946,26584,4278],{"emptyLinePlaceholder":4277},[3946,26586,26587,26589],{"class":3948,"line":10089},[3946,26588,15112],{"class":3952},[3946,26590,23877],{"class":4262},[3946,26592,26593,26595,26597],{"class":3948,"line":10094},[3946,26594,23882],{"class":4262},[3946,26596,13111],{"class":3952},[3946,26598,23997],{"class":3966},[3946,26600,26601,26603,26605],{"class":3948,"line":10099},[3946,26602,23892],{"class":4262},[3946,26604,13111],{"class":3952},[3946,26606,26607],{"class":3966},"\"Мінімум 8 символів\"\n",[3946,26609,26610,26612,26614,26616],{"class":3948,"line":11862},[3946,26611,23902],{"class":4262},[3946,26613,26418],{"class":3952},[3946,26615,19836],{"class":4262},[3946,26617,4040],{"class":3952},[3946,26619,26620,26622,26624,26626,26628,26631,26633,26635],{"class":3948,"line":11871},[3946,26621,23913],{"class":4262},[3946,26623,26429],{"class":3952},[3946,26625,26432],{"class":4224},[3946,26627,4331],{"class":3952},[3946,26629,26630],{"class":3966},"'password'",[3946,26632,4447],{"class":3952},[3946,26634,12605],{"class":4262},[3946,26636,26444],{"class":3952},[3946,26638,26639,26641,26643,26645],{"class":3948,"line":11876},[3946,26640,23924],{"class":4262},[3946,26642,23927],{"class":3952},[3946,26644,19836],{"class":4262},[3946,26646,4040],{"class":3952},[3946,26648,26649],{"class":3948,"line":11881},[3946,26650,24041],{"class":4262},[3946,26652,26653,26655,26657],{"class":3948,"line":11894},[3946,26654,23956],{"class":4262},[3946,26656,13111],{"class":3952},[3946,26658,26659],{"class":3966},"\"password-new\"\n",[3946,26661,26662,26664,26666,26668],{"class":3948,"line":11899},[3946,26663,23966],{"class":4262},[3946,26665,23969],{"class":3952},[3946,26667,13046],{"class":4262},[3946,26669,4040],{"class":3952},[3946,26671,26672],{"class":3948,"line":11904},[3946,26673,23978],{"class":3952},[3946,26675,26676],{"class":3948,"line":11909},[3946,26677,4278],{"emptyLinePlaceholder":4277},[3946,26679,26680,26682],{"class":3948,"line":11915},[3946,26681,15112],{"class":3952},[3946,26683,23877],{"class":4262},[3946,26685,26686,26688,26690],{"class":3948,"line":11920},[3946,26687,23882],{"class":4262},[3946,26689,13111],{"class":3952},[3946,26691,26692],{"class":3966},"\"Підтвердження паролю\"\n",[3946,26694,26695,26697,26699],{"class":3948,"line":11941},[3946,26696,23892],{"class":4262},[3946,26698,13111],{"class":3952},[3946,26700,26701],{"class":3966},"\"Повторіть пароль\"\n",[3946,26703,26704,26706,26708,26710],{"class":3948,"line":11948},[3946,26705,23902],{"class":4262},[3946,26707,26418],{"class":3952},[3946,26709,25814],{"class":4262},[3946,26711,4040],{"class":3952},[3946,26713,26714,26716,26718,26720,26722,26725,26727,26729],{"class":3948,"line":11961},[3946,26715,23913],{"class":4262},[3946,26717,26429],{"class":3952},[3946,26719,26432],{"class":4224},[3946,26721,4331],{"class":3952},[3946,26723,26724],{"class":3966},"'confirmPassword'",[3946,26726,4447],{"class":3952},[3946,26728,12605],{"class":4262},[3946,26730,26444],{"class":3952},[3946,26732,26733,26735,26737,26739],{"class":3948,"line":11966},[3946,26734,23924],{"class":4262},[3946,26736,23927],{"class":3952},[3946,26738,25814],{"class":4262},[3946,26740,4040],{"class":3952},[3946,26742,26743],{"class":3948,"line":11972},[3946,26744,24041],{"class":4262},[3946,26746,26747,26749,26751],{"class":3948,"line":11986},[3946,26748,23956],{"class":4262},[3946,26750,13111],{"class":3952},[3946,26752,26659],{"class":3966},[3946,26754,26755,26757,26759,26761],{"class":3948,"line":11999},[3946,26756,23966],{"class":4262},[3946,26758,23969],{"class":3952},[3946,26760,13046],{"class":4262},[3946,26762,4040],{"class":3952},[3946,26764,26765],{"class":3948,"line":12018},[3946,26766,23978],{"class":3952},[3946,26768,26769],{"class":3948,"line":12024},[3946,26770,4278],{"emptyLinePlaceholder":4277},[3946,26772,26773,26775],{"class":3948,"line":12034},[3946,26774,15112],{"class":3952},[3946,26776,24075],{"class":4262},[3946,26778,26779,26781,26783],{"class":3948,"line":12040},[3946,26780,24080],{"class":4262},[3946,26782,13111],{"class":3952},[3946,26784,26785],{"class":3966},"\"Зареєструватися\"\n",[3946,26787,26788,26790,26792,26795],{"class":3948,"line":12053},[3946,26789,15452],{"class":4262},[3946,26791,12602],{"class":3952},[3946,26793,26794],{"class":4262},"handleRegister",[3946,26796,4040],{"class":3952},[3946,26798,26799,26801,26803,26805],{"class":3948,"line":12058},[3946,26800,24101],{"class":4262},[3946,26802,12602],{"class":3952},[3946,26804,13046],{"class":4262},[3946,26806,4040],{"class":3952},[3946,26808,26809,26811,26813,26816],{"class":3948,"line":12064},[3946,26810,15441],{"class":4262},[3946,26812,13092],{"class":3952},[3946,26814,26815],{"class":4262},"registerButton",[3946,26817,4040],{"class":3952},[3946,26819,26820],{"class":3948,"line":12071},[3946,26821,23978],{"class":3952},[3946,26823,26824],{"class":3948,"line":12076},[3946,26825,4278],{"emptyLinePlaceholder":4277},[3946,26827,26828,26830],{"class":3948,"line":12089},[3946,26829,15112],{"class":3952},[3946,26831,24075],{"class":4262},[3946,26833,26834,26836,26838],{"class":3948,"line":12094},[3946,26835,24080],{"class":4262},[3946,26837,13111],{"class":3952},[3946,26839,26840],{"class":3966},"\"Вже є акаунт? Увійти\"\n",[3946,26842,26843,26845,26847,26850],{"class":3948,"line":12099},[3946,26844,15452],{"class":4262},[3946,26846,12602],{"class":3952},[3946,26848,26849],{"class":4262},"handleBackToLogin",[3946,26851,4040],{"class":3952},[3946,26853,26854,26856,26858],{"class":3948,"line":12105},[3946,26855,24157],{"class":4262},[3946,26857,13111],{"class":3952},[3946,26859,24162],{"class":3966},[3946,26861,26862,26864,26866,26868],{"class":3948,"line":12110},[3946,26863,24167],{"class":4262},[3946,26865,12602],{"class":3952},[3946,26867,13046],{"class":4262},[3946,26869,4040],{"class":3952},[3946,26871,26872],{"class":3948,"line":12132},[3946,26873,23978],{"class":3952},[3946,26875,26876,26878,26880],{"class":3948,"line":12139},[3946,26877,15256],{"class":3952},[3946,26879,12926],{"class":4262},[3946,26881,13135],{"class":3952},[3946,26883,26884,26886,26888],{"class":3948,"line":12158},[3946,26885,13130],{"class":3952},[3946,26887,24325],{"class":4262},[3946,26889,13135],{"class":3952},[3946,26891,26892,26894,26896],{"class":3948,"line":12163},[3946,26893,13187],{"class":3952},[3946,26895,24334],{"class":4262},[3946,26897,13135],{"class":3952},[3946,26899,26900],{"class":3948,"line":12178},[3946,26901,10875],{"class":3952},[3946,26903,26904],{"class":3948,"line":12194},[3946,26905,4040],{"class":3952},[3946,26907,26908],{"class":3948,"line":12199},[3946,26909,4278],{"emptyLinePlaceholder":4277},[3946,26911,26912,26914,26916,26918,26920,26922,26924],{"class":3948,"line":12204},[3946,26913,4283],{"class":4255},[3946,26915,13210],{"class":4286},[3946,26917,4290],{"class":3952},[3946,26919,12936],{"class":4262},[3946,26921,4298],{"class":3952},[3946,26923,8509],{"class":4224},[3946,26925,8512],{"class":3952},[3946,26927,26928,26930],{"class":3948,"line":12231},[3946,26929,15568],{"class":4262},[3946,26931,4427],{"class":3952},[3946,26933,26934,26936,26938],{"class":3948,"line":12236},[3946,26935,13232],{"class":4262},[3946,26937,13235],{"class":4020},[3946,26939,3970],{"class":3952},[3946,26941,26942,26944,26946],{"class":3948,"line":12249},[3946,26943,13261],{"class":4262},[3946,26945,13264],{"class":3966},[3946,26947,3970],{"class":3952},[3946,26949,26950],{"class":3948,"line":12261},[3946,26951,13271],{"class":3952},[3946,26953,26954,26956],{"class":3948,"line":12272},[3946,26955,24395],{"class":4262},[3946,26957,4427],{"class":3952},[3946,26959,26960,26962,26964],{"class":3948,"line":12281},[3946,26961,24402],{"class":4262},[3946,26963,13235],{"class":4020},[3946,26965,3970],{"class":3952},[3946,26967,26968,26970,26972],{"class":3948,"line":12286},[3946,26969,15599],{"class":4262},[3946,26971,15631],{"class":4020},[3946,26973,3970],{"class":3952},[3946,26975,26976,26978,26980],{"class":3948,"line":12291},[3946,26977,13242],{"class":4262},[3946,26979,13245],{"class":3966},[3946,26981,3970],{"class":3952},[3946,26983,26984],{"class":3948,"line":12306},[3946,26985,13271],{"class":3952},[3946,26987,26988,26990],{"class":3948,"line":12319},[3946,26989,24431],{"class":4262},[3946,26991,4427],{"class":3952},[3946,26993,26994,26996,26998],{"class":3948,"line":12339},[3946,26995,15658],{"class":4262},[3946,26997,24440],{"class":4020},[3946,26999,3970],{"class":3952},[3946,27001,27002,27004,27006],{"class":3948,"line":12352},[3946,27003,13252],{"class":4262},[3946,27005,13245],{"class":3966},[3946,27007,3970],{"class":3952},[3946,27009,27010],{"class":3948,"line":12359},[3946,27011,13271],{"class":3952},[3946,27013,27014,27016],{"class":3948,"line":12368},[3946,27015,15621],{"class":4262},[3946,27017,4427],{"class":3952},[3946,27019,27020,27022,27024],{"class":3948,"line":12373},[3946,27021,15628],{"class":4262},[3946,27023,24467],{"class":4020},[3946,27025,3970],{"class":3952},[3946,27027,27028,27030,27032],{"class":3948,"line":12386},[3946,27029,15638],{"class":4262},[3946,27031,15641],{"class":3966},[3946,27033,3970],{"class":3952},[3946,27035,27036,27038,27040],{"class":3948,"line":12391},[3946,27037,15648],{"class":4262},[3946,27039,15651],{"class":3966},[3946,27041,3970],{"class":3952},[3946,27043,27044,27046,27048],{"class":3948,"line":12396},[3946,27045,15658],{"class":4262},[3946,27047,15755],{"class":4020},[3946,27049,3970],{"class":3952},[3946,27051,27052],{"class":3948,"line":12402},[3946,27053,13271],{"class":3952},[3946,27055,27056,27058],{"class":3948,"line":12407},[3946,27057,24502],{"class":4262},[3946,27059,4427],{"class":3952},[3946,27061,27062,27064,27066],{"class":3948,"line":12418},[3946,27063,15628],{"class":4262},[3946,27065,15681],{"class":4020},[3946,27067,3970],{"class":3952},[3946,27069,27070,27072,27074],{"class":3948,"line":12426},[3946,27071,15648],{"class":4262},[3946,27073,15690],{"class":3966},[3946,27075,3970],{"class":3952},[3946,27077,27078,27080,27082],{"class":3948,"line":12436},[3946,27079,15697],{"class":4262},[3946,27081,13245],{"class":3966},[3946,27083,3970],{"class":3952},[3946,27085,27086],{"class":3948,"line":12441},[3946,27087,13271],{"class":3952},[3946,27089,27090,27092],{"class":3948,"line":12446},[3946,27091,24537],{"class":4262},[3946,27093,4427],{"class":3952},[3946,27095,27096,27098,27100],{"class":3948,"line":12452},[3946,27097,15658],{"class":4262},[3946,27099,15631],{"class":4020},[3946,27101,3970],{"class":3952},[3946,27103,27104],{"class":3948,"line":12457},[3946,27105,13271],{"class":3952},[3946,27107,27108,27111],{"class":3948,"line":12476},[3946,27109,27110],{"class":4262},"  registerButton:",[3946,27112,4427],{"class":3952},[3946,27114,27115,27117,27119],{"class":3948,"line":12487},[3946,27116,15658],{"class":4262},[3946,27118,15661],{"class":4020},[3946,27120,3970],{"class":3952},[3946,27122,27123],{"class":3948,"line":12497},[3946,27124,13271],{"class":3952},[3946,27126,27127],{"class":3948,"line":12505},[3946,27128,13276],{"class":3952},[3750,27130,27132],{"id":27131},"_77-notes-api-service","7.7. Notes API Service",[3857,27134,27136],{"className":4242,"code":27135,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fapi\u002FnotesApi.ts\n\nimport axios, { AxiosInstance } from 'axios';\nimport type { Note, CreateNoteDto, UpdateNoteDto } from '..\u002Ftypes\u002Fnote.types';\nimport { tokenService } from '..\u002F..\u002Fauth\u002Fservices\u002FtokenService';\n\nconst API_BASE_URL = __DEV__\n  ? 'http:\u002F\u002Flocalhost:3000\u002Fapi'\n  : 'https:\u002F\u002Fapi.securenotes.com';\n\n\u002F**\n * API клас для роботи з нотатками\n *\u002F\nclass NotesApi {\n  private client: AxiosInstance;\n\n  constructor() {\n    this.client = axios.create({\n      baseURL: API_BASE_URL,\n      timeout: 10000,\n      headers: {\n        'Content-Type': 'application\u002Fjson',\n      },\n    });\n\n    \u002F\u002F Додаємо токен до кожного запиту\n    this.client.interceptors.request.use(async (config) => {\n      const token = await tokenService.getAccessToken();\n      if (token) {\n        config.headers.Authorization = `Bearer ${token}`;\n      }\n      return config;\n    });\n  }\n\n  \u002F**\n   * Отримання всіх нотаток користувача\n   *\u002F\n  async getAllNotes(): Promise\u003CNote[]> {\n    const response = await this.client.get\u003CNote[]>('\u002Fnotes');\n    return response.data;\n  }\n\n  \u002F**\n   * Отримання однієї нотатки\n   *\u002F\n  async getNoteById(id: string): Promise\u003CNote> {\n    const response = await this.client.get\u003CNote>(`\u002Fnotes\u002F${id}`);\n    return response.data;\n  }\n\n  \u002F**\n   * Створення нотатки\n   *\u002F\n  async createNote(data: CreateNoteDto): Promise\u003CNote> {\n    const response = await this.client.post\u003CNote>('\u002Fnotes', data);\n    return response.data;\n  }\n\n  \u002F**\n   * Оновлення нотатки\n   *\u002F\n  async updateNote(id: string, data: UpdateNoteDto): Promise\u003CNote> {\n    const response = await this.client.patch\u003CNote>(`\u002Fnotes\u002F${id}`, data);\n    return response.data;\n  }\n\n  \u002F**\n   * Видалення нотатки\n   *\u002F\n  async deleteNote(id: string): Promise\u003Cvoid> {\n    await this.client.delete(`\u002Fnotes\u002F${id}`);\n  }\n}\n\nexport const notesApi = new NotesApi();\n",[3782,27137,27138,27143,27147,27165,27195,27212,27216,27226,27232,27240,27244,27248,27253,27257,27266,27278,27282,27288,27306,27314,27323,27329,27339,27343,27347,27351,27356,27390,27408,27418,27445,27449,27457,27461,27465,27469,27473,27478,27482,27500,27532,27544,27548,27552,27556,27561,27565,27590,27629,27641,27645,27649,27653,27658,27662,27687,27721,27733,27737,27741,27745,27750,27754,27787,27830,27842,27846,27850,27854,27859,27863,27888,27917,27921,27925,27929],{"__ignoreMap":3865},[3946,27139,27140],{"class":3948,"line":3949},[3946,27141,27142],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fapi\u002FnotesApi.ts\n",[3946,27144,27145],{"class":3948,"line":3956},[3946,27146,4278],{"emptyLinePlaceholder":4277},[3946,27148,27149,27151,27153,27155,27157,27159,27161,27163],{"class":3948,"line":3973},[3946,27150,4252],{"class":4251},[3946,27152,8287],{"class":4262},[3946,27154,8290],{"class":3952},[3946,27156,8298],{"class":4262},[3946,27158,6823],{"class":3952},[3946,27160,6826],{"class":4251},[3946,27162,8305],{"class":3966},[3946,27164,4272],{"class":3952},[3946,27166,27167,27169,27171,27173,27176,27178,27181,27183,27186,27188,27190,27193],{"class":3948,"line":3986},[3946,27168,4252],{"class":4251},[3946,27170,6814],{"class":4251},[3946,27172,6817],{"class":3952},[3946,27174,27175],{"class":4262},"Note",[3946,27177,4447],{"class":3952},[3946,27179,27180],{"class":4262},"CreateNoteDto",[3946,27182,4447],{"class":3952},[3946,27184,27185],{"class":4262},"UpdateNoteDto",[3946,27187,6823],{"class":3952},[3946,27189,6826],{"class":4251},[3946,27191,27192],{"class":3966}," '..\u002Ftypes\u002Fnote.types'",[3946,27194,4272],{"class":3952},[3946,27196,27197,27199,27201,27203,27205,27207,27210],{"class":3948,"line":3999},[3946,27198,4252],{"class":4251},[3946,27200,6817],{"class":3952},[3946,27202,8362],{"class":4262},[3946,27204,6823],{"class":3952},[3946,27206,6826],{"class":4251},[3946,27208,27209],{"class":3966}," '..\u002F..\u002Fauth\u002Fservices\u002FtokenService'",[3946,27211,4272],{"class":3952},[3946,27213,27214],{"class":3948,"line":4012},[3946,27215,4278],{"emptyLinePlaceholder":4277},[3946,27217,27218,27220,27222,27224],{"class":3948,"line":4026},[3946,27219,4283],{"class":4255},[3946,27221,8395],{"class":4286},[3946,27223,4290],{"class":3952},[3946,27225,8400],{"class":4262},[3946,27227,27228,27230],{"class":3948,"line":4037},[3946,27229,8405],{"class":3952},[3946,27231,8408],{"class":3966},[3946,27233,27234,27236,27238],{"class":3948,"line":4487},[3946,27235,8413],{"class":3952},[3946,27237,8416],{"class":3966},[3946,27239,4272],{"class":3952},[3946,27241,27242],{"class":3948,"line":4507},[3946,27243,4278],{"emptyLinePlaceholder":4277},[3946,27245,27246],{"class":3948,"line":4518},[3946,27247,6015],{"class":4342},[3946,27249,27250],{"class":3948,"line":4524},[3946,27251,27252],{"class":4342}," * API клас для роботи з нотатками\n",[3946,27254,27255],{"class":3948,"line":4529},[3946,27256,6025],{"class":4342},[3946,27258,27259,27261,27264],{"class":3948,"line":4534},[3946,27260,6898],{"class":4255},[3946,27262,27263],{"class":4403}," NotesApi",[3946,27265,4427],{"class":3952},[3946,27267,27268,27270,27272,27274,27276],{"class":3948,"line":4540},[3946,27269,8470],{"class":4255},[3946,27271,8473],{"class":4262},[3946,27273,3963],{"class":3952},[3946,27275,8298],{"class":4403},[3946,27277,4272],{"class":3952},[3946,27279,27280],{"class":3948,"line":4567},[3946,27281,4278],{"emptyLinePlaceholder":4277},[3946,27283,27284,27286],{"class":3948,"line":4574},[3946,27285,6591],{"class":4255},[3946,27287,8490],{"class":3952},[3946,27289,27290,27292,27294,27296,27298,27300,27302,27304],{"class":3948,"line":4600},[3946,27291,6674],{"class":4255},[3946,27293,4298],{"class":3952},[3946,27295,8499],{"class":4262},[3946,27297,4290],{"class":3952},[3946,27299,8504],{"class":4262},[3946,27301,4298],{"class":3952},[3946,27303,8509],{"class":4224},[3946,27305,8512],{"class":3952},[3946,27307,27308,27310,27312],{"class":3948,"line":4610},[3946,27309,8517],{"class":4262},[3946,27311,8395],{"class":4286},[3946,27313,3970],{"class":3952},[3946,27315,27316,27318,27321],{"class":3948,"line":4623},[3946,27317,8526],{"class":4262},[3946,27319,27320],{"class":4020}," 10000",[3946,27322,3970],{"class":3952},[3946,27324,27325,27327],{"class":3948,"line":4643},[3946,27326,8535],{"class":4262},[3946,27328,4427],{"class":3952},[3946,27330,27331,27333,27335,27337],{"class":3948,"line":4653},[3946,27332,8542],{"class":3966},[3946,27334,8545],{"class":4262},[3946,27336,8548],{"class":3966},[3946,27338,3970],{"class":3952},[3946,27340,27341],{"class":3948,"line":4658},[3946,27342,8555],{"class":3952},[3946,27344,27345],{"class":3948,"line":4663},[3946,27346,8560],{"class":3952},[3946,27348,27349],{"class":3948,"line":4668},[3946,27350,4278],{"emptyLinePlaceholder":4277},[3946,27352,27353],{"class":3948,"line":4674},[3946,27354,27355],{"class":4342},"    \u002F\u002F Додаємо токен до кожного запиту\n",[3946,27357,27358,27360,27362,27364,27366,27368,27370,27372,27374,27376,27378,27380,27382,27384,27386,27388],{"class":3948,"line":4694},[3946,27359,6674],{"class":4255},[3946,27361,4298],{"class":3952},[3946,27363,8499],{"class":4262},[3946,27365,4298],{"class":3952},[3946,27367,8582],{"class":4262},[3946,27369,4298],{"class":3952},[3946,27371,8587],{"class":4262},[3946,27373,4298],{"class":3952},[3946,27375,8592],{"class":4224},[3946,27377,4331],{"class":3952},[3946,27379,4387],{"class":4255},[3946,27381,4479],{"class":3952},[3946,27383,8604],{"class":4262},[3946,27385,5783],{"class":3952},[3946,27387,6453],{"class":4255},[3946,27389,4427],{"class":3952},[3946,27391,27392,27394,27396,27398,27400,27402,27404,27406],{"class":3948,"line":4701},[3946,27393,6984],{"class":4255},[3946,27395,4580],{"class":4286},[3946,27397,4290],{"class":3952},[3946,27399,4293],{"class":4251},[3946,27401,8213],{"class":4262},[3946,27403,4298],{"class":3952},[3946,27405,8628],{"class":4224},[3946,27407,4304],{"class":3952},[3946,27409,27410,27412,27414,27416],{"class":3948,"line":4719},[3946,27411,7246],{"class":4251},[3946,27413,4479],{"class":3952},[3946,27415,4398],{"class":4262},[3946,27417,4318],{"class":3952},[3946,27419,27420,27423,27425,27427,27429,27431,27433,27435,27437,27439,27441,27443],{"class":3948,"line":4735},[3946,27421,27422],{"class":4262},"        config",[3946,27424,4298],{"class":3952},[3946,27426,8656],{"class":4262},[3946,27428,4298],{"class":3952},[3946,27430,8661],{"class":4262},[3946,27432,4290],{"class":3952},[3946,27434,8666],{"class":3966},[3946,27436,8669],{"class":4255},[3946,27438,4398],{"class":4262},[3946,27440,8674],{"class":4255},[3946,27442,8677],{"class":3966},[3946,27444,4272],{"class":3952},[3946,27446,27447],{"class":3948,"line":4748},[3946,27448,7282],{"class":3952},[3946,27450,27451,27453,27455],{"class":3948,"line":4768},[3946,27452,7405],{"class":4251},[3946,27454,8695],{"class":4262},[3946,27456,4272],{"class":3952},[3946,27458,27459],{"class":3948,"line":4777},[3946,27460,8560],{"class":3952},[3946,27462,27463],{"class":3948,"line":4782},[3946,27464,4521],{"class":3952},[3946,27466,27467],{"class":3948,"line":6262},[3946,27468,4278],{"emptyLinePlaceholder":4277},[3946,27470,27471],{"class":3948,"line":6273},[3946,27472,6908],{"class":4342},[3946,27474,27475],{"class":3948,"line":6284},[3946,27476,27477],{"class":4342},"   * Отримання всіх нотаток користувача\n",[3946,27479,27480],{"class":3948,"line":6299},[3946,27481,6918],{"class":4342},[3946,27483,27484,27486,27489,27491,27493,27495,27497],{"class":3948,"line":6304},[3946,27485,6923],{"class":4255},[3946,27487,27488],{"class":4224}," getAllNotes",[3946,27490,4550],{"class":3952},[3946,27492,4410],{"class":4403},[3946,27494,4413],{"class":3952},[3946,27496,27175],{"class":4403},[3946,27498,27499],{"class":3952},"[]> {\n",[3946,27501,27502,27504,27506,27508,27510,27512,27514,27516,27518,27520,27522,27524,27527,27530],{"class":3948,"line":6309},[3946,27503,4577],{"class":4255},[3946,27505,8776],{"class":4286},[3946,27507,4290],{"class":3952},[3946,27509,4293],{"class":4251},[3946,27511,7377],{"class":4255},[3946,27513,4298],{"class":3952},[3946,27515,8499],{"class":4262},[3946,27517,4298],{"class":3952},[3946,27519,9491],{"class":4224},[3946,27521,4413],{"class":3952},[3946,27523,27175],{"class":4403},[3946,27525,27526],{"class":3952},"[]>(",[3946,27528,27529],{"class":3966},"'\u002Fnotes'",[3946,27531,4337],{"class":3952},[3946,27533,27534,27536,27538,27540,27542],{"class":3948,"line":6314},[3946,27535,4603],{"class":4251},[3946,27537,8776],{"class":4262},[3946,27539,4298],{"class":3952},[3946,27541,5178],{"class":4262},[3946,27543,4272],{"class":3952},[3946,27545,27546],{"class":3948,"line":6320},[3946,27547,4521],{"class":3952},[3946,27549,27550],{"class":3948,"line":6325},[3946,27551,4278],{"emptyLinePlaceholder":4277},[3946,27553,27554],{"class":3948,"line":6337},[3946,27555,6908],{"class":4342},[3946,27557,27558],{"class":3948,"line":6352},[3946,27559,27560],{"class":4342},"   * Отримання однієї нотатки\n",[3946,27562,27563],{"class":3948,"line":6364},[3946,27564,6918],{"class":4342},[3946,27566,27567,27569,27572,27574,27576,27578,27580,27582,27584,27586,27588],{"class":3948,"line":6376},[3946,27568,6923],{"class":4255},[3946,27570,27571],{"class":4224}," getNoteById",[3946,27573,4331],{"class":3952},[3946,27575,19984],{"class":4262},[3946,27577,3963],{"class":3952},[3946,27579,4404],{"class":4403},[3946,27581,4407],{"class":3952},[3946,27583,4410],{"class":4403},[3946,27585,4413],{"class":3952},[3946,27587,27175],{"class":4403},[3946,27589,4419],{"class":3952},[3946,27591,27592,27594,27596,27598,27600,27602,27604,27606,27608,27610,27612,27614,27616,27619,27621,27623,27625,27627],{"class":3948,"line":6392},[3946,27593,4577],{"class":4255},[3946,27595,8776],{"class":4286},[3946,27597,4290],{"class":3952},[3946,27599,4293],{"class":4251},[3946,27601,7377],{"class":4255},[3946,27603,4298],{"class":3952},[3946,27605,8499],{"class":4262},[3946,27607,4298],{"class":3952},[3946,27609,9491],{"class":4224},[3946,27611,4413],{"class":3952},[3946,27613,27175],{"class":4403},[3946,27615,9498],{"class":3952},[3946,27617,27618],{"class":3966},"`\u002Fnotes\u002F",[3946,27620,8669],{"class":4255},[3946,27622,19984],{"class":4262},[3946,27624,8674],{"class":4255},[3946,27626,8677],{"class":3966},[3946,27628,4337],{"class":3952},[3946,27630,27631,27633,27635,27637,27639],{"class":3948,"line":6397},[3946,27632,4603],{"class":4251},[3946,27634,8776],{"class":4262},[3946,27636,4298],{"class":3952},[3946,27638,5178],{"class":4262},[3946,27640,4272],{"class":3952},[3946,27642,27643],{"class":3948,"line":6402},[3946,27644,4521],{"class":3952},[3946,27646,27647],{"class":3948,"line":6407},[3946,27648,4278],{"emptyLinePlaceholder":4277},[3946,27650,27651],{"class":3948,"line":6413},[3946,27652,6908],{"class":4342},[3946,27654,27655],{"class":3948,"line":6418},[3946,27656,27657],{"class":4342},"   * Створення нотатки\n",[3946,27659,27660],{"class":3948,"line":6434},[3946,27661,6918],{"class":4342},[3946,27663,27664,27666,27669,27671,27673,27675,27677,27679,27681,27683,27685],{"class":3948,"line":6466},[3946,27665,6923],{"class":4255},[3946,27667,27668],{"class":4224}," createNote",[3946,27670,4331],{"class":3952},[3946,27672,5178],{"class":4262},[3946,27674,3963],{"class":3952},[3946,27676,27180],{"class":4403},[3946,27678,4407],{"class":3952},[3946,27680,4410],{"class":4403},[3946,27682,4413],{"class":3952},[3946,27684,27175],{"class":4403},[3946,27686,4419],{"class":3952},[3946,27688,27689,27691,27693,27695,27697,27699,27701,27703,27705,27707,27709,27711,27713,27715,27717,27719],{"class":3948,"line":6493},[3946,27690,4577],{"class":4255},[3946,27692,8776],{"class":4286},[3946,27694,4290],{"class":3952},[3946,27696,4293],{"class":4251},[3946,27698,7377],{"class":4255},[3946,27700,4298],{"class":3952},[3946,27702,8499],{"class":4262},[3946,27704,4298],{"class":3952},[3946,27706,8960],{"class":4224},[3946,27708,4413],{"class":3952},[3946,27710,27175],{"class":4403},[3946,27712,9498],{"class":3952},[3946,27714,27529],{"class":3966},[3946,27716,4447],{"class":3952},[3946,27718,5178],{"class":4262},[3946,27720,4337],{"class":3952},[3946,27722,27723,27725,27727,27729,27731],{"class":3948,"line":6512},[3946,27724,4603],{"class":4251},[3946,27726,8776],{"class":4262},[3946,27728,4298],{"class":3952},[3946,27730,5178],{"class":4262},[3946,27732,4272],{"class":3952},[3946,27734,27735],{"class":3948,"line":6530},[3946,27736,4521],{"class":3952},[3946,27738,27739],{"class":3948,"line":6545},[3946,27740,4278],{"emptyLinePlaceholder":4277},[3946,27742,27743],{"class":3948,"line":6550},[3946,27744,6908],{"class":4342},[3946,27746,27747],{"class":3948,"line":6555},[3946,27748,27749],{"class":4342},"   * Оновлення нотатки\n",[3946,27751,27752],{"class":3948,"line":6560},[3946,27753,6918],{"class":4342},[3946,27755,27756,27758,27761,27763,27765,27767,27769,27771,27773,27775,27777,27779,27781,27783,27785],{"class":3948,"line":6566},[3946,27757,6923],{"class":4255},[3946,27759,27760],{"class":4224}," updateNote",[3946,27762,4331],{"class":3952},[3946,27764,19984],{"class":4262},[3946,27766,3963],{"class":3952},[3946,27768,4404],{"class":4403},[3946,27770,4447],{"class":3952},[3946,27772,5178],{"class":4262},[3946,27774,3963],{"class":3952},[3946,27776,27185],{"class":4403},[3946,27778,4407],{"class":3952},[3946,27780,4410],{"class":4403},[3946,27782,4413],{"class":3952},[3946,27784,27175],{"class":4403},[3946,27786,4419],{"class":3952},[3946,27788,27789,27791,27793,27795,27797,27799,27801,27803,27805,27808,27810,27812,27814,27816,27818,27820,27822,27824,27826,27828],{"class":3948,"line":6571},[3946,27790,4577],{"class":4255},[3946,27792,8776],{"class":4286},[3946,27794,4290],{"class":3952},[3946,27796,4293],{"class":4251},[3946,27798,7377],{"class":4255},[3946,27800,4298],{"class":3952},[3946,27802,8499],{"class":4262},[3946,27804,4298],{"class":3952},[3946,27806,27807],{"class":4224},"patch",[3946,27809,4413],{"class":3952},[3946,27811,27175],{"class":4403},[3946,27813,9498],{"class":3952},[3946,27815,27618],{"class":3966},[3946,27817,8669],{"class":4255},[3946,27819,19984],{"class":4262},[3946,27821,8674],{"class":4255},[3946,27823,8677],{"class":3966},[3946,27825,4447],{"class":3952},[3946,27827,5178],{"class":4262},[3946,27829,4337],{"class":3952},[3946,27831,27832,27834,27836,27838,27840],{"class":3948,"line":6588},[3946,27833,4603],{"class":4251},[3946,27835,8776],{"class":4262},[3946,27837,4298],{"class":3952},[3946,27839,5178],{"class":4262},[3946,27841,4272],{"class":3952},[3946,27843,27844],{"class":3948,"line":6597},[3946,27845,4521],{"class":3952},[3946,27847,27848],{"class":3948,"line":6609},[3946,27849,4278],{"emptyLinePlaceholder":4277},[3946,27851,27852],{"class":3948,"line":6640},[3946,27853,6908],{"class":4342},[3946,27855,27856],{"class":3948,"line":6653},[3946,27857,27858],{"class":4342},"   * Видалення нотатки\n",[3946,27860,27861],{"class":3948,"line":6659},[3946,27862,6918],{"class":4342},[3946,27864,27865,27867,27870,27872,27874,27876,27878,27880,27882,27884,27886],{"class":3948,"line":6671},[3946,27866,6923],{"class":4255},[3946,27868,27869],{"class":4224}," deleteNote",[3946,27871,4331],{"class":3952},[3946,27873,19984],{"class":4262},[3946,27875,3963],{"class":3952},[3946,27877,4404],{"class":4403},[3946,27879,4407],{"class":3952},[3946,27881,4410],{"class":4403},[3946,27883,4413],{"class":3952},[3946,27885,4416],{"class":4403},[3946,27887,4419],{"class":3952},[3946,27889,27890,27892,27894,27896,27898,27900,27903,27905,27907,27909,27911,27913,27915],{"class":3948,"line":6689},[3946,27891,4432],{"class":4251},[3946,27893,7377],{"class":4255},[3946,27895,4298],{"class":3952},[3946,27897,8499],{"class":4262},[3946,27899,4298],{"class":3952},[3946,27901,27902],{"class":4224},"delete",[3946,27904,4331],{"class":3952},[3946,27906,27618],{"class":3966},[3946,27908,8669],{"class":4255},[3946,27910,19984],{"class":4262},[3946,27912,8674],{"class":4255},[3946,27914,8677],{"class":3966},[3946,27916,4337],{"class":3952},[3946,27918,27919],{"class":3948,"line":6694},[3946,27920,4521],{"class":3952},[3946,27922,27923],{"class":3948,"line":6699},[3946,27924,4040],{"class":3952},[3946,27926,27927],{"class":3948,"line":6704},[3946,27928,4278],{"emptyLinePlaceholder":4277},[3946,27930,27931,27933,27935,27938,27940,27942,27944],{"class":3948,"line":6709},[3946,27932,6030],{"class":4251},[3946,27934,5933],{"class":4255},[3946,27936,27937],{"class":4286}," notesApi",[3946,27939,4290],{"class":3952},[3946,27941,8218],{"class":4255},[3946,27943,27263],{"class":4224},[3946,27945,4304],{"class":3952},[3743,27947,27948],{},[3771,27949,27950],{},"Типи для нотаток:",[3857,27952,27954],{"className":4242,"code":27953,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Ftypes\u002Fnote.types.ts\n\nexport interface Note {\n  id: string;\n  userId: string;\n  title: string;\n  content: string;\n  createdAt: string;\n  updatedAt: string;\n}\n\nexport interface CreateNoteDto {\n  title: string;\n  content: string;\n}\n\nexport interface UpdateNoteDto {\n  title?: string;\n  content?: string;\n}\n",[3782,27955,27956,27961,27965,27976,27986,27996,28006,28017,28028,28039,28043,28047,28058,28068,28078,28082,28086,28097,28107,28117],{"__ignoreMap":3865},[3946,27957,27958],{"class":3948,"line":3949},[3946,27959,27960],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Ftypes\u002Fnote.types.ts\n",[3946,27962,27963],{"class":3948,"line":3956},[3946,27964,4278],{"emptyLinePlaceholder":4277},[3946,27966,27967,27969,27971,27974],{"class":3948,"line":3973},[3946,27968,6030],{"class":4251},[3946,27970,6033],{"class":4255},[3946,27972,27973],{"class":4403}," Note",[3946,27975,4427],{"class":3952},[3946,27977,27978,27980,27982,27984],{"class":3948,"line":3986},[3946,27979,6043],{"class":4262},[3946,27981,3963],{"class":3952},[3946,27983,4404],{"class":4403},[3946,27985,4272],{"class":3952},[3946,27987,27988,27990,27992,27994],{"class":3948,"line":3999},[3946,27989,5630],{"class":4262},[3946,27991,3963],{"class":3952},[3946,27993,4404],{"class":4403},[3946,27995,4272],{"class":3952},[3946,27997,27998,28000,28002,28004],{"class":3948,"line":4012},[3946,27999,21339],{"class":4262},[3946,28001,3963],{"class":3952},[3946,28003,4404],{"class":4403},[3946,28005,4272],{"class":3952},[3946,28007,28008,28011,28013,28015],{"class":3948,"line":4026},[3946,28009,28010],{"class":4262},"  content",[3946,28012,3963],{"class":3952},[3946,28014,4404],{"class":4403},[3946,28016,4272],{"class":3952},[3946,28018,28019,28022,28024,28026],{"class":3948,"line":4037},[3946,28020,28021],{"class":4262},"  createdAt",[3946,28023,3963],{"class":3952},[3946,28025,4404],{"class":4403},[3946,28027,4272],{"class":3952},[3946,28029,28030,28033,28035,28037],{"class":3948,"line":4487},[3946,28031,28032],{"class":4262},"  updatedAt",[3946,28034,3963],{"class":3952},[3946,28036,4404],{"class":4403},[3946,28038,4272],{"class":3952},[3946,28040,28041],{"class":3948,"line":4507},[3946,28042,4040],{"class":3952},[3946,28044,28045],{"class":3948,"line":4518},[3946,28046,4278],{"emptyLinePlaceholder":4277},[3946,28048,28049,28051,28053,28056],{"class":3948,"line":4524},[3946,28050,6030],{"class":4251},[3946,28052,6033],{"class":4255},[3946,28054,28055],{"class":4403}," CreateNoteDto",[3946,28057,4427],{"class":3952},[3946,28059,28060,28062,28064,28066],{"class":3948,"line":4529},[3946,28061,21339],{"class":4262},[3946,28063,3963],{"class":3952},[3946,28065,4404],{"class":4403},[3946,28067,4272],{"class":3952},[3946,28069,28070,28072,28074,28076],{"class":3948,"line":4534},[3946,28071,28010],{"class":4262},[3946,28073,3963],{"class":3952},[3946,28075,4404],{"class":4403},[3946,28077,4272],{"class":3952},[3946,28079,28080],{"class":3948,"line":4540},[3946,28081,4040],{"class":3952},[3946,28083,28084],{"class":3948,"line":4567},[3946,28085,4278],{"emptyLinePlaceholder":4277},[3946,28087,28088,28090,28092,28095],{"class":3948,"line":4574},[3946,28089,6030],{"class":4251},[3946,28091,6033],{"class":4255},[3946,28093,28094],{"class":4403}," UpdateNoteDto",[3946,28096,4427],{"class":3952},[3946,28098,28099,28101,28103,28105],{"class":3948,"line":4600},[3946,28100,21339],{"class":4262},[3946,28102,4814],{"class":3952},[3946,28104,4404],{"class":4403},[3946,28106,4272],{"class":3952},[3946,28108,28109,28111,28113,28115],{"class":3948,"line":4610},[3946,28110,28010],{"class":4262},[3946,28112,4814],{"class":3952},[3946,28114,4404],{"class":4403},[3946,28116,4272],{"class":3952},[3946,28118,28119],{"class":3948,"line":4623},[3946,28120,4040],{"class":3952},[3750,28122,28124],{"id":28123},"_78-notes-list-screen","7.8. Notes List Screen",[3857,28126,28128],{"className":4242,"code":28127,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FNotesListScreen.tsx\n\nimport React, { useState, useCallback } from 'react';\nimport {\n  View,\n  Text,\n  FlatList,\n  StyleSheet,\n  TouchableOpacity,\n  RefreshControl,\n  Alert,\n} from 'react-native';\nimport { useFocusEffect } from '@react-navigation\u002Fnative';\nimport { NativeStackNavigationProp } from '@react-navigation\u002Fnative-stack';\nimport { Ionicons } from '@expo\u002Fvector-icons';\nimport { AppStackParamList } from '..\u002F..\u002F..\u002Fnavigation\u002FAppNavigator';\nimport { notesApi } from '..\u002Fapi\u002FnotesApi';\nimport type { Note } from '..\u002Ftypes\u002Fnote.types';\n\ntype NotesListScreenNavigationProp = NativeStackNavigationProp\u003C\n  AppStackParamList,\n  'Notes'\n>;\n\ninterface Props {\n  navigation: NotesListScreenNavigationProp;\n}\n\nexport function NotesListScreen({ navigation }: Props) {\n  const [notes, setNotes] = useState\u003CNote[]>([]);\n  const [isLoading, setIsLoading] = useState(true);\n  const [isRefreshing, setIsRefreshing] = useState(false);\n\n  \u002F**\n   * Завантаження нотаток\n   *\u002F\n  const loadNotes = async (showRefreshIndicator = false) => {\n    try {\n      if (showRefreshIndicator) {\n        setIsRefreshing(true);\n      } else {\n        setIsLoading(true);\n      }\n\n      const data = await notesApi.getAllNotes();\n      setNotes(data);\n    } catch (error) {\n      console.error('Помилка завантаження нотаток:', error);\n      Alert.alert(\n        'Помилка',\n        'Не вдалося завантажити нотатки',\n        [{ text: 'OK' }]\n      );\n    } finally {\n      setIsLoading(false);\n      setIsRefreshing(false);\n    }\n  };\n\n  \u002F**\n   * Завантаження при фокусі екрану\n   *\u002F\n  useFocusEffect(\n    useCallback(() => {\n      loadNotes();\n    }, [])\n  );\n\n  \u002F**\n   * Pull-to-refresh\n   *\u002F\n  const handleRefresh = () => {\n    loadNotes(true);\n  };\n\n  \u002F**\n   * Навігація до деталей нотатки\n   *\u002F\n  const handleNotePress = (noteId: string) => {\n    navigation.navigate('NoteDetail', { noteId });\n  };\n\n  \u002F**\n   * Видалення нотатки\n   *\u002F\n  const handleDeleteNote = (note: Note) => {\n    Alert.alert(\n      'Видалити нотатку?',\n      `Ви впевнені, що хочете видалити \"${note.title}\"?`,\n      [\n        { text: 'Скасувати', style: 'cancel' },\n        {\n          text: 'Видалити',\n          style: 'destructive',\n          onPress: async () => {\n            try {\n              await notesApi.deleteNote(note.id);\n              setNotes((prev) => prev.filter((n) => n.id !== note.id));\n              Alert.alert('Успіх', 'Нотатку видалено');\n            } catch (error) {\n              Alert.alert('Помилка', 'Не вдалося видалити нотатку');\n            }\n          },\n        },\n      ]\n    );\n  };\n\n  \u002F**\n   * Рендер елементу списку\n   *\u002F\n  const renderNoteItem = ({ item }: { item: Note }) => (\n    \u003CTouchableOpacity\n      style={styles.noteCard}\n      onPress={() => handleNotePress(item.id)}\n      activeOpacity={0.7}\n    >\n      \u003CView style={styles.noteContent}>\n        \u003CText style={styles.noteTitle} numberOfLines={1}>\n          {item.title}\n        \u003C\u002FText>\n        \u003CText style={styles.notePreview} numberOfLines={2}>\n          {item.content}\n        \u003C\u002FText>\n        \u003CText style={styles.noteDate}>\n          {new Date(item.updatedAt).toLocaleDateString('uk-UA', {\n            day: 'numeric',\n            month: 'short',\n            year: 'numeric',\n          })}\n        \u003C\u002FText>\n      \u003C\u002FView>\n      \n      \u003CTouchableOpacity\n        style={styles.deleteButton}\n        onPress={() => handleDeleteNote(item)}\n      >\n        \u003CIonicons name=\"trash-outline\" size={20} color=\"#FF3B30\" \u002F>\n      \u003C\u002FTouchableOpacity>\n    \u003C\u002FTouchableOpacity>\n  );\n\n  \u002F**\n   * Empty state\n   *\u002F\n  const renderEmptyState = () => (\n    \u003CView style={styles.emptyState}>\n      \u003CIonicons name=\"document-text-outline\" size={64} color=\"#CCCCCC\" \u002F>\n      \u003CText style={styles.emptyTitle}>Поки що немає нотаток\u003C\u002FText>\n      \u003CText style={styles.emptySubtitle}>\n        Натисніть \"+\" щоб створити першу нотатку\n      \u003C\u002FText>\n    \u003C\u002FView>\n  );\n\n  if (isLoading) {\n    return (\n      \u003CView style={styles.centerContainer}>\n        \u003CText>Завантаження...\u003C\u002FText>\n      \u003C\u002FView>\n    );\n  }\n\n  return (\n    \u003CView style={styles.container}>\n      {\u002F* Header *\u002F}\n      \u003CView style={styles.header}>\n        \u003CText style={styles.headerTitle}>Мої Нотатки\u003C\u002FText>\n        \u003CTouchableOpacity\n          style={styles.addButton}\n          onPress={() => navigation.navigate('CreateNote')}\n        >\n          \u003CIonicons name=\"add\" size={28} color=\"#007AFF\" \u002F>\n        \u003C\u002FTouchableOpacity>\n      \u003C\u002FView>\n\n      {\u002F* List *\u002F}\n      \u003CFlatList\n        data={notes}\n        renderItem={renderNoteItem}\n        keyExtractor={(item) => item.id}\n        contentContainerStyle={[\n          styles.listContent,\n          notes.length === 0 && styles.listContentEmpty,\n        ]}\n        ListEmptyComponent={renderEmptyState}\n        refreshControl={\n          \u003CRefreshControl\n            refreshing={isRefreshing}\n            onRefresh={handleRefresh}\n            tintColor=\"#007AFF\"\n          \u002F>\n        }\n      \u002F>\n    \u003C\u002FView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#F5F5F5',\n  },\n  centerContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  header: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    paddingHorizontal: 20,\n    paddingVertical: 16,\n    backgroundColor: '#FFFFFF',\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E5E5',\n  },\n  headerTitle: {\n    fontSize: 28,\n    fontWeight: 'bold',\n    color: '#000000',\n  },\n  addButton: {\n    width: 40,\n    height: 40,\n    borderRadius: 20,\n    backgroundColor: '#E3F2FD',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  listContent: {\n    padding: 16,\n  },\n  listContentEmpty: {\n    flexGrow: 1,\n  },\n  noteCard: {\n    backgroundColor: '#FFFFFF',\n    borderRadius: 12,\n    padding: 16,\n    marginBottom: 12,\n    flexDirection: 'row',\n    alignItems: 'center',\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 2 },\n    shadowOpacity: 0.1,\n    shadowRadius: 4,\n    elevation: 3,\n  },\n  noteContent: {\n    flex: 1,\n  },\n  noteTitle: {\n    fontSize: 18,\n    fontWeight: '600',\n    color: '#000000',\n    marginBottom: 4,\n  },\n  notePreview: {\n    fontSize: 14,\n    color: '#666666',\n    marginBottom: 8,\n  },\n  noteDate: {\n    fontSize: 12,\n    color: '#999999',\n  },\n  deleteButton: {\n    padding: 8,\n    marginLeft: 12,\n  },\n  emptyState: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n    paddingHorizontal: 40,\n  },\n  emptyTitle: {\n    fontSize: 20,\n    fontWeight: '600',\n    color: '#666666',\n    marginTop: 16,\n    marginBottom: 8,\n  },\n  emptySubtitle: {\n    fontSize: 14,\n    color: '#999999',\n    textAlign: 'center',\n  },\n});\n",[3782,28129,28130,28135,28139,28161,28167,28173,28179,28186,28192,28198,28205,28211,28221,28238,28254,28270,28287,28305,28323,28327,28340,28347,28352,28356,28360,28368,28379,28383,28387,28405,28429,28452,28476,28480,28484,28489,28493,28519,28525,28535,28546,28554,28565,28569,28573,28593,28604,28616,28635,28645,28652,28659,28669,28673,28681,28692,28703,28707,28711,28715,28719,28724,28728,28735,28746,28753,28758,28762,28766,28770,28775,28779,28792,28803,28807,28811,28815,28820,28824,28845,28864,28868,28872,28876,28880,28884,28905,28916,28923,28943,28948,28967,28972,28982,28992,29008,29015,29037,29084,29105,29118,29138,29143,29148,29152,29157,29161,29165,29169,29173,29178,29182,29210,29216,29227,29240,29252,29256,29271,29295,29308,29316,29339,29351,29359,29374,29410,29422,29434,29445,29450,29458,29466,29470,29476,29488,29504,29508,29539,29547,29555,29559,29563,29567,29572,29576,29589,29604,29635,29667,29682,29702,29710,29718,29722,29726,29736,29742,29757,29773,29781,29785,29789,29793,29799,29813,29821,29835,29861,29867,29878,29890,29894,29909,29914,29919,29923,29932,29937,29942,29947,29952,29957,29962,29967,29972,29977,29982,29987,29992,29997,30005,30009,30013,30017,30022,30026,30030,30034,30038,30044,30052,30060,30064,30071,30079,30087,30095,30099,30105,30115,30124,30132,30140,30148,30156,30165,30175,30179,30186,30195,30203,30211,30215,30222,30231,30240,30248,30257,30265,30273,30277,30284,30292,30296,30303,30311,30315,30322,30330,30338,30346,30354,30362,30370,30380,30402,30412,30421,30431,30435,30442,30450,30454,30461,30470,30478,30486,30494,30498,30505,30513,30521,30529,30533,30540,30548,30557,30561,30568,30576,30585,30589,30596,30604,30612,30620,30628,30632,30639,30647,30655,30664,30673,30682,30687,30695,30704,30713,30722,30727],{"__ignoreMap":3865},[3946,28131,28132],{"class":3948,"line":3949},[3946,28133,28134],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FNotesListScreen.tsx\n",[3946,28136,28137],{"class":3948,"line":3956},[3946,28138,4278],{"emptyLinePlaceholder":4277},[3946,28140,28141,28143,28145,28147,28149,28151,28153,28155,28157,28159],{"class":3948,"line":3973},[3946,28142,4252],{"class":4251},[3946,28144,10244],{"class":4262},[3946,28146,8290],{"class":3952},[3946,28148,10543],{"class":4262},[3946,28150,4447],{"class":3952},[3946,28152,10623],{"class":4262},[3946,28154,6823],{"class":3952},[3946,28156,6826],{"class":4251},[3946,28158,10304],{"class":3966},[3946,28160,4272],{"class":3952},[3946,28162,28163,28165],{"class":3948,"line":3986},[3946,28164,4252],{"class":4251},[3946,28166,4427],{"class":3952},[3946,28168,28169,28171],{"class":3948,"line":3999},[3946,28170,21895],{"class":4262},[3946,28172,3970],{"class":3952},[3946,28174,28175,28177],{"class":3948,"line":4012},[3946,28176,21283],{"class":4262},[3946,28178,3970],{"class":3952},[3946,28180,28181,28184],{"class":3948,"line":4026},[3946,28182,28183],{"class":4262},"  FlatList",[3946,28185,3970],{"class":3952},[3946,28187,28188,28190],{"class":3948,"line":4037},[3946,28189,21290],{"class":4262},[3946,28191,3970],{"class":3952},[3946,28193,28194,28196],{"class":3948,"line":4487},[3946,28195,21276],{"class":4262},[3946,28197,3970],{"class":3952},[3946,28199,28200,28203],{"class":3948,"line":4507},[3946,28201,28202],{"class":4262},"  RefreshControl",[3946,28204,3970],{"class":3952},[3946,28206,28207,28209],{"class":3948,"line":4518},[3946,28208,22754],{"class":4262},[3946,28210,3970],{"class":3952},[3946,28212,28213,28215,28217,28219],{"class":3948,"line":4524},[3946,28214,5928],{"class":3952},[3946,28216,6826],{"class":4251},[3946,28218,12943],{"class":3966},[3946,28220,4272],{"class":3952},[3946,28222,28223,28225,28227,28230,28232,28234,28236],{"class":3948,"line":4529},[3946,28224,4252],{"class":4251},[3946,28226,6817],{"class":3952},[3946,28228,28229],{"class":4262},"useFocusEffect",[3946,28231,6823],{"class":3952},[3946,28233,6826],{"class":4251},[3946,28235,12915],{"class":3966},[3946,28237,4272],{"class":3952},[3946,28239,28240,28242,28244,28246,28248,28250,28252],{"class":3948,"line":4534},[3946,28241,4252],{"class":4251},[3946,28243,6817],{"class":3952},[3946,28245,22775],{"class":4262},[3946,28247,6823],{"class":3952},[3946,28249,6826],{"class":4251},[3946,28251,13355],{"class":3966},[3946,28253,4272],{"class":3952},[3946,28255,28256,28258,28260,28262,28264,28266,28268],{"class":3948,"line":4540},[3946,28257,4252],{"class":4251},[3946,28259,6817],{"class":3952},[3946,28261,13775],{"class":4262},[3946,28263,6823],{"class":3952},[3946,28265,6826],{"class":4251},[3946,28267,13782],{"class":3966},[3946,28269,4272],{"class":3952},[3946,28271,28272,28274,28276,28278,28280,28282,28285],{"class":3948,"line":4567},[3946,28273,4252],{"class":4251},[3946,28275,6817],{"class":3952},[3946,28277,13987],{"class":4262},[3946,28279,6823],{"class":3952},[3946,28281,6826],{"class":4251},[3946,28283,28284],{"class":3966}," '..\u002F..\u002F..\u002Fnavigation\u002FAppNavigator'",[3946,28286,4272],{"class":3952},[3946,28288,28289,28291,28293,28296,28298,28300,28303],{"class":3948,"line":4574},[3946,28290,4252],{"class":4251},[3946,28292,6817],{"class":3952},[3946,28294,28295],{"class":4262},"notesApi",[3946,28297,6823],{"class":3952},[3946,28299,6826],{"class":4251},[3946,28301,28302],{"class":3966}," '..\u002Fapi\u002FnotesApi'",[3946,28304,4272],{"class":3952},[3946,28306,28307,28309,28311,28313,28315,28317,28319,28321],{"class":3948,"line":4600},[3946,28308,4252],{"class":4251},[3946,28310,6814],{"class":4251},[3946,28312,6817],{"class":3952},[3946,28314,27175],{"class":4262},[3946,28316,6823],{"class":3952},[3946,28318,6826],{"class":4251},[3946,28320,27192],{"class":3966},[3946,28322,4272],{"class":3952},[3946,28324,28325],{"class":3948,"line":4610},[3946,28326,4278],{"emptyLinePlaceholder":4277},[3946,28328,28329,28331,28334,28336,28338],{"class":3948,"line":4623},[3946,28330,22861],{"class":4255},[3946,28332,28333],{"class":4403}," NotesListScreenNavigationProp",[3946,28335,4290],{"class":3952},[3946,28337,22775],{"class":4403},[3946,28339,22871],{"class":3952},[3946,28341,28342,28345],{"class":3948,"line":4643},[3946,28343,28344],{"class":4403},"  AppStackParamList",[3946,28346,3970],{"class":3952},[3946,28348,28349],{"class":3948,"line":4653},[3946,28350,28351],{"class":3966},"  'Notes'\n",[3946,28353,28354],{"class":3948,"line":4658},[3946,28355,6463],{"class":3952},[3946,28357,28358],{"class":3948,"line":4663},[3946,28359,4278],{"emptyLinePlaceholder":4277},[3946,28361,28362,28364,28366],{"class":3948,"line":4668},[3946,28363,4801],{"class":4255},[3946,28365,17922],{"class":4403},[3946,28367,4427],{"class":3952},[3946,28369,28370,28372,28374,28377],{"class":3948,"line":4674},[3946,28371,22904],{"class":4262},[3946,28373,3963],{"class":3952},[3946,28375,28376],{"class":4403},"NotesListScreenNavigationProp",[3946,28378,4272],{"class":3952},[3946,28380,28381],{"class":3948,"line":4694},[3946,28382,4040],{"class":3952},[3946,28384,28385],{"class":3948,"line":4701},[3946,28386,4278],{"emptyLinePlaceholder":4277},[3946,28388,28389,28391,28393,28395,28397,28399,28401,28403],{"class":3948,"line":4719},[3946,28390,6030],{"class":4251},[3946,28392,4390],{"class":4255},[3946,28394,15825],{"class":4224},[3946,28396,10506],{"class":3952},[3946,28398,16226],{"class":4262},[3946,28400,10512],{"class":3952},[3946,28402,18038],{"class":4403},[3946,28404,4318],{"class":3952},[3946,28406,28407,28409,28411,28413,28415,28418,28420,28422,28424,28426],{"class":3948,"line":4735},[3946,28408,5018],{"class":4255},[3946,28410,10529],{"class":3952},[3946,28412,20918],{"class":4286},[3946,28414,4447],{"class":3952},[3946,28416,28417],{"class":4286},"setNotes",[3946,28419,10540],{"class":3952},[3946,28421,10543],{"class":4224},[3946,28423,4413],{"class":3952},[3946,28425,27175],{"class":4403},[3946,28427,28428],{"class":3952},"[]>([]);\n",[3946,28430,28431,28433,28435,28437,28439,28442,28444,28446,28448,28450],{"class":3948,"line":4748},[3946,28432,5018],{"class":4255},[3946,28434,10529],{"class":3952},[3946,28436,13046],{"class":4286},[3946,28438,4447],{"class":3952},[3946,28440,28441],{"class":4286},"setIsLoading",[3946,28443,10540],{"class":3952},[3946,28445,10543],{"class":4224},[3946,28447,4331],{"class":3952},[3946,28449,17493],{"class":4255},[3946,28451,4337],{"class":3952},[3946,28453,28454,28456,28458,28461,28463,28466,28468,28470,28472,28474],{"class":3948,"line":4768},[3946,28455,5018],{"class":4255},[3946,28457,10529],{"class":3952},[3946,28459,28460],{"class":4286},"isRefreshing",[3946,28462,4447],{"class":3952},[3946,28464,28465],{"class":4286},"setIsRefreshing",[3946,28467,10540],{"class":3952},[3946,28469,10543],{"class":4224},[3946,28471,4331],{"class":3952},[3946,28473,13575],{"class":4255},[3946,28475,4337],{"class":3952},[3946,28477,28478],{"class":3948,"line":4777},[3946,28479,4278],{"emptyLinePlaceholder":4277},[3946,28481,28482],{"class":3948,"line":4782},[3946,28483,6908],{"class":4342},[3946,28485,28486],{"class":3948,"line":6262},[3946,28487,28488],{"class":4342},"   * Завантаження нотаток\n",[3946,28490,28491],{"class":3948,"line":6273},[3946,28492,6918],{"class":4342},[3946,28494,28495,28497,28500,28502,28504,28506,28509,28511,28513,28515,28517],{"class":3948,"line":6284},[3946,28496,5018],{"class":4255},[3946,28498,28499],{"class":4224}," loadNotes",[3946,28501,4290],{"class":3952},[3946,28503,4387],{"class":4255},[3946,28505,4479],{"class":3952},[3946,28507,28508],{"class":4262},"showRefreshIndicator",[3946,28510,4290],{"class":3952},[3946,28512,13575],{"class":4255},[3946,28514,5783],{"class":3952},[3946,28516,6453],{"class":4255},[3946,28518,4427],{"class":3952},[3946,28520,28521,28523],{"class":3948,"line":6299},[3946,28522,6977],{"class":4251},[3946,28524,4427],{"class":3952},[3946,28526,28527,28529,28531,28533],{"class":3948,"line":6304},[3946,28528,7246],{"class":4251},[3946,28530,4479],{"class":3952},[3946,28532,28508],{"class":4262},[3946,28534,4318],{"class":3952},[3946,28536,28537,28540,28542,28544],{"class":3948,"line":6309},[3946,28538,28539],{"class":4224},"        setIsRefreshing",[3946,28541,4331],{"class":3952},[3946,28543,17493],{"class":4255},[3946,28545,4337],{"class":3952},[3946,28547,28548,28550,28552],{"class":3948,"line":6314},[3946,28549,11493],{"class":3952},[3946,28551,23192],{"class":4251},[3946,28553,4427],{"class":3952},[3946,28555,28556,28559,28561,28563],{"class":3948,"line":6320},[3946,28557,28558],{"class":4224},"        setIsLoading",[3946,28560,4331],{"class":3952},[3946,28562,17493],{"class":4255},[3946,28564,4337],{"class":3952},[3946,28566,28567],{"class":3948,"line":6325},[3946,28568,7282],{"class":3952},[3946,28570,28571],{"class":3948,"line":6337},[3946,28572,4278],{"emptyLinePlaceholder":4277},[3946,28574,28575,28577,28580,28582,28584,28586,28588,28591],{"class":3948,"line":6352},[3946,28576,6984],{"class":4255},[3946,28578,28579],{"class":4286}," data",[3946,28581,4290],{"class":3952},[3946,28583,4293],{"class":4251},[3946,28585,27937],{"class":4262},[3946,28587,4298],{"class":3952},[3946,28589,28590],{"class":4224},"getAllNotes",[3946,28592,4304],{"class":3952},[3946,28594,28595,28598,28600,28602],{"class":3948,"line":6364},[3946,28596,28597],{"class":4224},"      setNotes",[3946,28599,4331],{"class":3952},[3946,28601,5178],{"class":4262},[3946,28603,4337],{"class":3952},[3946,28605,28606,28608,28610,28612,28614],{"class":3948,"line":6376},[3946,28607,7115],{"class":3952},[3946,28609,4476],{"class":4251},[3946,28611,4479],{"class":3952},[3946,28613,4482],{"class":4262},[3946,28615,4318],{"class":3952},[3946,28617,28618,28620,28622,28624,28626,28629,28631,28633],{"class":3948,"line":6392},[3946,28619,5525],{"class":4262},[3946,28621,4298],{"class":3952},[3946,28623,4482],{"class":4224},[3946,28625,4331],{"class":3952},[3946,28627,28628],{"class":3966},"'Помилка завантаження нотаток:'",[3946,28630,4447],{"class":3952},[3946,28632,4482],{"class":4262},[3946,28634,4337],{"class":3952},[3946,28636,28637,28639,28641,28643],{"class":3948,"line":6397},[3946,28638,23537],{"class":4262},[3946,28640,4298],{"class":3952},[3946,28642,23542],{"class":4224},[3946,28644,6594],{"class":3952},[3946,28646,28647,28650],{"class":3948,"line":6402},[3946,28648,28649],{"class":3966},"        'Помилка'",[3946,28651,3970],{"class":3952},[3946,28653,28654,28657],{"class":3948,"line":6407},[3946,28655,28656],{"class":3966},"        'Не вдалося завантажити нотатки'",[3946,28658,3970],{"class":3952},[3946,28660,28661,28663,28665,28667],{"class":3948,"line":6413},[3946,28662,23568],{"class":3952},[3946,28664,23571],{"class":4262},[3946,28666,23574],{"class":3966},[3946,28668,23577],{"class":3952},[3946,28670,28671],{"class":3948,"line":6418},[3946,28672,8984],{"class":3952},[3946,28674,28675,28677,28679],{"class":3948,"line":6434},[3946,28676,7115],{"class":3952},[3946,28678,12029],{"class":4251},[3946,28680,4427],{"class":3952},[3946,28682,28683,28686,28688,28690],{"class":3948,"line":6466},[3946,28684,28685],{"class":4224},"      setIsLoading",[3946,28687,4331],{"class":3952},[3946,28689,13575],{"class":4255},[3946,28691,4337],{"class":3952},[3946,28693,28694,28697,28699,28701],{"class":3948,"line":6493},[3946,28695,28696],{"class":4224},"      setIsRefreshing",[3946,28698,4331],{"class":3952},[3946,28700,13575],{"class":4255},[3946,28702,4337],{"class":3952},[3946,28704,28705],{"class":3948,"line":6512},[3946,28706,5550],{"class":3952},[3946,28708,28709],{"class":3948,"line":6530},[3946,28710,15539],{"class":3952},[3946,28712,28713],{"class":3948,"line":6545},[3946,28714,4278],{"emptyLinePlaceholder":4277},[3946,28716,28717],{"class":3948,"line":6550},[3946,28718,6908],{"class":4342},[3946,28720,28721],{"class":3948,"line":6555},[3946,28722,28723],{"class":4342},"   * Завантаження при фокусі екрану\n",[3946,28725,28726],{"class":3948,"line":6560},[3946,28727,6918],{"class":4342},[3946,28729,28730,28733],{"class":3948,"line":6566},[3946,28731,28732],{"class":4224},"  useFocusEffect",[3946,28734,6594],{"class":3952},[3946,28736,28737,28740,28742,28744],{"class":3948,"line":6571},[3946,28738,28739],{"class":4224},"    useCallback",[3946,28741,10707],{"class":3952},[3946,28743,6453],{"class":4255},[3946,28745,4427],{"class":3952},[3946,28747,28748,28751],{"class":3948,"line":6588},[3946,28749,28750],{"class":4224},"      loadNotes",[3946,28752,4304],{"class":3952},[3946,28754,28755],{"class":3948,"line":6597},[3946,28756,28757],{"class":3952},"    }, [])\n",[3946,28759,28760],{"class":3948,"line":6609},[3946,28761,10875],{"class":3952},[3946,28763,28764],{"class":3948,"line":6640},[3946,28765,4278],{"emptyLinePlaceholder":4277},[3946,28767,28768],{"class":3948,"line":6653},[3946,28769,6908],{"class":4342},[3946,28771,28772],{"class":3948,"line":6659},[3946,28773,28774],{"class":4342},"   * Pull-to-refresh\n",[3946,28776,28777],{"class":3948,"line":6671},[3946,28778,6918],{"class":4342},[3946,28780,28781,28783,28786,28788,28790],{"class":3948,"line":6689},[3946,28782,5018],{"class":4255},[3946,28784,28785],{"class":4224}," handleRefresh",[3946,28787,18252],{"class":3952},[3946,28789,6453],{"class":4255},[3946,28791,4427],{"class":3952},[3946,28793,28794,28797,28799,28801],{"class":3948,"line":6694},[3946,28795,28796],{"class":4224},"    loadNotes",[3946,28798,4331],{"class":3952},[3946,28800,17493],{"class":4255},[3946,28802,4337],{"class":3952},[3946,28804,28805],{"class":3948,"line":6699},[3946,28806,15539],{"class":3952},[3946,28808,28809],{"class":3948,"line":6704},[3946,28810,4278],{"emptyLinePlaceholder":4277},[3946,28812,28813],{"class":3948,"line":6709},[3946,28814,6908],{"class":4342},[3946,28816,28817],{"class":3948,"line":6715},[3946,28818,28819],{"class":4342},"   * Навігація до деталей нотатки\n",[3946,28821,28822],{"class":3948,"line":6720},[3946,28823,6918],{"class":4342},[3946,28825,28826,28828,28831,28833,28835,28837,28839,28841,28843],{"class":3948,"line":6732},[3946,28827,5018],{"class":4255},[3946,28829,28830],{"class":4224}," handleNotePress",[3946,28832,25165],{"class":3952},[3946,28834,13905],{"class":4262},[3946,28836,3963],{"class":3952},[3946,28838,4404],{"class":4403},[3946,28840,5783],{"class":3952},[3946,28842,6453],{"class":4255},[3946,28844,4427],{"class":3952},[3946,28846,28847,28849,28851,28853,28855,28858,28860,28862],{"class":3948,"line":6743},[3946,28848,23630],{"class":4262},[3946,28850,4298],{"class":3952},[3946,28852,23635],{"class":4224},[3946,28854,4331],{"class":3952},[3946,28856,28857],{"class":3966},"'NoteDetail'",[3946,28859,8290],{"class":3952},[3946,28861,13905],{"class":4262},[3946,28863,10726],{"class":3952},[3946,28865,28866],{"class":3948,"line":6754},[3946,28867,15539],{"class":3952},[3946,28869,28870],{"class":3948,"line":6768},[3946,28871,4278],{"emptyLinePlaceholder":4277},[3946,28873,28874],{"class":3948,"line":7572},[3946,28875,6908],{"class":4342},[3946,28877,28878],{"class":3948,"line":7590},[3946,28879,27858],{"class":4342},[3946,28881,28882],{"class":3948,"line":7609},[3946,28883,6918],{"class":4342},[3946,28885,28886,28888,28891,28893,28895,28897,28899,28901,28903],{"class":3948,"line":7615},[3946,28887,5018],{"class":4255},[3946,28889,28890],{"class":4224}," handleDeleteNote",[3946,28892,25165],{"class":3952},[3946,28894,20928],{"class":4262},[3946,28896,3963],{"class":3952},[3946,28898,27175],{"class":4403},[3946,28900,5783],{"class":3952},[3946,28902,6453],{"class":4255},[3946,28904,4427],{"class":3952},[3946,28906,28907,28910,28912,28914],{"class":3948,"line":7633},[3946,28908,28909],{"class":4262},"    Alert",[3946,28911,4298],{"class":3952},[3946,28913,23542],{"class":4224},[3946,28915,6594],{"class":3952},[3946,28917,28918,28921],{"class":3948,"line":7638},[3946,28919,28920],{"class":3966},"      'Видалити нотатку?'",[3946,28922,3970],{"class":3952},[3946,28924,28925,28928,28930,28932,28934,28936,28938,28941],{"class":3948,"line":7644},[3946,28926,28927],{"class":3966},"      `Ви впевнені, що хочете видалити \"",[3946,28929,8669],{"class":4255},[3946,28931,20928],{"class":4262},[3946,28933,4298],{"class":16179},[3946,28935,15121],{"class":4262},[3946,28937,8674],{"class":4255},[3946,28939,28940],{"class":3966},"\"?`",[3946,28942,3970],{"class":3952},[3946,28944,28945],{"class":3948,"line":7677},[3946,28946,28947],{"class":3952},"      [\n",[3946,28949,28950,28952,28954,28957,28959,28962,28965],{"class":3948,"line":7682},[3946,28951,9369],{"class":3952},[3946,28953,23571],{"class":4262},[3946,28955,28956],{"class":3966}," 'Скасувати'",[3946,28958,4447],{"class":3952},[3946,28960,28961],{"class":4262},"style:",[3946,28963,28964],{"class":3966}," 'cancel'",[3946,28966,19998],{"class":3952},[3946,28968,28969],{"class":3948,"line":7694},[3946,28970,28971],{"class":3952},"        {\n",[3946,28973,28974,28977,28980],{"class":3948,"line":7710},[3946,28975,28976],{"class":4262},"          text:",[3946,28978,28979],{"class":3966}," 'Видалити'",[3946,28981,3970],{"class":3952},[3946,28983,28984,28987,28990],{"class":3948,"line":7715},[3946,28985,28986],{"class":4262},"          style:",[3946,28988,28989],{"class":3966}," 'destructive'",[3946,28991,3970],{"class":3952},[3946,28993,28994,28997,28999,29002,29004,29006],{"class":3948,"line":7720},[3946,28995,28996],{"class":4224},"          onPress",[3946,28998,8545],{"class":4262},[3946,29000,29001],{"class":4255}," async",[3946,29003,11004],{"class":3952},[3946,29005,6453],{"class":4255},[3946,29007,4427],{"class":3952},[3946,29009,29010,29013],{"class":3948,"line":7729},[3946,29011,29012],{"class":4251},"            try",[3946,29014,4427],{"class":3952},[3946,29016,29017,29020,29022,29024,29027,29029,29031,29033,29035],{"class":3948,"line":7734},[3946,29018,29019],{"class":4251},"              await",[3946,29021,27937],{"class":4262},[3946,29023,4298],{"class":3952},[3946,29025,29026],{"class":4224},"deleteNote",[3946,29028,4331],{"class":3952},[3946,29030,20928],{"class":4262},[3946,29032,4298],{"class":3952},[3946,29034,19984],{"class":4262},[3946,29036,4337],{"class":3952},[3946,29038,29039,29042,29044,29046,29048,29050,29053,29055,29057,29059,29062,29064,29066,29069,29071,29073,29075,29077,29079,29081],{"class":3948,"line":7739},[3946,29040,29041],{"class":4224},"              setNotes",[3946,29043,8135],{"class":3952},[3946,29045,10654],{"class":4262},[3946,29047,5783],{"class":3952},[3946,29049,6453],{"class":4255},[3946,29051,29052],{"class":4262}," prev",[3946,29054,4298],{"class":3952},[3946,29056,20923],{"class":4224},[3946,29058,8135],{"class":3952},[3946,29060,29061],{"class":4262},"n",[3946,29063,5783],{"class":3952},[3946,29065,6453],{"class":4255},[3946,29067,29068],{"class":4262}," n",[3946,29070,4298],{"class":3952},[3946,29072,19984],{"class":4262},[3946,29074,15303],{"class":3952},[3946,29076,20928],{"class":4262},[3946,29078,4298],{"class":3952},[3946,29080,19984],{"class":4262},[3946,29082,29083],{"class":3952},"));\n",[3946,29085,29086,29089,29091,29093,29095,29098,29100,29103],{"class":3948,"line":7744},[3946,29087,29088],{"class":4262},"              Alert",[3946,29090,4298],{"class":3952},[3946,29092,23542],{"class":4224},[3946,29094,4331],{"class":3952},[3946,29096,29097],{"class":3966},"'Успіх'",[3946,29099,4447],{"class":3952},[3946,29101,29102],{"class":3966},"'Нотатку видалено'",[3946,29104,4337],{"class":3952},[3946,29106,29107,29110,29112,29114,29116],{"class":3948,"line":7750},[3946,29108,29109],{"class":3952},"            } ",[3946,29111,4476],{"class":4251},[3946,29113,4479],{"class":3952},[3946,29115,4482],{"class":4262},[3946,29117,4318],{"class":3952},[3946,29119,29120,29122,29124,29126,29128,29131,29133,29136],{"class":3948,"line":7755},[3946,29121,29088],{"class":4262},[3946,29123,4298],{"class":3952},[3946,29125,23542],{"class":4224},[3946,29127,4331],{"class":3952},[3946,29129,29130],{"class":3966},"'Помилка'",[3946,29132,4447],{"class":3952},[3946,29134,29135],{"class":3966},"'Не вдалося видалити нотатку'",[3946,29137,4337],{"class":3952},[3946,29139,29140],{"class":3948,"line":7765},[3946,29141,29142],{"class":3952},"            }\n",[3946,29144,29145],{"class":3948,"line":7777},[3946,29146,29147],{"class":3952},"          },\n",[3946,29149,29150],{"class":3948,"line":7786},[3946,29151,14311],{"class":3952},[3946,29153,29154],{"class":3948,"line":7799},[3946,29155,29156],{"class":3952},"      ]\n",[3946,29158,29159],{"class":3948,"line":7818},[3946,29160,8731],{"class":3952},[3946,29162,29163],{"class":3948,"line":7823},[3946,29164,15539],{"class":3952},[3946,29166,29167],{"class":3948,"line":7834},[3946,29168,4278],{"emptyLinePlaceholder":4277},[3946,29170,29171],{"class":3948,"line":7850},[3946,29172,6908],{"class":4342},[3946,29174,29175],{"class":3948,"line":7855},[3946,29176,29177],{"class":4342},"   * Рендер елементу списку\n",[3946,29179,29180],{"class":3948,"line":7860},[3946,29181,6918],{"class":4342},[3946,29183,29184,29186,29189,29192,29195,29198,29200,29202,29204,29206,29208],{"class":3948,"line":7891},[3946,29185,5018],{"class":4255},[3946,29187,29188],{"class":4224}," renderNoteItem",[3946,29190,29191],{"class":3952}," = ({ ",[3946,29193,29194],{"class":4262},"item",[3946,29196,29197],{"class":3952}," }: { ",[3946,29199,29194],{"class":4262},[3946,29201,3963],{"class":3952},[3946,29203,27175],{"class":4403},[3946,29205,14088],{"class":3952},[3946,29207,6453],{"class":4255},[3946,29209,13079],{"class":3952},[3946,29211,29212,29214],{"class":3948,"line":7896},[3946,29213,13158],{"class":3952},[3946,29215,15436],{"class":4262},[3946,29217,29218,29220,29222,29225],{"class":3948,"line":7901},[3946,29219,21472],{"class":4262},[3946,29221,13092],{"class":3952},[3946,29223,29224],{"class":4262},"noteCard",[3946,29226,4040],{"class":3952},[3946,29228,29229,29232,29234,29237],{"class":3948,"line":7906},[3946,29230,29231],{"class":4262},"      onPress",[3946,29233,15207],{"class":3952},[3946,29235,29236],{"class":4224},"handleNotePress",[3946,29238,29239],{"class":3952},"(item.id)}\n",[3946,29241,29242,29245,29247,29250],{"class":3948,"line":7912},[3946,29243,29244],{"class":4262},"      activeOpacity",[3946,29246,12602],{"class":3952},[3946,29248,29249],{"class":4020},"0.7",[3946,29251,4040],{"class":3952},[3946,29253,29254],{"class":3948,"line":7917},[3946,29255,13602],{"class":3952},[3946,29257,29258,29260,29262,29264,29266,29269],{"class":3948,"line":7935},[3946,29259,13084],{"class":3952},[3946,29261,12926],{"class":4262},[3946,29263,13089],{"class":4262},[3946,29265,13092],{"class":3952},[3946,29267,29268],{"class":4262},"noteContent",[3946,29270,13098],{"class":3952},[3946,29272,29273,29275,29277,29279,29281,29284,29286,29289,29291,29293],{"class":3948,"line":7942},[3946,29274,13103],{"class":3952},[3946,29276,14762],{"class":4262},[3946,29278,13089],{"class":4262},[3946,29280,13092],{"class":3952},[3946,29282,29283],{"class":4262},"noteTitle",[3946,29285,5928],{"class":3952},[3946,29287,29288],{"class":4262},"numberOfLines",[3946,29290,12602],{"class":3952},[3946,29292,19610],{"class":4020},[3946,29294,13098],{"class":3952},[3946,29296,29297,29300,29302,29304,29306],{"class":3948,"line":7963},[3946,29298,29299],{"class":3952},"          {",[3946,29301,29194],{"class":4262},[3946,29303,4298],{"class":3952},[3946,29305,15121],{"class":4262},[3946,29307,4040],{"class":3952},[3946,29309,29310,29312,29314],{"class":3948,"line":7979},[3946,29311,15256],{"class":3952},[3946,29313,14762],{"class":4262},[3946,29315,13135],{"class":3952},[3946,29317,29318,29320,29322,29324,29326,29329,29331,29333,29335,29337],{"class":3948,"line":7992},[3946,29319,13103],{"class":3952},[3946,29321,14762],{"class":4262},[3946,29323,13089],{"class":4262},[3946,29325,13092],{"class":3952},[3946,29327,29328],{"class":4262},"notePreview",[3946,29330,5928],{"class":3952},[3946,29332,29288],{"class":4262},[3946,29334,12602],{"class":3952},[3946,29336,25417],{"class":4020},[3946,29338,13098],{"class":3952},[3946,29340,29341,29343,29345,29347,29349],{"class":3948,"line":8012},[3946,29342,29299],{"class":3952},[3946,29344,29194],{"class":4262},[3946,29346,4298],{"class":3952},[3946,29348,21027],{"class":4262},[3946,29350,4040],{"class":3952},[3946,29352,29353,29355,29357],{"class":3948,"line":8018},[3946,29354,15256],{"class":3952},[3946,29356,14762],{"class":4262},[3946,29358,13135],{"class":3952},[3946,29360,29361,29363,29365,29367,29369,29372],{"class":3948,"line":8023},[3946,29362,13103],{"class":3952},[3946,29364,14762],{"class":4262},[3946,29366,13089],{"class":4262},[3946,29368,13092],{"class":3952},[3946,29370,29371],{"class":4262},"noteDate",[3946,29373,13098],{"class":3952},[3946,29375,29376,29378,29380,29382,29384,29386,29388,29391,29393,29396,29399,29402,29404,29407],{"class":3948,"line":8028},[3946,29377,29299],{"class":3952},[3946,29379,8218],{"class":4262},[3946,29381,7015],{"class":4262},[3946,29383,4331],{"class":3952},[3946,29385,29194],{"class":4262},[3946,29387,4298],{"class":3952},[3946,29389,29390],{"class":4262},"updatedAt",[3946,29392,19644],{"class":3952},[3946,29394,29395],{"class":4262},"toLocaleDateString",[3946,29397,29398],{"class":3952},"('",[3946,29400,29401],{"class":4262},"uk",[3946,29403,5121],{"class":3952},[3946,29405,29406],{"class":4262},"UA",[3946,29408,29409],{"class":3952},"', {\n",[3946,29411,29412,29415,29417,29420],{"class":3948,"line":8033},[3946,29413,29414],{"class":4262},"            day",[3946,29416,3963],{"class":3952},[3946,29418,29419],{"class":3966},"'numeric'",[3946,29421,3970],{"class":3952},[3946,29423,29424,29427,29429,29432],{"class":3948,"line":8038},[3946,29425,29426],{"class":4262},"            month",[3946,29428,3963],{"class":3952},[3946,29430,29431],{"class":3966},"'short'",[3946,29433,3970],{"class":3952},[3946,29435,29436,29439,29441,29443],{"class":3948,"line":8044},[3946,29437,29438],{"class":4262},"            year",[3946,29440,3963],{"class":3952},[3946,29442,29419],{"class":3966},[3946,29444,3970],{"class":3952},[3946,29446,29447],{"class":3948,"line":8049},[3946,29448,29449],{"class":3952},"          })}\n",[3946,29451,29452,29454,29456],{"class":3948,"line":8071},[3946,29453,15256],{"class":3952},[3946,29455,14762],{"class":4262},[3946,29457,13135],{"class":3952},[3946,29459,29460,29462,29464],{"class":3948,"line":8090},[3946,29461,13130],{"class":3952},[3946,29463,12926],{"class":4262},[3946,29465,13135],{"class":3952},[3946,29467,29468],{"class":3948,"line":8095},[3946,29469,7095],{"class":3952},[3946,29471,29472,29474],{"class":3948,"line":8112},[3946,29473,13084],{"class":3952},[3946,29475,15436],{"class":4262},[3946,29477,29478,29481,29483,29486],{"class":3948,"line":8117},[3946,29479,29480],{"class":4262},"        style",[3946,29482,13092],{"class":3952},[3946,29484,29485],{"class":4262},"deleteButton",[3946,29487,4040],{"class":3952},[3946,29489,29490,29493,29495,29498,29500,29502],{"class":3948,"line":8160},[3946,29491,29492],{"class":4262},"        onPress",[3946,29494,15207],{"class":3952},[3946,29496,29497],{"class":4224},"handleDeleteNote",[3946,29499,4331],{"class":3952},[3946,29501,29194],{"class":4262},[3946,29503,26444],{"class":3952},[3946,29505,29506],{"class":3948,"line":8185},[3946,29507,23739],{"class":3952},[3946,29509,29510,29512,29514,29516,29518,29521,29523,29525,29528,29530,29532,29534,29537],{"class":3948,"line":8190},[3946,29511,13103],{"class":3952},[3946,29513,13775],{"class":4262},[3946,29515,13616],{"class":4262},[3946,29517,13111],{"class":3952},[3946,29519,29520],{"class":3966},"\"trash-outline\"",[3946,29522,13108],{"class":4262},[3946,29524,12602],{"class":3952},[3946,29526,29527],{"class":4020},"20",[3946,29529,5928],{"class":3952},[3946,29531,14080],{"class":4262},[3946,29533,13111],{"class":3952},[3946,29535,29536],{"class":3966},"\"#FF3B30\"",[3946,29538,13125],{"class":3952},[3946,29540,29541,29543,29545],{"class":3948,"line":8195},[3946,29542,13130],{"class":3952},[3946,29544,14771],{"class":4262},[3946,29546,13135],{"class":3952},[3946,29548,29549,29551,29553],{"class":3948,"line":8200},[3946,29550,13187],{"class":3952},[3946,29552,14771],{"class":4262},[3946,29554,13135],{"class":3952},[3946,29556,29557],{"class":3948,"line":8206},[3946,29558,10875],{"class":3952},[3946,29560,29561],{"class":3948,"line":9571},[3946,29562,4278],{"emptyLinePlaceholder":4277},[3946,29564,29565],{"class":3948,"line":9589},[3946,29566,6908],{"class":4342},[3946,29568,29569],{"class":3948,"line":9596},[3946,29570,29571],{"class":4342},"   * Empty state\n",[3946,29573,29574],{"class":3948,"line":9618},[3946,29575,6918],{"class":4342},[3946,29577,29578,29580,29583,29585,29587],{"class":3948,"line":9627},[3946,29579,5018],{"class":4255},[3946,29581,29582],{"class":4224}," renderEmptyState",[3946,29584,18252],{"class":3952},[3946,29586,6453],{"class":4255},[3946,29588,13079],{"class":3952},[3946,29590,29591,29593,29595,29597,29599,29602],{"class":3948,"line":9636},[3946,29592,13158],{"class":3952},[3946,29594,12926],{"class":4262},[3946,29596,13089],{"class":4262},[3946,29598,13092],{"class":3952},[3946,29600,29601],{"class":4262},"emptyState",[3946,29603,13098],{"class":3952},[3946,29605,29606,29608,29610,29612,29614,29617,29619,29621,29624,29626,29628,29630,29633],{"class":3948,"line":9645},[3946,29607,13084],{"class":3952},[3946,29609,13775],{"class":4262},[3946,29611,13616],{"class":4262},[3946,29613,13111],{"class":3952},[3946,29615,29616],{"class":3966},"\"document-text-outline\"",[3946,29618,13108],{"class":4262},[3946,29620,12602],{"class":3952},[3946,29622,29623],{"class":4020},"64",[3946,29625,5928],{"class":3952},[3946,29627,14080],{"class":4262},[3946,29629,13111],{"class":3952},[3946,29631,29632],{"class":3966},"\"#CCCCCC\"",[3946,29634,13125],{"class":3952},[3946,29636,29637,29639,29641,29643,29645,29648,29650,29653,29656,29658,29661,29663,29665],{"class":3948,"line":9650},[3946,29638,13084],{"class":3952},[3946,29640,14762],{"class":4262},[3946,29642,13089],{"class":4262},[3946,29644,13092],{"class":3952},[3946,29646,29647],{"class":4262},"emptyTitle",[3946,29649,15124],{"class":3952},[3946,29651,29652],{"class":4262},"Поки",[3946,29654,29655],{"class":4262}," що",[3946,29657,15382],{"class":4262},[3946,29659,29660],{"class":4262}," нотаток",[3946,29662,15133],{"class":3952},[3946,29664,14762],{"class":4262},[3946,29666,13135],{"class":3952},[3946,29668,29669,29671,29673,29675,29677,29680],{"class":3948,"line":9655},[3946,29670,13084],{"class":3952},[3946,29672,14762],{"class":4262},[3946,29674,13089],{"class":4262},[3946,29676,13092],{"class":3952},[3946,29678,29679],{"class":4262},"emptySubtitle",[3946,29681,13098],{"class":3952},[3946,29683,29684,29687,29690,29693,29696,29699],{"class":3948,"line":9660},[3946,29685,29686],{"class":4262},"        Натисніть",[3946,29688,29689],{"class":3966}," \"+\"",[3946,29691,29692],{"class":4262}," щоб",[3946,29694,29695],{"class":4262}," створити",[3946,29697,29698],{"class":4262}," першу",[3946,29700,29701],{"class":4262}," нотатку\n",[3946,29703,29704,29706,29708],{"class":3948,"line":9665},[3946,29705,13130],{"class":3952},[3946,29707,14762],{"class":4262},[3946,29709,13135],{"class":3952},[3946,29711,29712,29714,29716],{"class":3948,"line":9671},[3946,29713,13187],{"class":3952},[3946,29715,12926],{"class":4262},[3946,29717,13135],{"class":3952},[3946,29719,29720],{"class":3948,"line":9676},[3946,29721,10875],{"class":3952},[3946,29723,29724],{"class":3948,"line":9700},[3946,29725,4278],{"emptyLinePlaceholder":4277},[3946,29727,29728,29730,29732,29734],{"class":3948,"line":9721},[3946,29729,5776],{"class":4251},[3946,29731,4479],{"class":3952},[3946,29733,13046],{"class":4262},[3946,29735,4318],{"class":3952},[3946,29737,29738,29740],{"class":3948,"line":9756},[3946,29739,4603],{"class":4251},[3946,29741,13079],{"class":3952},[3946,29743,29744,29746,29748,29750,29752,29755],{"class":3948,"line":9778},[3946,29745,13084],{"class":3952},[3946,29747,12926],{"class":4262},[3946,29749,13089],{"class":4262},[3946,29751,13092],{"class":3952},[3946,29753,29754],{"class":4262},"centerContainer",[3946,29756,13098],{"class":3952},[3946,29758,29759,29761,29763,29765,29767,29769,29771],{"class":3948,"line":9783},[3946,29760,13103],{"class":3952},[3946,29762,14762],{"class":4403},[3946,29764,16361],{"class":3952},[3946,29766,16364],{"class":4262},[3946,29768,16367],{"class":3952},[3946,29770,14762],{"class":4262},[3946,29772,13135],{"class":3952},[3946,29774,29775,29777,29779],{"class":3948,"line":9789},[3946,29776,13130],{"class":3952},[3946,29778,12926],{"class":4262},[3946,29780,13135],{"class":3952},[3946,29782,29783],{"class":3948,"line":9801},[3946,29784,8731],{"class":3952},[3946,29786,29787],{"class":3948,"line":9813},[3946,29788,4521],{"class":3952},[3946,29790,29791],{"class":3948,"line":9830},[3946,29792,4278],{"emptyLinePlaceholder":4277},[3946,29794,29795,29797],{"class":3948,"line":9840},[3946,29796,5062],{"class":4251},[3946,29798,13079],{"class":3952},[3946,29800,29801,29803,29805,29807,29809,29811],{"class":3948,"line":9856},[3946,29802,13158],{"class":3952},[3946,29804,12926],{"class":4262},[3946,29806,13089],{"class":4262},[3946,29808,13092],{"class":3952},[3946,29810,15105],{"class":4262},[3946,29812,13098],{"class":3952},[3946,29814,29815,29817,29819],{"class":3948,"line":9866},[3946,29816,13167],{"class":3952},[3946,29818,23747],{"class":4342},[3946,29820,4040],{"class":3952},[3946,29822,29823,29825,29827,29829,29831,29833],{"class":3948,"line":9882},[3946,29824,13084],{"class":3952},[3946,29826,12926],{"class":4262},[3946,29828,13089],{"class":4262},[3946,29830,13092],{"class":3952},[3946,29832,23762],{"class":4262},[3946,29834,13098],{"class":3952},[3946,29836,29837,29839,29841,29843,29845,29848,29850,29853,29855,29857,29859],{"class":3948,"line":9892},[3946,29838,13103],{"class":3952},[3946,29840,14762],{"class":4262},[3946,29842,13089],{"class":4262},[3946,29844,13092],{"class":3952},[3946,29846,29847],{"class":4262},"headerTitle",[3946,29849,15124],{"class":3952},[3946,29851,29852],{"class":4262},"Мої",[3946,29854,23784],{"class":4262},[3946,29856,15133],{"class":3952},[3946,29858,14762],{"class":4262},[3946,29860,13135],{"class":3952},[3946,29862,29863,29865],{"class":3948,"line":9908},[3946,29864,13103],{"class":3952},[3946,29866,15436],{"class":4262},[3946,29868,29869,29871,29873,29876],{"class":3948,"line":9918},[3946,29870,21557],{"class":4262},[3946,29872,13092],{"class":3952},[3946,29874,29875],{"class":4262},"addButton",[3946,29877,4040],{"class":3952},[3946,29879,29880,29882,29885,29888],{"class":3948,"line":9934},[3946,29881,28996],{"class":4262},[3946,29883,29884],{"class":3952},"={() => navigation.navigate(",[3946,29886,29887],{"class":3966},"'CreateNote'",[3946,29889,26444],{"class":4262},[3946,29891,29892],{"class":3948,"line":9944},[3946,29893,21593],{"class":4262},[3946,29895,29896,29899,29902,29905,29907],{"class":3948,"line":9960},[3946,29897,29898],{"class":4262},"          \u003CIonicons name=",[3946,29900,29901],{"class":3966},"\"add\"",[3946,29903,29904],{"class":4262}," size={28} color=",[3946,29906,13122],{"class":3966},[3946,29908,13125],{"class":4262},[3946,29910,29911],{"class":3948,"line":9970},[3946,29912,29913],{"class":4262},"        \u003C\u002FTouchableOpacity>\n",[3946,29915,29916],{"class":3948,"line":9986},[3946,29917,29918],{"class":4262},"      \u003C\u002FView>\n",[3946,29920,29921],{"class":3948,"line":9994},[3946,29922,4278],{"emptyLinePlaceholder":4277},[3946,29924,29925,29927,29930],{"class":3948,"line":10014},[3946,29926,13167],{"class":4262},[3946,29928,29929],{"class":4342},"\u002F* List *\u002F",[3946,29931,4040],{"class":4262},[3946,29933,29934],{"class":3948,"line":10019},[3946,29935,29936],{"class":4262},"      \u003CFlatList\n",[3946,29938,29939],{"class":3948,"line":10024},[3946,29940,29941],{"class":4262},"        data={notes}\n",[3946,29943,29944],{"class":3948,"line":10029},[3946,29945,29946],{"class":4262},"        renderItem={renderNoteItem}\n",[3946,29948,29949],{"class":3948,"line":10044},[3946,29950,29951],{"class":4262},"        keyExtractor={(item) => item.id}\n",[3946,29953,29954],{"class":3948,"line":10053},[3946,29955,29956],{"class":4262},"        contentContainerStyle={[\n",[3946,29958,29959],{"class":3948,"line":10058},[3946,29960,29961],{"class":4262},"          styles.listContent,\n",[3946,29963,29964],{"class":3948,"line":10063},[3946,29965,29966],{"class":4262},"          notes.length === 0 && styles.listContentEmpty,\n",[3946,29968,29969],{"class":3948,"line":10079},[3946,29970,29971],{"class":4262},"        ]}\n",[3946,29973,29974],{"class":3948,"line":10084},[3946,29975,29976],{"class":4262},"        ListEmptyComponent={renderEmptyState}\n",[3946,29978,29979],{"class":3948,"line":10089},[3946,29980,29981],{"class":4262},"        refreshControl={\n",[3946,29983,29984],{"class":3948,"line":10094},[3946,29985,29986],{"class":4262},"          \u003CRefreshControl\n",[3946,29988,29989],{"class":3948,"line":10099},[3946,29990,29991],{"class":4262},"            refreshing={isRefreshing}\n",[3946,29993,29994],{"class":3948,"line":11862},[3946,29995,29996],{"class":4262},"            onRefresh={handleRefresh}\n",[3946,29998,29999,30002],{"class":3948,"line":11871},[3946,30000,30001],{"class":4262},"            tintColor=",[3946,30003,30004],{"class":3966},"\"#007AFF\"\n",[3946,30006,30007],{"class":3948,"line":11876},[3946,30008,23978],{"class":4262},[3946,30010,30011],{"class":3948,"line":11881},[3946,30012,8684],{"class":4262},[3946,30014,30015],{"class":3948,"line":11894},[3946,30016,14410],{"class":4262},[3946,30018,30019],{"class":3948,"line":11899},[3946,30020,30021],{"class":4262},"    \u003C\u002FView>\n",[3946,30023,30024],{"class":3948,"line":11904},[3946,30025,10875],{"class":4262},[3946,30027,30028],{"class":3948,"line":11909},[3946,30029,4040],{"class":4262},[3946,30031,30032],{"class":3948,"line":11915},[3946,30033,4278],{"emptyLinePlaceholder":4277},[3946,30035,30036],{"class":3948,"line":11920},[3946,30037,21630],{"class":4262},[3946,30039,30040,30042],{"class":3948,"line":11941},[3946,30041,15568],{"class":4262},[3946,30043,4427],{"class":3952},[3946,30045,30046,30048,30050],{"class":3948,"line":11948},[3946,30047,13232],{"class":4262},[3946,30049,13235],{"class":4020},[3946,30051,3970],{"class":3952},[3946,30053,30054,30056,30058],{"class":3948,"line":11961},[3946,30055,13261],{"class":4262},[3946,30057,22488],{"class":3966},[3946,30059,3970],{"class":3952},[3946,30061,30062],{"class":3948,"line":11966},[3946,30063,13271],{"class":3952},[3946,30065,30066,30069],{"class":3948,"line":11972},[3946,30067,30068],{"class":4262},"  centerContainer:",[3946,30070,4427],{"class":3952},[3946,30072,30073,30075,30077],{"class":3948,"line":11986},[3946,30074,13232],{"class":4262},[3946,30076,13235],{"class":4020},[3946,30078,3970],{"class":3952},[3946,30080,30081,30083,30085],{"class":3948,"line":11999},[3946,30082,13242],{"class":4262},[3946,30084,13245],{"class":3966},[3946,30086,3970],{"class":3952},[3946,30088,30089,30091,30093],{"class":3948,"line":12018},[3946,30090,13252],{"class":4262},[3946,30092,13245],{"class":3966},[3946,30094,3970],{"class":3952},[3946,30096,30097],{"class":3948,"line":12024},[3946,30098,13271],{"class":3952},[3946,30100,30101,30103],{"class":3948,"line":12034},[3946,30102,24431],{"class":4262},[3946,30104,4427],{"class":3952},[3946,30106,30107,30110,30113],{"class":3948,"line":12040},[3946,30108,30109],{"class":4262},"    flexDirection:",[3946,30111,30112],{"class":3966}," 'row'",[3946,30114,3970],{"class":3952},[3946,30116,30117,30119,30122],{"class":3948,"line":12053},[3946,30118,13242],{"class":4262},[3946,30120,30121],{"class":3966}," 'space-between'",[3946,30123,3970],{"class":3952},[3946,30125,30126,30128,30130],{"class":3948,"line":12058},[3946,30127,13252],{"class":4262},[3946,30129,13245],{"class":3966},[3946,30131,3970],{"class":3952},[3946,30133,30134,30136,30138],{"class":3948,"line":12064},[3946,30135,15734],{"class":4262},[3946,30137,15602],{"class":4020},[3946,30139,3970],{"class":3952},[3946,30141,30142,30144,30146],{"class":3948,"line":12071},[3946,30143,15743],{"class":4262},[3946,30145,15681],{"class":4020},[3946,30147,3970],{"class":3952},[3946,30149,30150,30152,30154],{"class":3948,"line":12076},[3946,30151,13261],{"class":4262},[3946,30153,13264],{"class":3966},[3946,30155,3970],{"class":3952},[3946,30157,30158,30161,30163],{"class":3948,"line":12089},[3946,30159,30160],{"class":4262},"    borderBottomWidth:",[3946,30162,13235],{"class":4020},[3946,30164,3970],{"class":3952},[3946,30166,30167,30170,30173],{"class":3948,"line":12094},[3946,30168,30169],{"class":4262},"    borderBottomColor:",[3946,30171,30172],{"class":3966}," '#E5E5E5'",[3946,30174,3970],{"class":3952},[3946,30176,30177],{"class":3948,"line":12099},[3946,30178,13271],{"class":3952},[3946,30180,30181,30184],{"class":3948,"line":12105},[3946,30182,30183],{"class":4262},"  headerTitle:",[3946,30185,4427],{"class":3952},[3946,30187,30188,30190,30193],{"class":3948,"line":12110},[3946,30189,15628],{"class":4262},[3946,30191,30192],{"class":4020}," 28",[3946,30194,3970],{"class":3952},[3946,30196,30197,30199,30201],{"class":3948,"line":12132},[3946,30198,15638],{"class":4262},[3946,30200,15641],{"class":3966},[3946,30202,3970],{"class":3952},[3946,30204,30205,30207,30209],{"class":3948,"line":12139},[3946,30206,15648],{"class":4262},[3946,30208,15651],{"class":3966},[3946,30210,3970],{"class":3952},[3946,30212,30213],{"class":3948,"line":12158},[3946,30214,13271],{"class":3952},[3946,30216,30217,30220],{"class":3948,"line":12163},[3946,30218,30219],{"class":4262},"  addButton:",[3946,30221,4427],{"class":3952},[3946,30223,30224,30227,30229],{"class":3948,"line":12178},[3946,30225,30226],{"class":4262},"    width:",[3946,30228,24440],{"class":4020},[3946,30230,3970],{"class":3952},[3946,30232,30233,30236,30238],{"class":3948,"line":12194},[3946,30234,30235],{"class":4262},"    height:",[3946,30237,24440],{"class":4020},[3946,30239,3970],{"class":3952},[3946,30241,30242,30244,30246],{"class":3948,"line":12199},[3946,30243,15752],{"class":4262},[3946,30245,15602],{"class":4020},[3946,30247,3970],{"class":3952},[3946,30249,30250,30252,30255],{"class":3948,"line":12204},[3946,30251,13261],{"class":4262},[3946,30253,30254],{"class":3966}," '#E3F2FD'",[3946,30256,3970],{"class":3952},[3946,30258,30259,30261,30263],{"class":3948,"line":12231},[3946,30260,13242],{"class":4262},[3946,30262,13245],{"class":3966},[3946,30264,3970],{"class":3952},[3946,30266,30267,30269,30271],{"class":3948,"line":12236},[3946,30268,13252],{"class":4262},[3946,30270,13245],{"class":3966},[3946,30272,3970],{"class":3952},[3946,30274,30275],{"class":3948,"line":12249},[3946,30276,13271],{"class":3952},[3946,30278,30279,30282],{"class":3948,"line":12261},[3946,30280,30281],{"class":4262},"  listContent:",[3946,30283,4427],{"class":3952},[3946,30285,30286,30288,30290],{"class":3948,"line":12272},[3946,30287,15599],{"class":4262},[3946,30289,15681],{"class":4020},[3946,30291,3970],{"class":3952},[3946,30293,30294],{"class":3948,"line":12281},[3946,30295,13271],{"class":3952},[3946,30297,30298,30301],{"class":3948,"line":12286},[3946,30299,30300],{"class":4262},"  listContentEmpty:",[3946,30302,4427],{"class":3952},[3946,30304,30305,30307,30309],{"class":3948,"line":12291},[3946,30306,24402],{"class":4262},[3946,30308,13235],{"class":4020},[3946,30310,3970],{"class":3952},[3946,30312,30313],{"class":3948,"line":12306},[3946,30314,13271],{"class":3952},[3946,30316,30317,30320],{"class":3948,"line":12319},[3946,30318,30319],{"class":4262},"  noteCard:",[3946,30321,4427],{"class":3952},[3946,30323,30324,30326,30328],{"class":3948,"line":12339},[3946,30325,13261],{"class":4262},[3946,30327,13264],{"class":3966},[3946,30329,3970],{"class":3952},[3946,30331,30332,30334,30336],{"class":3948,"line":12352},[3946,30333,15752],{"class":4262},[3946,30335,15661],{"class":4020},[3946,30337,3970],{"class":3952},[3946,30339,30340,30342,30344],{"class":3948,"line":12359},[3946,30341,15599],{"class":4262},[3946,30343,15681],{"class":4020},[3946,30345,3970],{"class":3952},[3946,30347,30348,30350,30352],{"class":3948,"line":12368},[3946,30349,15658],{"class":4262},[3946,30351,15661],{"class":4020},[3946,30353,3970],{"class":3952},[3946,30355,30356,30358,30360],{"class":3948,"line":12373},[3946,30357,30109],{"class":4262},[3946,30359,30112],{"class":3966},[3946,30361,3970],{"class":3952},[3946,30363,30364,30366,30368],{"class":3948,"line":12386},[3946,30365,13252],{"class":4262},[3946,30367,13245],{"class":3966},[3946,30369,3970],{"class":3952},[3946,30371,30372,30375,30378],{"class":3948,"line":12391},[3946,30373,30374],{"class":4262},"    shadowColor:",[3946,30376,30377],{"class":3966}," '#000'",[3946,30379,3970],{"class":3952},[3946,30381,30382,30385,30387,30390,30393,30395,30398,30400],{"class":3948,"line":12396},[3946,30383,30384],{"class":4262},"    shadowOffset:",[3946,30386,6817],{"class":3952},[3946,30388,30389],{"class":4262},"width:",[3946,30391,30392],{"class":4020}," 0",[3946,30394,4447],{"class":3952},[3946,30396,30397],{"class":4262},"height:",[3946,30399,21754],{"class":4020},[3946,30401,19998],{"class":3952},[3946,30403,30404,30407,30410],{"class":3948,"line":12402},[3946,30405,30406],{"class":4262},"    shadowOpacity:",[3946,30408,30409],{"class":4020}," 0.1",[3946,30411,3970],{"class":3952},[3946,30413,30414,30417,30419],{"class":3948,"line":12407},[3946,30415,30416],{"class":4262},"    shadowRadius:",[3946,30418,22658],{"class":4020},[3946,30420,3970],{"class":3952},[3946,30422,30423,30426,30429],{"class":3948,"line":12418},[3946,30424,30425],{"class":4262},"    elevation:",[3946,30427,30428],{"class":4020}," 3",[3946,30430,3970],{"class":3952},[3946,30432,30433],{"class":3948,"line":12426},[3946,30434,13271],{"class":3952},[3946,30436,30437,30440],{"class":3948,"line":12436},[3946,30438,30439],{"class":4262},"  noteContent:",[3946,30441,4427],{"class":3952},[3946,30443,30444,30446,30448],{"class":3948,"line":12441},[3946,30445,13232],{"class":4262},[3946,30447,13235],{"class":4020},[3946,30449,3970],{"class":3952},[3946,30451,30452],{"class":3948,"line":12446},[3946,30453,13271],{"class":3952},[3946,30455,30456,30459],{"class":3948,"line":12452},[3946,30457,30458],{"class":4262},"  noteTitle:",[3946,30460,4427],{"class":3952},[3946,30462,30463,30465,30468],{"class":3948,"line":12457},[3946,30464,15628],{"class":4262},[3946,30466,30467],{"class":4020}," 18",[3946,30469,3970],{"class":3952},[3946,30471,30472,30474,30476],{"class":3948,"line":12476},[3946,30473,15638],{"class":4262},[3946,30475,15791],{"class":3966},[3946,30477,3970],{"class":3952},[3946,30479,30480,30482,30484],{"class":3948,"line":12487},[3946,30481,15648],{"class":4262},[3946,30483,15651],{"class":3966},[3946,30485,3970],{"class":3952},[3946,30487,30488,30490,30492],{"class":3948,"line":12497},[3946,30489,15658],{"class":4262},[3946,30491,22658],{"class":4020},[3946,30493,3970],{"class":3952},[3946,30495,30496],{"class":3948,"line":12505},[3946,30497,13271],{"class":3952},[3946,30499,30500,30503],{"class":3948,"line":12513},[3946,30501,30502],{"class":4262},"  notePreview:",[3946,30504,4427],{"class":3952},[3946,30506,30507,30509,30511],{"class":3948,"line":12521},[3946,30508,15628],{"class":4262},[3946,30510,21643],{"class":4020},[3946,30512,3970],{"class":3952},[3946,30514,30515,30517,30519],{"class":3948,"line":12529},[3946,30516,15648],{"class":4262},[3946,30518,15690],{"class":3966},[3946,30520,3970],{"class":3952},[3946,30522,30523,30525,30527],{"class":3948,"line":12537},[3946,30524,15658],{"class":4262},[3946,30526,15755],{"class":4020},[3946,30528,3970],{"class":3952},[3946,30530,30531],{"class":3948,"line":12543},[3946,30532,13271],{"class":3952},[3946,30534,30535,30538],{"class":3948,"line":12574},[3946,30536,30537],{"class":4262},"  noteDate:",[3946,30539,4427],{"class":3952},[3946,30541,30542,30544,30546],{"class":3948,"line":12579},[3946,30543,15628],{"class":4262},[3946,30545,15661],{"class":4020},[3946,30547,3970],{"class":3952},[3946,30549,30550,30552,30555],{"class":3948,"line":12584},[3946,30551,15648],{"class":4262},[3946,30553,30554],{"class":3966}," '#999999'",[3946,30556,3970],{"class":3952},[3946,30558,30559],{"class":3948,"line":12624},[3946,30560,13271],{"class":3952},[3946,30562,30563,30566],{"class":3948,"line":12629},[3946,30564,30565],{"class":4262},"  deleteButton:",[3946,30567,4427],{"class":3952},[3946,30569,30570,30572,30574],{"class":3948,"line":12634},[3946,30571,15599],{"class":4262},[3946,30573,15755],{"class":4020},[3946,30575,3970],{"class":3952},[3946,30577,30578,30581,30583],{"class":3948,"line":12639},[3946,30579,30580],{"class":4262},"    marginLeft:",[3946,30582,15661],{"class":4020},[3946,30584,3970],{"class":3952},[3946,30586,30587],{"class":3948,"line":12645},[3946,30588,13271],{"class":3952},[3946,30590,30591,30594],{"class":3948,"line":12650},[3946,30592,30593],{"class":4262},"  emptyState:",[3946,30595,4427],{"class":3952},[3946,30597,30598,30600,30602],{"class":3948,"line":12666},[3946,30599,13232],{"class":4262},[3946,30601,13235],{"class":4020},[3946,30603,3970],{"class":3952},[3946,30605,30606,30608,30610],{"class":3948,"line":12685},[3946,30607,13242],{"class":4262},[3946,30609,13245],{"class":3966},[3946,30611,3970],{"class":3952},[3946,30613,30614,30616,30618],{"class":3948,"line":12690},[3946,30615,13252],{"class":4262},[3946,30617,13245],{"class":3966},[3946,30619,3970],{"class":3952},[3946,30621,30622,30624,30626],{"class":3948,"line":12702},[3946,30623,15734],{"class":4262},[3946,30625,24440],{"class":4020},[3946,30627,3970],{"class":3952},[3946,30629,30630],{"class":3948,"line":12718},[3946,30631,13271],{"class":3952},[3946,30633,30634,30637],{"class":3948,"line":12723},[3946,30635,30636],{"class":4262},"  emptyTitle:",[3946,30638,4427],{"class":3952},[3946,30640,30641,30643,30645],{"class":3948,"line":12728},[3946,30642,15628],{"class":4262},[3946,30644,15602],{"class":4020},[3946,30646,3970],{"class":3952},[3946,30648,30649,30651,30653],{"class":3948,"line":12737},[3946,30650,15638],{"class":4262},[3946,30652,15791],{"class":3966},[3946,30654,3970],{"class":3952},[3946,30656,30658,30660,30662],{"class":3948,"line":30657},282,[3946,30659,15648],{"class":4262},[3946,30661,15690],{"class":3966},[3946,30663,3970],{"class":3952},[3946,30665,30667,30669,30671],{"class":3948,"line":30666},283,[3946,30668,22655],{"class":4262},[3946,30670,15681],{"class":4020},[3946,30672,3970],{"class":3952},[3946,30674,30676,30678,30680],{"class":3948,"line":30675},284,[3946,30677,15658],{"class":4262},[3946,30679,15755],{"class":4020},[3946,30681,3970],{"class":3952},[3946,30683,30685],{"class":3948,"line":30684},285,[3946,30686,13271],{"class":3952},[3946,30688,30690,30693],{"class":3948,"line":30689},286,[3946,30691,30692],{"class":4262},"  emptySubtitle:",[3946,30694,4427],{"class":3952},[3946,30696,30698,30700,30702],{"class":3948,"line":30697},287,[3946,30699,15628],{"class":4262},[3946,30701,21643],{"class":4020},[3946,30703,3970],{"class":3952},[3946,30705,30707,30709,30711],{"class":3948,"line":30706},288,[3946,30708,15648],{"class":4262},[3946,30710,30554],{"class":3966},[3946,30712,3970],{"class":3952},[3946,30714,30716,30718,30720],{"class":3948,"line":30715},289,[3946,30717,15697],{"class":4262},[3946,30719,13245],{"class":3966},[3946,30721,3970],{"class":3952},[3946,30723,30725],{"class":3948,"line":30724},290,[3946,30726,13271],{"class":3952},[3946,30728,30730],{"class":3948,"line":30729},291,[3946,30731,13276],{"class":3952},[3750,30733,30735],{"id":30734},"_79-note-detail-screen","7.9. Note Detail Screen",[3857,30737,30739],{"className":4242,"code":30738,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FNoteDetailScreen.tsx\n\nimport React, { useState, useEffect } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  ScrollView,\n  TouchableOpacity,\n  Alert,\n  ActivityIndicator,\n} from 'react-native';\nimport { NativeStackNavigationProp } from '@react-navigation\u002Fnative-stack';\nimport { RouteProp } from '@react-navigation\u002Fnative';\nimport { Ionicons } from '@expo\u002Fvector-icons';\nimport { AppStackParamList } from '..\u002F..\u002F..\u002Fnavigation\u002FAppNavigator';\nimport { notesApi } from '..\u002Fapi\u002FnotesApi';\nimport type { Note } from '..\u002Ftypes\u002Fnote.types';\n\ntype NoteDetailScreenNavigationProp = NativeStackNavigationProp\u003C\n  AppStackParamList,\n  'NoteDetail'\n>;\n\ntype NoteDetailScreenRouteProp = RouteProp\u003CAppStackParamList, 'NoteDetail'>;\n\ninterface Props {\n  navigation: NoteDetailScreenNavigationProp;\n  route: NoteDetailScreenRouteProp;\n}\n\nexport function NoteDetailScreen({ navigation, route }: Props) {\n  const { noteId } = route.params;\n  \n  const [note, setNote] = useState\u003CNote | null>(null);\n  const [isLoading, setIsLoading] = useState(true);\n\n  \u002F**\n   * Завантаження нотатки\n   *\u002F\n  useEffect(() => {\n    loadNote();\n  }, [noteId]);\n\n  const loadNote = async () => {\n    try {\n      setIsLoading(true);\n      const data = await notesApi.getNoteById(noteId);\n      setNote(data);\n    } catch (error) {\n      console.error('Помилка завантаження нотатки:', error);\n      Alert.alert(\n        'Помилка',\n        'Не вдалося завантажити нотатку',\n        [\n          {\n            text: 'OK',\n            onPress: () => navigation.goBack(),\n          },\n        ]\n      );\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  \u002F**\n   * Видалення нотатки\n   *\u002F\n  const handleDelete = () => {\n    if (!note) return;\n\n    Alert.alert(\n      'Видалити нотатку?',\n      `Ви впевнені, що хочете видалити \"${note.title}\"?`,\n      [\n        { text: 'Скасувати', style: 'cancel' },\n        {\n          text: 'Видалити',\n          style: 'destructive',\n          onPress: async () => {\n            try {\n              await notesApi.deleteNote(note.id);\n              Alert.alert('Успіх', 'Нотатку видалено', [\n                {\n                  text: 'OK',\n                  onPress: () => navigation.goBack(),\n                },\n              ]);\n            } catch (error) {\n              Alert.alert('Помилка', 'Не вдалося видалити нотатку');\n            }\n          },\n        },\n      ]\n    );\n  };\n\n  if (isLoading) {\n    return (\n      \u003CView style={styles.centerContainer}>\n        \u003CActivityIndicator size=\"large\" color=\"#007AFF\" \u002F>\n      \u003C\u002FView>\n    );\n  }\n\n  if (!note) {\n    return (\n      \u003CView style={styles.centerContainer}>\n        \u003CText>Нотатку не знайдено\u003C\u002FText>\n      \u003C\u002FView>\n    );\n  }\n\n  return (\n    \u003CView style={styles.container}>\n      {\u002F* Header *\u002F}\n      \u003CView style={styles.header}>\n        \u003CTouchableOpacity\n          style={styles.headerButton}\n          onPress={() => navigation.goBack()}\n        >\n          \u003CIonicons name=\"arrow-back\" size={24} color=\"#007AFF\" \u002F>\n        \u003C\u002FTouchableOpacity>\n        \n        \u003CText style={styles.headerTitle}>Нотатка\u003C\u002FText>\n        \n        \u003CTouchableOpacity style={styles.headerButton} onPress={handleDelete}>\n          \u003CIonicons name=\"trash-outline\" size={24} color=\"#FF3B30\" \u002F>\n        \u003C\u002FTouchableOpacity>\n      \u003C\u002FView>\n\n      {\u002F* Content *\u002F}\n      \u003CScrollView style={styles.content} contentContainerStyle={styles.contentContainer}>\n        \u003CText style={styles.title}>{note.title}\u003C\u002FText>\n        \n        \u003CView style={styles.metadata}>\n          \u003CText style={styles.metadataText}>\n            Створено: {new Date(note.createdAt).toLocaleString('uk-UA')}\n          \u003C\u002FText>\n          \u003CText style={styles.metadataText}>\n            Оновлено: {new Date(note.updatedAt).toLocaleString('uk-UA')}\n          \u003C\u002FText>\n        \u003C\u002FView>\n\n        \u003CText style={styles.noteContent}>{note.content}\u003C\u002FText>\n      \u003C\u002FScrollView>\n    \u003C\u002FView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  centerContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  header: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E5E5',\n  },\n  headerButton: {\n    width: 40,\n    height: 40,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  headerTitle: {\n    fontSize: 18,\n    fontWeight: '600',\n    color: '#000000',\n  },\n  content: {\n    flex: 1,\n  },\n  contentContainer: {\n    padding: 20,\n  },\n  title: {\n    fontSize: 28,\n    fontWeight: 'bold',\n    color: '#000000',\n    marginBottom: 16,\n  },\n  metadata: {\n    marginBottom: 24,\n    paddingBottom: 16,\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E5E5',\n  },\n  metadataText: {\n    fontSize: 12,\n    color: '#999999',\n    marginBottom: 4,\n  },\n  noteContent: {\n    fontSize: 16,\n    lineHeight: 24,\n    color: '#333333',\n  },\n});\n",[3782,30740,30741,30746,30750,30772,30778,30784,30790,30796,30802,30808,30814,30820,30830,30846,30863,30879,30895,30911,30929,30933,30946,30952,30957,30961,30965,30986,30990,30998,31009,31021,31025,31029,31052,31071,31075,31106,31128,31132,31136,31141,31145,31155,31162,31170,31174,31191,31197,31207,31230,31241,31253,31272,31282,31288,31295,31300,31305,31314,31332,31336,31341,31345,31353,31363,31367,31371,31375,31379,31383,31387,31400,31414,31418,31428,31434,31452,31456,31472,31476,31484,31492,31506,31512,31532,31551,31556,31565,31584,31589,31594,31606,31624,31628,31632,31636,31640,31644,31648,31652,31662,31668,31682,31702,31710,31714,31718,31722,31732,31738,31752,31774,31782,31786,31790,31794,31800,31814,31822,31836,31842,31853,31859,31863,31893,31901,31905,31928,31932,31955,31983,31991,31999,32003,32012,32036,32059,32063,32078,32093,32118,32126,32140,32162,32170,32178,32182,32204,32212,32220,32224,32228,32232,32248,32254,32262,32270,32274,32280,32288,32296,32304,32308,32314,32322,32330,32338,32346,32354,32362,32370,32374,32381,32389,32397,32405,32413,32417,32423,32431,32439,32447,32451,32458,32466,32470,32477,32485,32489,32495,32503,32511,32519,32527,32531,32538,32546,32555,32563,32571,32575,32582,32590,32598,32606,32610,32616,32624,32633,32642,32646],{"__ignoreMap":3865},[3946,30742,30743],{"class":3948,"line":3949},[3946,30744,30745],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FNoteDetailScreen.tsx\n",[3946,30747,30748],{"class":3948,"line":3956},[3946,30749,4278],{"emptyLinePlaceholder":4277},[3946,30751,30752,30754,30756,30758,30760,30762,30764,30766,30768,30770],{"class":3948,"line":3973},[3946,30753,4252],{"class":4251},[3946,30755,10244],{"class":4262},[3946,30757,8290],{"class":3952},[3946,30759,10543],{"class":4262},[3946,30761,4447],{"class":3952},[3946,30763,15953],{"class":4262},[3946,30765,6823],{"class":3952},[3946,30767,6826],{"class":4251},[3946,30769,10304],{"class":3966},[3946,30771,4272],{"class":3952},[3946,30773,30774,30776],{"class":3948,"line":3986},[3946,30775,4252],{"class":4251},[3946,30777,4427],{"class":3952},[3946,30779,30780,30782],{"class":3948,"line":3999},[3946,30781,21895],{"class":4262},[3946,30783,3970],{"class":3952},[3946,30785,30786,30788],{"class":3948,"line":4012},[3946,30787,21283],{"class":4262},[3946,30789,3970],{"class":3952},[3946,30791,30792,30794],{"class":3948,"line":4026},[3946,30793,21290],{"class":4262},[3946,30795,3970],{"class":3952},[3946,30797,30798,30800],{"class":3948,"line":4037},[3946,30799,22747],{"class":4262},[3946,30801,3970],{"class":3952},[3946,30803,30804,30806],{"class":3948,"line":4487},[3946,30805,21276],{"class":4262},[3946,30807,3970],{"class":3952},[3946,30809,30810,30812],{"class":3948,"line":4507},[3946,30811,22754],{"class":4262},[3946,30813,3970],{"class":3952},[3946,30815,30816,30818],{"class":3948,"line":4518},[3946,30817,21297],{"class":4262},[3946,30819,3970],{"class":3952},[3946,30821,30822,30824,30826,30828],{"class":3948,"line":4524},[3946,30823,5928],{"class":3952},[3946,30825,6826],{"class":4251},[3946,30827,12943],{"class":3966},[3946,30829,4272],{"class":3952},[3946,30831,30832,30834,30836,30838,30840,30842,30844],{"class":3948,"line":4529},[3946,30833,4252],{"class":4251},[3946,30835,6817],{"class":3952},[3946,30837,22775],{"class":4262},[3946,30839,6823],{"class":3952},[3946,30841,6826],{"class":4251},[3946,30843,13355],{"class":3966},[3946,30845,4272],{"class":3952},[3946,30847,30848,30850,30852,30855,30857,30859,30861],{"class":3948,"line":4534},[3946,30849,4252],{"class":4251},[3946,30851,6817],{"class":3952},[3946,30853,30854],{"class":4262},"RouteProp",[3946,30856,6823],{"class":3952},[3946,30858,6826],{"class":4251},[3946,30860,12915],{"class":3966},[3946,30862,4272],{"class":3952},[3946,30864,30865,30867,30869,30871,30873,30875,30877],{"class":3948,"line":4540},[3946,30866,4252],{"class":4251},[3946,30868,6817],{"class":3952},[3946,30870,13775],{"class":4262},[3946,30872,6823],{"class":3952},[3946,30874,6826],{"class":4251},[3946,30876,13782],{"class":3966},[3946,30878,4272],{"class":3952},[3946,30880,30881,30883,30885,30887,30889,30891,30893],{"class":3948,"line":4567},[3946,30882,4252],{"class":4251},[3946,30884,6817],{"class":3952},[3946,30886,13987],{"class":4262},[3946,30888,6823],{"class":3952},[3946,30890,6826],{"class":4251},[3946,30892,28284],{"class":3966},[3946,30894,4272],{"class":3952},[3946,30896,30897,30899,30901,30903,30905,30907,30909],{"class":3948,"line":4574},[3946,30898,4252],{"class":4251},[3946,30900,6817],{"class":3952},[3946,30902,28295],{"class":4262},[3946,30904,6823],{"class":3952},[3946,30906,6826],{"class":4251},[3946,30908,28302],{"class":3966},[3946,30910,4272],{"class":3952},[3946,30912,30913,30915,30917,30919,30921,30923,30925,30927],{"class":3948,"line":4600},[3946,30914,4252],{"class":4251},[3946,30916,6814],{"class":4251},[3946,30918,6817],{"class":3952},[3946,30920,27175],{"class":4262},[3946,30922,6823],{"class":3952},[3946,30924,6826],{"class":4251},[3946,30926,27192],{"class":3966},[3946,30928,4272],{"class":3952},[3946,30930,30931],{"class":3948,"line":4610},[3946,30932,4278],{"emptyLinePlaceholder":4277},[3946,30934,30935,30937,30940,30942,30944],{"class":3948,"line":4623},[3946,30936,22861],{"class":4255},[3946,30938,30939],{"class":4403}," NoteDetailScreenNavigationProp",[3946,30941,4290],{"class":3952},[3946,30943,22775],{"class":4403},[3946,30945,22871],{"class":3952},[3946,30947,30948,30950],{"class":3948,"line":4643},[3946,30949,28344],{"class":4403},[3946,30951,3970],{"class":3952},[3946,30953,30954],{"class":3948,"line":4653},[3946,30955,30956],{"class":3966},"  'NoteDetail'\n",[3946,30958,30959],{"class":3948,"line":4658},[3946,30960,6463],{"class":3952},[3946,30962,30963],{"class":3948,"line":4663},[3946,30964,4278],{"emptyLinePlaceholder":4277},[3946,30966,30967,30969,30972,30974,30976,30978,30980,30982,30984],{"class":3948,"line":4668},[3946,30968,22861],{"class":4255},[3946,30970,30971],{"class":4403}," NoteDetailScreenRouteProp",[3946,30973,4290],{"class":3952},[3946,30975,30854],{"class":4403},[3946,30977,4413],{"class":3952},[3946,30979,13987],{"class":4403},[3946,30981,4447],{"class":3952},[3946,30983,28857],{"class":3966},[3946,30985,6463],{"class":3952},[3946,30987,30988],{"class":3948,"line":4674},[3946,30989,4278],{"emptyLinePlaceholder":4277},[3946,30991,30992,30994,30996],{"class":3948,"line":4694},[3946,30993,4801],{"class":4255},[3946,30995,17922],{"class":4403},[3946,30997,4427],{"class":3952},[3946,30999,31000,31002,31004,31007],{"class":3948,"line":4701},[3946,31001,22904],{"class":4262},[3946,31003,3963],{"class":3952},[3946,31005,31006],{"class":4403},"NoteDetailScreenNavigationProp",[3946,31008,4272],{"class":3952},[3946,31010,31011,31014,31016,31019],{"class":3948,"line":4719},[3946,31012,31013],{"class":4262},"  route",[3946,31015,3963],{"class":3952},[3946,31017,31018],{"class":4403},"NoteDetailScreenRouteProp",[3946,31020,4272],{"class":3952},[3946,31022,31023],{"class":3948,"line":4735},[3946,31024,4040],{"class":3952},[3946,31026,31027],{"class":3948,"line":4748},[3946,31028,4278],{"emptyLinePlaceholder":4277},[3946,31030,31031,31033,31035,31038,31040,31042,31044,31046,31048,31050],{"class":3948,"line":4768},[3946,31032,6030],{"class":4251},[3946,31034,4390],{"class":4255},[3946,31036,31037],{"class":4224}," NoteDetailScreen",[3946,31039,10506],{"class":3952},[3946,31041,16226],{"class":4262},[3946,31043,4447],{"class":3952},[3946,31045,14061],{"class":4262},[3946,31047,10512],{"class":3952},[3946,31049,18038],{"class":4403},[3946,31051,4318],{"class":3952},[3946,31053,31054,31056,31058,31060,31062,31064,31066,31069],{"class":3948,"line":4777},[3946,31055,5018],{"class":4255},[3946,31057,6817],{"class":3952},[3946,31059,13905],{"class":4286},[3946,31061,13049],{"class":3952},[3946,31063,14061],{"class":4262},[3946,31065,4298],{"class":3952},[3946,31067,31068],{"class":4262},"params",[3946,31070,4272],{"class":3952},[3946,31072,31073],{"class":3948,"line":4782},[3946,31074,5795],{"class":3952},[3946,31076,31077,31079,31081,31083,31085,31088,31090,31092,31094,31096,31098,31100,31102,31104],{"class":3948,"line":6262},[3946,31078,5018],{"class":4255},[3946,31080,10529],{"class":3952},[3946,31082,20928],{"class":4286},[3946,31084,4447],{"class":3952},[3946,31086,31087],{"class":4286},"setNote",[3946,31089,10540],{"class":3952},[3946,31091,10543],{"class":4224},[3946,31093,4413],{"class":3952},[3946,31095,27175],{"class":4403},[3946,31097,4559],{"class":3952},[3946,31099,4562],{"class":4403},[3946,31101,9498],{"class":3952},[3946,31103,4562],{"class":4255},[3946,31105,4337],{"class":3952},[3946,31107,31108,31110,31112,31114,31116,31118,31120,31122,31124,31126],{"class":3948,"line":6273},[3946,31109,5018],{"class":4255},[3946,31111,10529],{"class":3952},[3946,31113,13046],{"class":4286},[3946,31115,4447],{"class":3952},[3946,31117,28441],{"class":4286},[3946,31119,10540],{"class":3952},[3946,31121,10543],{"class":4224},[3946,31123,4331],{"class":3952},[3946,31125,17493],{"class":4255},[3946,31127,4337],{"class":3952},[3946,31129,31130],{"class":3948,"line":6284},[3946,31131,4278],{"emptyLinePlaceholder":4277},[3946,31133,31134],{"class":3948,"line":6299},[3946,31135,6908],{"class":4342},[3946,31137,31138],{"class":3948,"line":6304},[3946,31139,31140],{"class":4342},"   * Завантаження нотатки\n",[3946,31142,31143],{"class":3948,"line":6309},[3946,31144,6918],{"class":4342},[3946,31146,31147,31149,31151,31153],{"class":3948,"line":6314},[3946,31148,10265],{"class":4224},[3946,31150,10707],{"class":3952},[3946,31152,6453],{"class":4255},[3946,31154,4427],{"class":3952},[3946,31156,31157,31160],{"class":3948,"line":6320},[3946,31158,31159],{"class":4224},"    loadNote",[3946,31161,4304],{"class":3952},[3946,31163,31164,31166,31168],{"class":3948,"line":6325},[3946,31165,10731],{"class":3952},[3946,31167,13905],{"class":4262},[3946,31169,10737],{"class":3952},[3946,31171,31172],{"class":3948,"line":6337},[3946,31173,4278],{"emptyLinePlaceholder":4277},[3946,31175,31176,31178,31181,31183,31185,31187,31189],{"class":3948,"line":6352},[3946,31177,5018],{"class":4255},[3946,31179,31180],{"class":4224}," loadNote",[3946,31182,4290],{"class":3952},[3946,31184,4387],{"class":4255},[3946,31186,11004],{"class":3952},[3946,31188,6453],{"class":4255},[3946,31190,4427],{"class":3952},[3946,31192,31193,31195],{"class":3948,"line":6364},[3946,31194,6977],{"class":4251},[3946,31196,4427],{"class":3952},[3946,31198,31199,31201,31203,31205],{"class":3948,"line":6376},[3946,31200,28685],{"class":4224},[3946,31202,4331],{"class":3952},[3946,31204,17493],{"class":4255},[3946,31206,4337],{"class":3952},[3946,31208,31209,31211,31213,31215,31217,31219,31221,31224,31226,31228],{"class":3948,"line":6392},[3946,31210,6984],{"class":4255},[3946,31212,28579],{"class":4286},[3946,31214,4290],{"class":3952},[3946,31216,4293],{"class":4251},[3946,31218,27937],{"class":4262},[3946,31220,4298],{"class":3952},[3946,31222,31223],{"class":4224},"getNoteById",[3946,31225,4331],{"class":3952},[3946,31227,13905],{"class":4262},[3946,31229,4337],{"class":3952},[3946,31231,31232,31235,31237,31239],{"class":3948,"line":6397},[3946,31233,31234],{"class":4224},"      setNote",[3946,31236,4331],{"class":3952},[3946,31238,5178],{"class":4262},[3946,31240,4337],{"class":3952},[3946,31242,31243,31245,31247,31249,31251],{"class":3948,"line":6402},[3946,31244,7115],{"class":3952},[3946,31246,4476],{"class":4251},[3946,31248,4479],{"class":3952},[3946,31250,4482],{"class":4262},[3946,31252,4318],{"class":3952},[3946,31254,31255,31257,31259,31261,31263,31266,31268,31270],{"class":3948,"line":6407},[3946,31256,5525],{"class":4262},[3946,31258,4298],{"class":3952},[3946,31260,4482],{"class":4224},[3946,31262,4331],{"class":3952},[3946,31264,31265],{"class":3966},"'Помилка завантаження нотатки:'",[3946,31267,4447],{"class":3952},[3946,31269,4482],{"class":4262},[3946,31271,4337],{"class":3952},[3946,31273,31274,31276,31278,31280],{"class":3948,"line":6413},[3946,31275,23537],{"class":4262},[3946,31277,4298],{"class":3952},[3946,31279,23542],{"class":4224},[3946,31281,6594],{"class":3952},[3946,31283,31284,31286],{"class":3948,"line":6418},[3946,31285,28649],{"class":3966},[3946,31287,3970],{"class":3952},[3946,31289,31290,31293],{"class":3948,"line":6434},[3946,31291,31292],{"class":3966},"        'Не вдалося завантажити нотатку'",[3946,31294,3970],{"class":3952},[3946,31296,31297],{"class":3948,"line":6466},[3946,31298,31299],{"class":3952},"        [\n",[3946,31301,31302],{"class":3948,"line":6493},[3946,31303,31304],{"class":3952},"          {\n",[3946,31306,31307,31310,31312],{"class":3948,"line":6512},[3946,31308,31309],{"class":4262},"            text:",[3946,31311,23574],{"class":3966},[3946,31313,3970],{"class":3952},[3946,31315,31316,31318,31320,31322,31324,31326,31328,31330],{"class":3948,"line":6530},[3946,31317,15452],{"class":4224},[3946,31319,8545],{"class":4262},[3946,31321,11004],{"class":3952},[3946,31323,6453],{"class":4255},[3946,31325,15004],{"class":4262},[3946,31327,4298],{"class":3952},[3946,31329,16197],{"class":4224},[3946,31331,19488],{"class":3952},[3946,31333,31334],{"class":3948,"line":6545},[3946,31335,29147],{"class":3952},[3946,31337,31338],{"class":3948,"line":6550},[3946,31339,31340],{"class":3952},"        ]\n",[3946,31342,31343],{"class":3948,"line":6555},[3946,31344,8984],{"class":3952},[3946,31346,31347,31349,31351],{"class":3948,"line":6560},[3946,31348,7115],{"class":3952},[3946,31350,12029],{"class":4251},[3946,31352,4427],{"class":3952},[3946,31354,31355,31357,31359,31361],{"class":3948,"line":6566},[3946,31356,28685],{"class":4224},[3946,31358,4331],{"class":3952},[3946,31360,13575],{"class":4255},[3946,31362,4337],{"class":3952},[3946,31364,31365],{"class":3948,"line":6571},[3946,31366,5550],{"class":3952},[3946,31368,31369],{"class":3948,"line":6588},[3946,31370,15539],{"class":3952},[3946,31372,31373],{"class":3948,"line":6597},[3946,31374,4278],{"emptyLinePlaceholder":4277},[3946,31376,31377],{"class":3948,"line":6609},[3946,31378,6908],{"class":4342},[3946,31380,31381],{"class":3948,"line":6640},[3946,31382,27858],{"class":4342},[3946,31384,31385],{"class":3948,"line":6653},[3946,31386,6918],{"class":4342},[3946,31388,31389,31391,31394,31396,31398],{"class":3948,"line":6659},[3946,31390,5018],{"class":4255},[3946,31392,31393],{"class":4224}," handleDelete",[3946,31395,18252],{"class":3952},[3946,31397,6453],{"class":4255},[3946,31399,4427],{"class":3952},[3946,31401,31402,31404,31406,31408,31410,31412],{"class":3948,"line":6671},[3946,31403,5503],{"class":4251},[3946,31405,4312],{"class":3952},[3946,31407,20928],{"class":4262},[3946,31409,5783],{"class":3952},[3946,31411,5786],{"class":4251},[3946,31413,4272],{"class":3952},[3946,31415,31416],{"class":3948,"line":6689},[3946,31417,4278],{"emptyLinePlaceholder":4277},[3946,31419,31420,31422,31424,31426],{"class":3948,"line":6694},[3946,31421,28909],{"class":4262},[3946,31423,4298],{"class":3952},[3946,31425,23542],{"class":4224},[3946,31427,6594],{"class":3952},[3946,31429,31430,31432],{"class":3948,"line":6699},[3946,31431,28920],{"class":3966},[3946,31433,3970],{"class":3952},[3946,31435,31436,31438,31440,31442,31444,31446,31448,31450],{"class":3948,"line":6704},[3946,31437,28927],{"class":3966},[3946,31439,8669],{"class":4255},[3946,31441,20928],{"class":4262},[3946,31443,4298],{"class":16179},[3946,31445,15121],{"class":4262},[3946,31447,8674],{"class":4255},[3946,31449,28940],{"class":3966},[3946,31451,3970],{"class":3952},[3946,31453,31454],{"class":3948,"line":6709},[3946,31455,28947],{"class":3952},[3946,31457,31458,31460,31462,31464,31466,31468,31470],{"class":3948,"line":6715},[3946,31459,9369],{"class":3952},[3946,31461,23571],{"class":4262},[3946,31463,28956],{"class":3966},[3946,31465,4447],{"class":3952},[3946,31467,28961],{"class":4262},[3946,31469,28964],{"class":3966},[3946,31471,19998],{"class":3952},[3946,31473,31474],{"class":3948,"line":6720},[3946,31475,28971],{"class":3952},[3946,31477,31478,31480,31482],{"class":3948,"line":6732},[3946,31479,28976],{"class":4262},[3946,31481,28979],{"class":3966},[3946,31483,3970],{"class":3952},[3946,31485,31486,31488,31490],{"class":3948,"line":6743},[3946,31487,28986],{"class":4262},[3946,31489,28989],{"class":3966},[3946,31491,3970],{"class":3952},[3946,31493,31494,31496,31498,31500,31502,31504],{"class":3948,"line":6754},[3946,31495,28996],{"class":4224},[3946,31497,8545],{"class":4262},[3946,31499,29001],{"class":4255},[3946,31501,11004],{"class":3952},[3946,31503,6453],{"class":4255},[3946,31505,4427],{"class":3952},[3946,31507,31508,31510],{"class":3948,"line":6768},[3946,31509,29012],{"class":4251},[3946,31511,4427],{"class":3952},[3946,31513,31514,31516,31518,31520,31522,31524,31526,31528,31530],{"class":3948,"line":7572},[3946,31515,29019],{"class":4251},[3946,31517,27937],{"class":4262},[3946,31519,4298],{"class":3952},[3946,31521,29026],{"class":4224},[3946,31523,4331],{"class":3952},[3946,31525,20928],{"class":4262},[3946,31527,4298],{"class":3952},[3946,31529,19984],{"class":4262},[3946,31531,4337],{"class":3952},[3946,31533,31534,31536,31538,31540,31542,31544,31546,31548],{"class":3948,"line":7590},[3946,31535,29088],{"class":4262},[3946,31537,4298],{"class":3952},[3946,31539,23542],{"class":4224},[3946,31541,4331],{"class":3952},[3946,31543,29097],{"class":3966},[3946,31545,4447],{"class":3952},[3946,31547,29102],{"class":3966},[3946,31549,31550],{"class":3952},", [\n",[3946,31552,31553],{"class":3948,"line":7609},[3946,31554,31555],{"class":3952},"                {\n",[3946,31557,31558,31561,31563],{"class":3948,"line":7615},[3946,31559,31560],{"class":4262},"                  text:",[3946,31562,23574],{"class":3966},[3946,31564,3970],{"class":3952},[3946,31566,31567,31570,31572,31574,31576,31578,31580,31582],{"class":3948,"line":7633},[3946,31568,31569],{"class":4224},"                  onPress",[3946,31571,8545],{"class":4262},[3946,31573,11004],{"class":3952},[3946,31575,6453],{"class":4255},[3946,31577,15004],{"class":4262},[3946,31579,4298],{"class":3952},[3946,31581,16197],{"class":4224},[3946,31583,19488],{"class":3952},[3946,31585,31586],{"class":3948,"line":7638},[3946,31587,31588],{"class":3952},"                },\n",[3946,31590,31591],{"class":3948,"line":7644},[3946,31592,31593],{"class":3952},"              ]);\n",[3946,31595,31596,31598,31600,31602,31604],{"class":3948,"line":7677},[3946,31597,29109],{"class":3952},[3946,31599,4476],{"class":4251},[3946,31601,4479],{"class":3952},[3946,31603,4482],{"class":4262},[3946,31605,4318],{"class":3952},[3946,31607,31608,31610,31612,31614,31616,31618,31620,31622],{"class":3948,"line":7682},[3946,31609,29088],{"class":4262},[3946,31611,4298],{"class":3952},[3946,31613,23542],{"class":4224},[3946,31615,4331],{"class":3952},[3946,31617,29130],{"class":3966},[3946,31619,4447],{"class":3952},[3946,31621,29135],{"class":3966},[3946,31623,4337],{"class":3952},[3946,31625,31626],{"class":3948,"line":7694},[3946,31627,29142],{"class":3952},[3946,31629,31630],{"class":3948,"line":7710},[3946,31631,29147],{"class":3952},[3946,31633,31634],{"class":3948,"line":7715},[3946,31635,14311],{"class":3952},[3946,31637,31638],{"class":3948,"line":7720},[3946,31639,29156],{"class":3952},[3946,31641,31642],{"class":3948,"line":7729},[3946,31643,8731],{"class":3952},[3946,31645,31646],{"class":3948,"line":7734},[3946,31647,15539],{"class":3952},[3946,31649,31650],{"class":3948,"line":7739},[3946,31651,4278],{"emptyLinePlaceholder":4277},[3946,31653,31654,31656,31658,31660],{"class":3948,"line":7744},[3946,31655,5776],{"class":4251},[3946,31657,4479],{"class":3952},[3946,31659,13046],{"class":4262},[3946,31661,4318],{"class":3952},[3946,31663,31664,31666],{"class":3948,"line":7750},[3946,31665,4603],{"class":4251},[3946,31667,13079],{"class":3952},[3946,31669,31670,31672,31674,31676,31678,31680],{"class":3948,"line":7755},[3946,31671,13084],{"class":3952},[3946,31673,12926],{"class":4262},[3946,31675,13089],{"class":4262},[3946,31677,13092],{"class":3952},[3946,31679,29754],{"class":4262},[3946,31681,13098],{"class":3952},[3946,31683,31684,31686,31688,31690,31692,31694,31696,31698,31700],{"class":3948,"line":7765},[3946,31685,13103],{"class":3952},[3946,31687,12931],{"class":4262},[3946,31689,13108],{"class":4262},[3946,31691,13111],{"class":3952},[3946,31693,13114],{"class":3966},[3946,31695,13117],{"class":4262},[3946,31697,13111],{"class":3952},[3946,31699,13122],{"class":3966},[3946,31701,13125],{"class":3952},[3946,31703,31704,31706,31708],{"class":3948,"line":7777},[3946,31705,13130],{"class":3952},[3946,31707,12926],{"class":4262},[3946,31709,13135],{"class":3952},[3946,31711,31712],{"class":3948,"line":7786},[3946,31713,8731],{"class":3952},[3946,31715,31716],{"class":3948,"line":7799},[3946,31717,4521],{"class":3952},[3946,31719,31720],{"class":3948,"line":7818},[3946,31721,4278],{"emptyLinePlaceholder":4277},[3946,31723,31724,31726,31728,31730],{"class":3948,"line":7823},[3946,31725,5776],{"class":4251},[3946,31727,4312],{"class":3952},[3946,31729,20928],{"class":4262},[3946,31731,4318],{"class":3952},[3946,31733,31734,31736],{"class":3948,"line":7834},[3946,31735,4603],{"class":4251},[3946,31737,13079],{"class":3952},[3946,31739,31740,31742,31744,31746,31748,31750],{"class":3948,"line":7850},[3946,31741,13084],{"class":3952},[3946,31743,12926],{"class":4262},[3946,31745,13089],{"class":4262},[3946,31747,13092],{"class":3952},[3946,31749,29754],{"class":4262},[3946,31751,13098],{"class":3952},[3946,31753,31754,31756,31758,31760,31763,31765,31768,31770,31772],{"class":3948,"line":7855},[3946,31755,13103],{"class":3952},[3946,31757,14762],{"class":4403},[3946,31759,16361],{"class":3952},[3946,31761,31762],{"class":4262},"Нотатку",[3946,31764,18403],{"class":4262},[3946,31766,31767],{"class":4262}," знайдено",[3946,31769,15133],{"class":3952},[3946,31771,14762],{"class":4262},[3946,31773,13135],{"class":3952},[3946,31775,31776,31778,31780],{"class":3948,"line":7860},[3946,31777,13130],{"class":3952},[3946,31779,12926],{"class":4262},[3946,31781,13135],{"class":3952},[3946,31783,31784],{"class":3948,"line":7891},[3946,31785,8731],{"class":3952},[3946,31787,31788],{"class":3948,"line":7896},[3946,31789,4521],{"class":3952},[3946,31791,31792],{"class":3948,"line":7901},[3946,31793,4278],{"emptyLinePlaceholder":4277},[3946,31795,31796,31798],{"class":3948,"line":7906},[3946,31797,5062],{"class":4251},[3946,31799,13079],{"class":3952},[3946,31801,31802,31804,31806,31808,31810,31812],{"class":3948,"line":7912},[3946,31803,13158],{"class":3952},[3946,31805,12926],{"class":4262},[3946,31807,13089],{"class":4262},[3946,31809,13092],{"class":3952},[3946,31811,15105],{"class":4262},[3946,31813,13098],{"class":3952},[3946,31815,31816,31818,31820],{"class":3948,"line":7917},[3946,31817,13167],{"class":3952},[3946,31819,23747],{"class":4342},[3946,31821,4040],{"class":3952},[3946,31823,31824,31826,31828,31830,31832,31834],{"class":3948,"line":7935},[3946,31825,13084],{"class":3952},[3946,31827,12926],{"class":4262},[3946,31829,13089],{"class":4262},[3946,31831,13092],{"class":3952},[3946,31833,23762],{"class":4262},[3946,31835,13098],{"class":3952},[3946,31837,31838,31840],{"class":3948,"line":7942},[3946,31839,13103],{"class":3952},[3946,31841,15436],{"class":4262},[3946,31843,31844,31846,31848,31851],{"class":3948,"line":7963},[3946,31845,21557],{"class":4262},[3946,31847,13092],{"class":3952},[3946,31849,31850],{"class":4262},"headerButton",[3946,31852,4040],{"class":3952},[3946,31854,31855,31857],{"class":3948,"line":7979},[3946,31856,28996],{"class":4262},[3946,31858,15455],{"class":3952},[3946,31860,31861],{"class":3948,"line":7992},[3946,31862,21593],{"class":3952},[3946,31864,31865,31867,31869,31871,31873,31876,31878,31880,31883,31885,31887,31889,31891],{"class":3948,"line":8012},[3946,31866,15112],{"class":3952},[3946,31868,13775],{"class":4262},[3946,31870,13616],{"class":4262},[3946,31872,13111],{"class":3952},[3946,31874,31875],{"class":3966},"\"arrow-back\"",[3946,31877,13108],{"class":4262},[3946,31879,12602],{"class":3952},[3946,31881,31882],{"class":4020},"24",[3946,31884,5928],{"class":3952},[3946,31886,14080],{"class":4262},[3946,31888,13111],{"class":3952},[3946,31890,13122],{"class":3966},[3946,31892,13125],{"class":3952},[3946,31894,31895,31897,31899],{"class":3948,"line":8018},[3946,31896,15256],{"class":3952},[3946,31898,14771],{"class":4262},[3946,31900,13135],{"class":3952},[3946,31902,31903],{"class":3948,"line":8023},[3946,31904,8635],{"class":3952},[3946,31906,31907,31909,31911,31913,31915,31917,31919,31922,31924,31926],{"class":3948,"line":8028},[3946,31908,13103],{"class":3952},[3946,31910,14762],{"class":4262},[3946,31912,13089],{"class":4262},[3946,31914,13092],{"class":3952},[3946,31916,29847],{"class":4262},[3946,31918,15124],{"class":3952},[3946,31920,31921],{"class":4262},"Нотатка",[3946,31923,15133],{"class":3952},[3946,31925,14762],{"class":4262},[3946,31927,13135],{"class":3952},[3946,31929,31930],{"class":3948,"line":8033},[3946,31931,8635],{"class":3952},[3946,31933,31934,31936,31938,31940,31942,31944,31946,31948,31950,31953],{"class":3948,"line":8038},[3946,31935,13103],{"class":3952},[3946,31937,14771],{"class":4262},[3946,31939,13089],{"class":4262},[3946,31941,13092],{"class":3952},[3946,31943,31850],{"class":4262},[3946,31945,5928],{"class":3952},[3946,31947,15204],{"class":4262},[3946,31949,12602],{"class":3952},[3946,31951,31952],{"class":4262},"handleDelete",[3946,31954,13098],{"class":3952},[3946,31956,31957,31959,31961,31963,31965,31967,31969,31971,31973,31975,31977,31979,31981],{"class":3948,"line":8044},[3946,31958,15112],{"class":3952},[3946,31960,13775],{"class":4262},[3946,31962,13616],{"class":4262},[3946,31964,13111],{"class":3952},[3946,31966,29520],{"class":3966},[3946,31968,13108],{"class":4262},[3946,31970,12602],{"class":3952},[3946,31972,31882],{"class":4020},[3946,31974,5928],{"class":3952},[3946,31976,14080],{"class":4262},[3946,31978,13111],{"class":3952},[3946,31980,29536],{"class":3966},[3946,31982,13125],{"class":3952},[3946,31984,31985,31987,31989],{"class":3948,"line":8049},[3946,31986,15256],{"class":3952},[3946,31988,14771],{"class":4262},[3946,31990,13135],{"class":3952},[3946,31992,31993,31995,31997],{"class":3948,"line":8071},[3946,31994,13130],{"class":3952},[3946,31996,12926],{"class":4262},[3946,31998,13135],{"class":3952},[3946,32000,32001],{"class":3948,"line":8090},[3946,32002,4278],{"emptyLinePlaceholder":4277},[3946,32004,32005,32007,32010],{"class":3948,"line":8095},[3946,32006,13167],{"class":3952},[3946,32008,32009],{"class":4342},"\u002F* Content *\u002F",[3946,32011,4040],{"class":3952},[3946,32013,32014,32016,32018,32020,32022,32024,32026,32029,32031,32034],{"class":3948,"line":8112},[3946,32015,13084],{"class":3952},[3946,32017,24325],{"class":4262},[3946,32019,13089],{"class":4262},[3946,32021,13092],{"class":3952},[3946,32023,21027],{"class":4262},[3946,32025,5928],{"class":3952},[3946,32027,32028],{"class":4262},"contentContainerStyle",[3946,32030,13092],{"class":3952},[3946,32032,32033],{"class":4262},"contentContainer",[3946,32035,13098],{"class":3952},[3946,32037,32038,32040,32042,32044,32046,32048,32051,32053,32055,32057],{"class":3948,"line":8117},[3946,32039,13103],{"class":3952},[3946,32041,14762],{"class":4262},[3946,32043,13089],{"class":4262},[3946,32045,13092],{"class":3952},[3946,32047,15121],{"class":4262},[3946,32049,32050],{"class":3952},"}>{note.",[3946,32052,15121],{"class":4262},[3946,32054,12613],{"class":3952},[3946,32056,14762],{"class":4262},[3946,32058,13135],{"class":3952},[3946,32060,32061],{"class":3948,"line":8160},[3946,32062,8635],{"class":3952},[3946,32064,32065,32067,32069,32071,32073,32076],{"class":3948,"line":8185},[3946,32066,13103],{"class":3952},[3946,32068,12926],{"class":4262},[3946,32070,13089],{"class":4262},[3946,32072,13092],{"class":3952},[3946,32074,32075],{"class":4262},"metadata",[3946,32077,13098],{"class":3952},[3946,32079,32080,32082,32084,32086,32088,32091],{"class":3948,"line":8190},[3946,32081,15112],{"class":3952},[3946,32083,14762],{"class":4262},[3946,32085,13089],{"class":4262},[3946,32087,13092],{"class":3952},[3946,32089,32090],{"class":4262},"metadataText",[3946,32092,13098],{"class":3952},[3946,32094,32095,32098,32101,32103,32105,32108,32111,32113,32116],{"class":3948,"line":8195},[3946,32096,32097],{"class":4262},"            Створено",[3946,32099,32100],{"class":3952},": {",[3946,32102,8218],{"class":4403},[3946,32104,7015],{"class":4224},[3946,32106,32107],{"class":3952},"(note.createdAt).",[3946,32109,32110],{"class":4224},"toLocaleString",[3946,32112,4331],{"class":3952},[3946,32114,32115],{"class":3966},"'uk-UA'",[3946,32117,26444],{"class":3952},[3946,32119,32120,32122,32124],{"class":3948,"line":8200},[3946,32121,15182],{"class":3952},[3946,32123,14762],{"class":4262},[3946,32125,13135],{"class":3952},[3946,32127,32128,32130,32132,32134,32136,32138],{"class":3948,"line":8206},[3946,32129,15112],{"class":3952},[3946,32131,14762],{"class":4262},[3946,32133,13089],{"class":4262},[3946,32135,13092],{"class":3952},[3946,32137,32090],{"class":4262},[3946,32139,13098],{"class":3952},[3946,32141,32142,32145,32147,32149,32151,32154,32156,32158,32160],{"class":3948,"line":9571},[3946,32143,32144],{"class":4262},"            Оновлено",[3946,32146,32100],{"class":3952},[3946,32148,8218],{"class":4403},[3946,32150,7015],{"class":4224},[3946,32152,32153],{"class":3952},"(note.updatedAt).",[3946,32155,32110],{"class":4224},[3946,32157,4331],{"class":3952},[3946,32159,32115],{"class":3966},[3946,32161,26444],{"class":3952},[3946,32163,32164,32166,32168],{"class":3948,"line":9589},[3946,32165,15182],{"class":3952},[3946,32167,14762],{"class":4262},[3946,32169,13135],{"class":3952},[3946,32171,32172,32174,32176],{"class":3948,"line":9596},[3946,32173,15256],{"class":3952},[3946,32175,12926],{"class":4262},[3946,32177,13135],{"class":3952},[3946,32179,32180],{"class":3948,"line":9618},[3946,32181,4278],{"emptyLinePlaceholder":4277},[3946,32183,32184,32186,32188,32190,32192,32194,32196,32198,32200,32202],{"class":3948,"line":9627},[3946,32185,13103],{"class":3952},[3946,32187,14762],{"class":4262},[3946,32189,13089],{"class":4262},[3946,32191,13092],{"class":3952},[3946,32193,29268],{"class":4262},[3946,32195,32050],{"class":3952},[3946,32197,21027],{"class":4262},[3946,32199,12613],{"class":3952},[3946,32201,14762],{"class":4262},[3946,32203,13135],{"class":3952},[3946,32205,32206,32208,32210],{"class":3948,"line":9636},[3946,32207,13130],{"class":3952},[3946,32209,24325],{"class":4262},[3946,32211,13135],{"class":3952},[3946,32213,32214,32216,32218],{"class":3948,"line":9645},[3946,32215,13187],{"class":3952},[3946,32217,12926],{"class":4262},[3946,32219,13135],{"class":3952},[3946,32221,32222],{"class":3948,"line":9650},[3946,32223,10875],{"class":3952},[3946,32225,32226],{"class":3948,"line":9655},[3946,32227,4040],{"class":3952},[3946,32229,32230],{"class":3948,"line":9660},[3946,32231,4278],{"emptyLinePlaceholder":4277},[3946,32233,32234,32236,32238,32240,32242,32244,32246],{"class":3948,"line":9665},[3946,32235,4283],{"class":4255},[3946,32237,13210],{"class":4286},[3946,32239,4290],{"class":3952},[3946,32241,12936],{"class":4262},[3946,32243,4298],{"class":3952},[3946,32245,8509],{"class":4224},[3946,32247,8512],{"class":3952},[3946,32249,32250,32252],{"class":3948,"line":9671},[3946,32251,15568],{"class":4262},[3946,32253,4427],{"class":3952},[3946,32255,32256,32258,32260],{"class":3948,"line":9676},[3946,32257,13232],{"class":4262},[3946,32259,13235],{"class":4020},[3946,32261,3970],{"class":3952},[3946,32263,32264,32266,32268],{"class":3948,"line":9700},[3946,32265,13261],{"class":4262},[3946,32267,13264],{"class":3966},[3946,32269,3970],{"class":3952},[3946,32271,32272],{"class":3948,"line":9721},[3946,32273,13271],{"class":3952},[3946,32275,32276,32278],{"class":3948,"line":9756},[3946,32277,30068],{"class":4262},[3946,32279,4427],{"class":3952},[3946,32281,32282,32284,32286],{"class":3948,"line":9778},[3946,32283,13232],{"class":4262},[3946,32285,13235],{"class":4020},[3946,32287,3970],{"class":3952},[3946,32289,32290,32292,32294],{"class":3948,"line":9783},[3946,32291,13242],{"class":4262},[3946,32293,13245],{"class":3966},[3946,32295,3970],{"class":3952},[3946,32297,32298,32300,32302],{"class":3948,"line":9789},[3946,32299,13252],{"class":4262},[3946,32301,13245],{"class":3966},[3946,32303,3970],{"class":3952},[3946,32305,32306],{"class":3948,"line":9801},[3946,32307,13271],{"class":3952},[3946,32309,32310,32312],{"class":3948,"line":9813},[3946,32311,24431],{"class":4262},[3946,32313,4427],{"class":3952},[3946,32315,32316,32318,32320],{"class":3948,"line":9830},[3946,32317,30109],{"class":4262},[3946,32319,30112],{"class":3966},[3946,32321,3970],{"class":3952},[3946,32323,32324,32326,32328],{"class":3948,"line":9840},[3946,32325,13242],{"class":4262},[3946,32327,30121],{"class":3966},[3946,32329,3970],{"class":3952},[3946,32331,32332,32334,32336],{"class":3948,"line":9856},[3946,32333,13252],{"class":4262},[3946,32335,13245],{"class":3966},[3946,32337,3970],{"class":3952},[3946,32339,32340,32342,32344],{"class":3948,"line":9866},[3946,32341,15734],{"class":4262},[3946,32343,15681],{"class":4020},[3946,32345,3970],{"class":3952},[3946,32347,32348,32350,32352],{"class":3948,"line":9882},[3946,32349,15743],{"class":4262},[3946,32351,15661],{"class":4020},[3946,32353,3970],{"class":3952},[3946,32355,32356,32358,32360],{"class":3948,"line":9892},[3946,32357,30160],{"class":4262},[3946,32359,13235],{"class":4020},[3946,32361,3970],{"class":3952},[3946,32363,32364,32366,32368],{"class":3948,"line":9908},[3946,32365,30169],{"class":4262},[3946,32367,30172],{"class":3966},[3946,32369,3970],{"class":3952},[3946,32371,32372],{"class":3948,"line":9918},[3946,32373,13271],{"class":3952},[3946,32375,32376,32379],{"class":3948,"line":9934},[3946,32377,32378],{"class":4262},"  headerButton:",[3946,32380,4427],{"class":3952},[3946,32382,32383,32385,32387],{"class":3948,"line":9944},[3946,32384,30226],{"class":4262},[3946,32386,24440],{"class":4020},[3946,32388,3970],{"class":3952},[3946,32390,32391,32393,32395],{"class":3948,"line":9960},[3946,32392,30235],{"class":4262},[3946,32394,24440],{"class":4020},[3946,32396,3970],{"class":3952},[3946,32398,32399,32401,32403],{"class":3948,"line":9970},[3946,32400,13242],{"class":4262},[3946,32402,13245],{"class":3966},[3946,32404,3970],{"class":3952},[3946,32406,32407,32409,32411],{"class":3948,"line":9986},[3946,32408,13252],{"class":4262},[3946,32410,13245],{"class":3966},[3946,32412,3970],{"class":3952},[3946,32414,32415],{"class":3948,"line":9994},[3946,32416,13271],{"class":3952},[3946,32418,32419,32421],{"class":3948,"line":10014},[3946,32420,30183],{"class":4262},[3946,32422,4427],{"class":3952},[3946,32424,32425,32427,32429],{"class":3948,"line":10019},[3946,32426,15628],{"class":4262},[3946,32428,30467],{"class":4020},[3946,32430,3970],{"class":3952},[3946,32432,32433,32435,32437],{"class":3948,"line":10024},[3946,32434,15638],{"class":4262},[3946,32436,15791],{"class":3966},[3946,32438,3970],{"class":3952},[3946,32440,32441,32443,32445],{"class":3948,"line":10029},[3946,32442,15648],{"class":4262},[3946,32444,15651],{"class":3966},[3946,32446,3970],{"class":3952},[3946,32448,32449],{"class":3948,"line":10044},[3946,32450,13271],{"class":3952},[3946,32452,32453,32456],{"class":3948,"line":10053},[3946,32454,32455],{"class":4262},"  content:",[3946,32457,4427],{"class":3952},[3946,32459,32460,32462,32464],{"class":3948,"line":10058},[3946,32461,13232],{"class":4262},[3946,32463,13235],{"class":4020},[3946,32465,3970],{"class":3952},[3946,32467,32468],{"class":3948,"line":10063},[3946,32469,13271],{"class":3952},[3946,32471,32472,32475],{"class":3948,"line":10079},[3946,32473,32474],{"class":4262},"  contentContainer:",[3946,32476,4427],{"class":3952},[3946,32478,32479,32481,32483],{"class":3948,"line":10084},[3946,32480,15599],{"class":4262},[3946,32482,15602],{"class":4020},[3946,32484,3970],{"class":3952},[3946,32486,32487],{"class":3948,"line":10089},[3946,32488,13271],{"class":3952},[3946,32490,32491,32493],{"class":3948,"line":10094},[3946,32492,15621],{"class":4262},[3946,32494,4427],{"class":3952},[3946,32496,32497,32499,32501],{"class":3948,"line":10099},[3946,32498,15628],{"class":4262},[3946,32500,30192],{"class":4020},[3946,32502,3970],{"class":3952},[3946,32504,32505,32507,32509],{"class":3948,"line":11862},[3946,32506,15638],{"class":4262},[3946,32508,15641],{"class":3966},[3946,32510,3970],{"class":3952},[3946,32512,32513,32515,32517],{"class":3948,"line":11871},[3946,32514,15648],{"class":4262},[3946,32516,15651],{"class":3966},[3946,32518,3970],{"class":3952},[3946,32520,32521,32523,32525],{"class":3948,"line":11876},[3946,32522,15658],{"class":4262},[3946,32524,15681],{"class":4020},[3946,32526,3970],{"class":3952},[3946,32528,32529],{"class":3948,"line":11881},[3946,32530,13271],{"class":3952},[3946,32532,32533,32536],{"class":3948,"line":11894},[3946,32534,32535],{"class":4262},"  metadata:",[3946,32537,4427],{"class":3952},[3946,32539,32540,32542,32544],{"class":3948,"line":11899},[3946,32541,15658],{"class":4262},[3946,32543,15631],{"class":4020},[3946,32545,3970],{"class":3952},[3946,32547,32548,32551,32553],{"class":3948,"line":11904},[3946,32549,32550],{"class":4262},"    paddingBottom:",[3946,32552,15681],{"class":4020},[3946,32554,3970],{"class":3952},[3946,32556,32557,32559,32561],{"class":3948,"line":11909},[3946,32558,30160],{"class":4262},[3946,32560,13235],{"class":4020},[3946,32562,3970],{"class":3952},[3946,32564,32565,32567,32569],{"class":3948,"line":11915},[3946,32566,30169],{"class":4262},[3946,32568,30172],{"class":3966},[3946,32570,3970],{"class":3952},[3946,32572,32573],{"class":3948,"line":11920},[3946,32574,13271],{"class":3952},[3946,32576,32577,32580],{"class":3948,"line":11941},[3946,32578,32579],{"class":4262},"  metadataText:",[3946,32581,4427],{"class":3952},[3946,32583,32584,32586,32588],{"class":3948,"line":11948},[3946,32585,15628],{"class":4262},[3946,32587,15661],{"class":4020},[3946,32589,3970],{"class":3952},[3946,32591,32592,32594,32596],{"class":3948,"line":11961},[3946,32593,15648],{"class":4262},[3946,32595,30554],{"class":3966},[3946,32597,3970],{"class":3952},[3946,32599,32600,32602,32604],{"class":3948,"line":11966},[3946,32601,15658],{"class":4262},[3946,32603,22658],{"class":4020},[3946,32605,3970],{"class":3952},[3946,32607,32608],{"class":3948,"line":11972},[3946,32609,13271],{"class":3952},[3946,32611,32612,32614],{"class":3948,"line":11986},[3946,32613,30439],{"class":4262},[3946,32615,4427],{"class":3952},[3946,32617,32618,32620,32622],{"class":3948,"line":11999},[3946,32619,15628],{"class":4262},[3946,32621,15681],{"class":4020},[3946,32623,3970],{"class":3952},[3946,32625,32626,32629,32631],{"class":3948,"line":12018},[3946,32627,32628],{"class":4262},"    lineHeight:",[3946,32630,15631],{"class":4020},[3946,32632,3970],{"class":3952},[3946,32634,32635,32637,32640],{"class":3948,"line":12024},[3946,32636,15648],{"class":4262},[3946,32638,32639],{"class":3966}," '#333333'",[3946,32641,3970],{"class":3952},[3946,32643,32644],{"class":3948,"line":12034},[3946,32645,13271],{"class":3952},[3946,32647,32648],{"class":3948,"line":12040},[3946,32649,13276],{"class":3952},[3750,32651,32653],{"id":32652},"_710-create-note-screen","7.10. Create Note Screen",[3857,32655,32657],{"className":4242,"code":32656,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FCreateNoteScreen.tsx\n\nimport React, { useState } from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  KeyboardAvoidingView,\n  Platform,\n  ScrollView,\n  Alert,\n  TouchableOpacity,\n} from 'react-native';\nimport { NativeStackNavigationProp } from '@react-navigation\u002Fnative-stack';\nimport { Ionicons } from '@expo\u002Fvector-icons';\nimport { AppStackParamList } from '..\u002F..\u002F..\u002Fnavigation\u002FAppNavigator';\nimport { notesApi } from '..\u002Fapi\u002FnotesApi';\nimport { Input } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FInput';\nimport { Button } from '..\u002F..\u002F..\u002Fshared\u002Fcomponents\u002FButton';\n\ntype CreateNoteScreenNavigationProp = NativeStackNavigationProp\u003C\n  AppStackParamList,\n  'CreateNote'\n>;\n\ninterface Props {\n  navigation: CreateNoteScreenNavigationProp;\n}\n\nexport function CreateNoteScreen({ navigation }: Props) {\n  const [title, setTitle] = useState('');\n  const [content, setContent] = useState('');\n  const [isLoading, setIsLoading] = useState(false);\n  const [errors, setErrors] = useState({ title: '', content: '' });\n\n  \u002F**\n   * Валідація форми\n   *\u002F\n  const validateForm = (): boolean => {\n    const newErrors = { title: '', content: '' };\n    let isValid = true;\n\n    if (!title.trim()) {\n      newErrors.title = 'Заголовок обов\\'язковий';\n      isValid = false;\n    }\n\n    if (!content.trim()) {\n      newErrors.content = 'Вміст обов\\'язковий';\n      isValid = false;\n    } else if (content.trim().length \u003C 10) {\n      newErrors.content = 'Вміст повинен містити мінімум 10 символів';\n      isValid = false;\n    }\n\n    setErrors(newErrors);\n    return isValid;\n  };\n\n  \u002F**\n   * Створення нотатки\n   *\u002F\n  const handleCreate = async () => {\n    if (!validateForm()) {\n      return;\n    }\n\n    try {\n      setIsLoading(true);\n      \n      await notesApi.createNote({\n        title: title.trim(),\n        content: content.trim(),\n      });\n\n      Alert.alert('Успіх', 'Нотатку створено', [\n        {\n          text: 'OK',\n          onPress: () => navigation.goBack(),\n        },\n      ]);\n    } catch (error) {\n      console.error('Помилка створення нотатки:', error);\n      Alert.alert('Помилка', 'Не вдалося створити нотатку');\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  return (\n    \u003CKeyboardAvoidingView\n      style={styles.container}\n      behavior={Platform.OS === 'ios' ? 'padding' : 'height'}\n    >\n      {\u002F* Header *\u002F}\n      \u003CView style={styles.header}>\n        \u003CTouchableOpacity\n          style={styles.headerButton}\n          onPress={() => navigation.goBack()}\n        >\n          \u003CIonicons name=\"close\" size={28} color=\"#007AFF\" \u002F>\n        \u003C\u002FTouchableOpacity>\n        \n        \u003CText style={styles.headerTitle}>Нова Нотатка\u003C\u002FText>\n        \n        \u003CView style={styles.headerButton} \u002F>\n      \u003C\u002FView>\n\n      \u003CScrollView\n        style={styles.content}\n        contentContainerStyle={styles.contentContainer}\n        keyboardShouldPersistTaps=\"handled\"\n      >\n        \u003CInput\n          label=\"Заголовок\"\n          placeholder=\"Введіть заголовок нотатки\"\n          value={title}\n          onChangeText={setTitle}\n          error={errors.title}\n          editable={!isLoading}\n        \u002F>\n\n        \u003CView style={styles.textAreaContainer}>\n          \u003CText style={styles.label}>Вміст\u003C\u002FText>\n          \u003CTextInput\n            style={[styles.textArea, errors.content && styles.textAreaError]}\n            placeholder=\"Введіть вміст нотатки...\"\n            value={content}\n            onChangeText={setContent}\n            multiline\n            numberOfLines={10}\n            textAlignVertical=\"top\"\n            editable={!isLoading}\n            placeholderTextColor=\"#999999\"\n          \u002F>\n          {errors.content && (\n            \u003CText style={styles.errorText}>{errors.content}\u003C\u002FText>\n          )}\n        \u003C\u002FView>\n\n        \u003CButton\n          title=\"Створити нотатку\"\n          onPress={handleCreate}\n          loading={isLoading}\n        \u002F>\n      \u003C\u002FScrollView>\n    \u003C\u002FKeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#FFFFFF',\n  },\n  header: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderBottomWidth: 1,\n    borderBottomColor: '#E5E5E5',\n  },\n  headerButton: {\n    width: 40,\n    height: 40,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  headerTitle: {\n    fontSize: 18,\n    fontWeight: '600',\n    color: '#000000',\n  },\n  content: {\n    flex: 1,\n  },\n  contentContainer: {\n    padding: 20,\n  },\n  textAreaContainer: {\n    marginBottom: 16,\n  },\n  label: {\n    fontSize: 14,\n    fontWeight: '600',\n    color: '#000000',\n    marginBottom: 8,\n  },\n  textArea: {\n    backgroundColor: '#F5F5F5',\n    borderRadius: 12,\n    padding: 16,\n    fontSize: 16,\n    color: '#000000',\n    minHeight: 200,\n    borderWidth: 1,\n    borderColor: 'transparent',\n  },\n  textAreaError: {\n    borderColor: '#FF3B30',\n  },\n  errorText: {\n    fontSize: 12,\n    color: '#FF3B30',\n    marginTop: 4,\n  },\n});\n",[3782,32658,32659,32664,32668,32686,32692,32698,32704,32710,32716,32722,32728,32734,32740,32750,32766,32782,32798,32814,32830,32846,32850,32863,32869,32874,32878,32882,32890,32901,32905,32909,32928,32951,32974,32996,33029,33033,33037,33041,33045,33059,33080,33092,33096,33110,33130,33140,33144,33148,33162,33181,33191,33218,33233,33243,33247,33251,33263,33271,33275,33279,33283,33287,33291,33308,33318,33324,33328,33332,33338,33348,33352,33365,33379,33393,33397,33401,33420,33424,33432,33450,33454,33459,33471,33490,33509,33517,33527,33531,33535,33539,33545,33551,33561,33583,33587,33595,33609,33615,33625,33631,33635,33665,33673,33677,33703,33707,33721,33729,33733,33739,33749,33759,33767,33771,33777,33787,33797,33808,33819,33830,33841,33845,33849,33864,33887,33893,33907,33912,33917,33922,33927,33932,33937,33942,33947,33951,33956,33961,33966,33971,33975,33980,33985,33990,33995,33999,34004,34009,34013,34017,34021,34025,34031,34039,34047,34051,34057,34065,34073,34081,34089,34097,34105,34113,34117,34123,34131,34139,34147,34155,34159,34165,34173,34181,34189,34193,34199,34207,34211,34217,34225,34229,34236,34244,34248,34254,34262,34270,34278,34286,34290,34297,34305,34313,34321,34329,34337,34346,34354,34362,34366,34373,34381,34385,34391,34399,34407,34415,34419],{"__ignoreMap":3865},[3946,32660,32661],{"class":3948,"line":3949},[3946,32662,32663],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fnotes\u002Fscreens\u002FCreateNoteScreen.tsx\n",[3946,32665,32666],{"class":3948,"line":3956},[3946,32667,4278],{"emptyLinePlaceholder":4277},[3946,32669,32670,32672,32674,32676,32678,32680,32682,32684],{"class":3948,"line":3973},[3946,32671,4252],{"class":4251},[3946,32673,10244],{"class":4262},[3946,32675,8290],{"class":3952},[3946,32677,10543],{"class":4262},[3946,32679,6823],{"class":3952},[3946,32681,6826],{"class":4251},[3946,32683,10304],{"class":3966},[3946,32685,4272],{"class":3952},[3946,32687,32688,32690],{"class":3948,"line":3986},[3946,32689,4252],{"class":4251},[3946,32691,4427],{"class":3952},[3946,32693,32694,32696],{"class":3948,"line":3999},[3946,32695,21895],{"class":4262},[3946,32697,3970],{"class":3952},[3946,32699,32700,32702],{"class":3948,"line":4012},[3946,32701,21283],{"class":4262},[3946,32703,3970],{"class":3952},[3946,32705,32706,32708],{"class":3948,"line":4026},[3946,32707,21290],{"class":4262},[3946,32709,3970],{"class":3952},[3946,32711,32712,32714],{"class":3948,"line":4037},[3946,32713,22733],{"class":4262},[3946,32715,3970],{"class":3952},[3946,32717,32718,32720],{"class":3948,"line":4487},[3946,32719,22740],{"class":4262},[3946,32721,3970],{"class":3952},[3946,32723,32724,32726],{"class":3948,"line":4507},[3946,32725,22747],{"class":4262},[3946,32727,3970],{"class":3952},[3946,32729,32730,32732],{"class":3948,"line":4518},[3946,32731,22754],{"class":4262},[3946,32733,3970],{"class":3952},[3946,32735,32736,32738],{"class":3948,"line":4524},[3946,32737,21276],{"class":4262},[3946,32739,3970],{"class":3952},[3946,32741,32742,32744,32746,32748],{"class":3948,"line":4529},[3946,32743,5928],{"class":3952},[3946,32745,6826],{"class":4251},[3946,32747,12943],{"class":3966},[3946,32749,4272],{"class":3952},[3946,32751,32752,32754,32756,32758,32760,32762,32764],{"class":3948,"line":4534},[3946,32753,4252],{"class":4251},[3946,32755,6817],{"class":3952},[3946,32757,22775],{"class":4262},[3946,32759,6823],{"class":3952},[3946,32761,6826],{"class":4251},[3946,32763,13355],{"class":3966},[3946,32765,4272],{"class":3952},[3946,32767,32768,32770,32772,32774,32776,32778,32780],{"class":3948,"line":4540},[3946,32769,4252],{"class":4251},[3946,32771,6817],{"class":3952},[3946,32773,13775],{"class":4262},[3946,32775,6823],{"class":3952},[3946,32777,6826],{"class":4251},[3946,32779,13782],{"class":3966},[3946,32781,4272],{"class":3952},[3946,32783,32784,32786,32788,32790,32792,32794,32796],{"class":3948,"line":4567},[3946,32785,4252],{"class":4251},[3946,32787,6817],{"class":3952},[3946,32789,13987],{"class":4262},[3946,32791,6823],{"class":3952},[3946,32793,6826],{"class":4251},[3946,32795,28284],{"class":3966},[3946,32797,4272],{"class":3952},[3946,32799,32800,32802,32804,32806,32808,32810,32812],{"class":3948,"line":4574},[3946,32801,4252],{"class":4251},[3946,32803,6817],{"class":3952},[3946,32805,28295],{"class":4262},[3946,32807,6823],{"class":3952},[3946,32809,6826],{"class":4251},[3946,32811,28302],{"class":3966},[3946,32813,4272],{"class":3952},[3946,32815,32816,32818,32820,32822,32824,32826,32828],{"class":3948,"line":4600},[3946,32817,4252],{"class":4251},[3946,32819,6817],{"class":3952},[3946,32821,22825],{"class":4262},[3946,32823,6823],{"class":3952},[3946,32825,6826],{"class":4251},[3946,32827,22832],{"class":3966},[3946,32829,4272],{"class":3952},[3946,32831,32832,32834,32836,32838,32840,32842,32844],{"class":3948,"line":4610},[3946,32833,4252],{"class":4251},[3946,32835,6817],{"class":3952},[3946,32837,22843],{"class":4262},[3946,32839,6823],{"class":3952},[3946,32841,6826],{"class":4251},[3946,32843,22850],{"class":3966},[3946,32845,4272],{"class":3952},[3946,32847,32848],{"class":3948,"line":4623},[3946,32849,4278],{"emptyLinePlaceholder":4277},[3946,32851,32852,32854,32857,32859,32861],{"class":3948,"line":4643},[3946,32853,22861],{"class":4255},[3946,32855,32856],{"class":4403}," CreateNoteScreenNavigationProp",[3946,32858,4290],{"class":3952},[3946,32860,22775],{"class":4403},[3946,32862,22871],{"class":3952},[3946,32864,32865,32867],{"class":3948,"line":4653},[3946,32866,28344],{"class":4403},[3946,32868,3970],{"class":3952},[3946,32870,32871],{"class":3948,"line":4658},[3946,32872,32873],{"class":3966},"  'CreateNote'\n",[3946,32875,32876],{"class":3948,"line":4663},[3946,32877,6463],{"class":3952},[3946,32879,32880],{"class":3948,"line":4668},[3946,32881,4278],{"emptyLinePlaceholder":4277},[3946,32883,32884,32886,32888],{"class":3948,"line":4674},[3946,32885,4801],{"class":4255},[3946,32887,17922],{"class":4403},[3946,32889,4427],{"class":3952},[3946,32891,32892,32894,32896,32899],{"class":3948,"line":4694},[3946,32893,22904],{"class":4262},[3946,32895,3963],{"class":3952},[3946,32897,32898],{"class":4403},"CreateNoteScreenNavigationProp",[3946,32900,4272],{"class":3952},[3946,32902,32903],{"class":3948,"line":4701},[3946,32904,4040],{"class":3952},[3946,32906,32907],{"class":3948,"line":4719},[3946,32908,4278],{"emptyLinePlaceholder":4277},[3946,32910,32911,32913,32915,32918,32920,32922,32924,32926],{"class":3948,"line":4735},[3946,32912,6030],{"class":4251},[3946,32914,4390],{"class":4255},[3946,32916,32917],{"class":4224}," CreateNoteScreen",[3946,32919,10506],{"class":3952},[3946,32921,16226],{"class":4262},[3946,32923,10512],{"class":3952},[3946,32925,18038],{"class":4403},[3946,32927,4318],{"class":3952},[3946,32929,32930,32932,32934,32936,32938,32941,32943,32945,32947,32949],{"class":3948,"line":4748},[3946,32931,5018],{"class":4255},[3946,32933,10529],{"class":3952},[3946,32935,15121],{"class":4286},[3946,32937,4447],{"class":3952},[3946,32939,32940],{"class":4286},"setTitle",[3946,32942,10540],{"class":3952},[3946,32944,10543],{"class":4224},[3946,32946,4331],{"class":3952},[3946,32948,22990],{"class":3966},[3946,32950,4337],{"class":3952},[3946,32952,32953,32955,32957,32959,32961,32964,32966,32968,32970,32972],{"class":3948,"line":4768},[3946,32954,5018],{"class":4255},[3946,32956,10529],{"class":3952},[3946,32958,21027],{"class":4286},[3946,32960,4447],{"class":3952},[3946,32962,32963],{"class":4286},"setContent",[3946,32965,10540],{"class":3952},[3946,32967,10543],{"class":4224},[3946,32969,4331],{"class":3952},[3946,32971,22990],{"class":3966},[3946,32973,4337],{"class":3952},[3946,32975,32976,32978,32980,32982,32984,32986,32988,32990,32992,32994],{"class":3948,"line":4777},[3946,32977,5018],{"class":4255},[3946,32979,10529],{"class":3952},[3946,32981,13046],{"class":4286},[3946,32983,4447],{"class":3952},[3946,32985,28441],{"class":4286},[3946,32987,10540],{"class":3952},[3946,32989,10543],{"class":4224},[3946,32991,4331],{"class":3952},[3946,32993,13575],{"class":4255},[3946,32995,4337],{"class":3952},[3946,32997,32998,33000,33002,33004,33006,33009,33011,33013,33015,33018,33020,33022,33025,33027],{"class":3948,"line":4782},[3946,32999,5018],{"class":4255},[3946,33001,10529],{"class":3952},[3946,33003,23396],{"class":4286},[3946,33005,4447],{"class":3952},[3946,33007,33008],{"class":4286},"setErrors",[3946,33010,10540],{"class":3952},[3946,33012,10543],{"class":4224},[3946,33014,10506],{"class":3952},[3946,33016,33017],{"class":4262},"title:",[3946,33019,23042],{"class":3966},[3946,33021,4447],{"class":3952},[3946,33023,33024],{"class":4262},"content:",[3946,33026,23042],{"class":3966},[3946,33028,10726],{"class":3952},[3946,33030,33031],{"class":3948,"line":6262},[3946,33032,4278],{"emptyLinePlaceholder":4277},[3946,33034,33035],{"class":3948,"line":6273},[3946,33036,6908],{"class":4342},[3946,33038,33039],{"class":3948,"line":6284},[3946,33040,23069],{"class":4342},[3946,33042,33043],{"class":3948,"line":6299},[3946,33044,6918],{"class":4342},[3946,33046,33047,33049,33051,33053,33055,33057],{"class":3948,"line":6304},[3946,33048,5018],{"class":4255},[3946,33050,23080],{"class":4224},[3946,33052,23083],{"class":3952},[3946,33054,4848],{"class":4403},[3946,33056,23088],{"class":4255},[3946,33058,4427],{"class":3952},[3946,33060,33061,33063,33066,33068,33070,33072,33074,33076,33078],{"class":3948,"line":6309},[3946,33062,4577],{"class":4255},[3946,33064,33065],{"class":4286}," newErrors",[3946,33067,23100],{"class":3952},[3946,33069,33017],{"class":4262},[3946,33071,23042],{"class":3966},[3946,33073,4447],{"class":3952},[3946,33075,33024],{"class":4262},[3946,33077,23042],{"class":3966},[3946,33079,13912],{"class":3952},[3946,33081,33082,33084,33086,33088,33090],{"class":3948,"line":6314},[3946,33083,23118],{"class":4255},[3946,33085,7649],{"class":4262},[3946,33087,4290],{"class":3952},[3946,33089,17493],{"class":4255},[3946,33091,4272],{"class":3952},[3946,33093,33094],{"class":3948,"line":6320},[3946,33095,4278],{"emptyLinePlaceholder":4277},[3946,33097,33098,33100,33102,33104,33106,33108],{"class":3948,"line":6325},[3946,33099,5503],{"class":4251},[3946,33101,4312],{"class":3952},[3946,33103,15121],{"class":4262},[3946,33105,4298],{"class":3952},[3946,33107,23148],{"class":4224},[3946,33109,23151],{"class":3952},[3946,33111,33112,33115,33117,33119,33121,33124,33126,33128],{"class":3948,"line":6337},[3946,33113,33114],{"class":4262},"      newErrors",[3946,33116,4298],{"class":3952},[3946,33118,15121],{"class":4262},[3946,33120,4290],{"class":3952},[3946,33122,33123],{"class":3966},"'Заголовок обов",[3946,33125,23169],{"class":23168},[3946,33127,23172],{"class":3966},[3946,33129,4272],{"class":3952},[3946,33131,33132,33134,33136,33138],{"class":3948,"line":6352},[3946,33133,23179],{"class":4262},[3946,33135,4290],{"class":3952},[3946,33137,13575],{"class":4255},[3946,33139,4272],{"class":3952},[3946,33141,33142],{"class":3948,"line":6364},[3946,33143,5550],{"class":3952},[3946,33145,33146],{"class":3948,"line":6376},[3946,33147,4278],{"emptyLinePlaceholder":4277},[3946,33149,33150,33152,33154,33156,33158,33160],{"class":3948,"line":6392},[3946,33151,5503],{"class":4251},[3946,33153,4312],{"class":3952},[3946,33155,21027],{"class":4262},[3946,33157,4298],{"class":3952},[3946,33159,23148],{"class":4224},[3946,33161,23151],{"class":3952},[3946,33163,33164,33166,33168,33170,33172,33175,33177,33179],{"class":3948,"line":6397},[3946,33165,33114],{"class":4262},[3946,33167,4298],{"class":3952},[3946,33169,21027],{"class":4262},[3946,33171,4290],{"class":3952},[3946,33173,33174],{"class":3966},"'Вміст обов",[3946,33176,23169],{"class":23168},[3946,33178,23172],{"class":3966},[3946,33180,4272],{"class":3952},[3946,33182,33183,33185,33187,33189],{"class":3948,"line":6402},[3946,33184,23179],{"class":4262},[3946,33186,4290],{"class":3952},[3946,33188,13575],{"class":4255},[3946,33190,4272],{"class":3952},[3946,33192,33193,33195,33197,33199,33201,33203,33205,33207,33209,33211,33213,33216],{"class":3948,"line":6407},[3946,33194,7115],{"class":3952},[3946,33196,23192],{"class":4251},[3946,33198,23195],{"class":4251},[3946,33200,4479],{"class":3952},[3946,33202,21027],{"class":4262},[3946,33204,4298],{"class":3952},[3946,33206,23148],{"class":4224},[3946,33208,19482],{"class":3952},[3946,33210,20355],{"class":4262},[3946,33212,16838],{"class":3952},[3946,33214,33215],{"class":4020},"10",[3946,33217,4318],{"class":3952},[3946,33219,33220,33222,33224,33226,33228,33231],{"class":3948,"line":6413},[3946,33221,33114],{"class":4262},[3946,33223,4298],{"class":3952},[3946,33225,21027],{"class":4262},[3946,33227,4290],{"class":3952},[3946,33229,33230],{"class":3966},"'Вміст повинен містити мінімум 10 символів'",[3946,33232,4272],{"class":3952},[3946,33234,33235,33237,33239,33241],{"class":3948,"line":6418},[3946,33236,23179],{"class":4262},[3946,33238,4290],{"class":3952},[3946,33240,13575],{"class":4255},[3946,33242,4272],{"class":3952},[3946,33244,33245],{"class":3948,"line":6434},[3946,33246,5550],{"class":3952},[3946,33248,33249],{"class":3948,"line":6466},[3946,33250,4278],{"emptyLinePlaceholder":4277},[3946,33252,33253,33256,33258,33261],{"class":3948,"line":6493},[3946,33254,33255],{"class":4224},"    setErrors",[3946,33257,4331],{"class":3952},[3946,33259,33260],{"class":4262},"newErrors",[3946,33262,4337],{"class":3952},[3946,33264,33265,33267,33269],{"class":3948,"line":6512},[3946,33266,4603],{"class":4251},[3946,33268,7649],{"class":4262},[3946,33270,4272],{"class":3952},[3946,33272,33273],{"class":3948,"line":6530},[3946,33274,15539],{"class":3952},[3946,33276,33277],{"class":3948,"line":6545},[3946,33278,4278],{"emptyLinePlaceholder":4277},[3946,33280,33281],{"class":3948,"line":6550},[3946,33282,6908],{"class":4342},[3946,33284,33285],{"class":3948,"line":6555},[3946,33286,27657],{"class":4342},[3946,33288,33289],{"class":3948,"line":6560},[3946,33290,6918],{"class":4342},[3946,33292,33293,33295,33298,33300,33302,33304,33306],{"class":3948,"line":6566},[3946,33294,5018],{"class":4255},[3946,33296,33297],{"class":4224}," handleCreate",[3946,33299,4290],{"class":3952},[3946,33301,4387],{"class":4255},[3946,33303,11004],{"class":3952},[3946,33305,6453],{"class":4255},[3946,33307,4427],{"class":3952},[3946,33309,33310,33312,33314,33316],{"class":3948,"line":6571},[3946,33311,5503],{"class":4251},[3946,33313,4312],{"class":3952},[3946,33315,23464],{"class":4224},[3946,33317,23151],{"class":3952},[3946,33319,33320,33322],{"class":3948,"line":6588},[3946,33321,7405],{"class":4251},[3946,33323,4272],{"class":3952},[3946,33325,33326],{"class":3948,"line":6597},[3946,33327,5550],{"class":3952},[3946,33329,33330],{"class":3948,"line":6609},[3946,33331,4278],{"emptyLinePlaceholder":4277},[3946,33333,33334,33336],{"class":3948,"line":6640},[3946,33335,6977],{"class":4251},[3946,33337,4427],{"class":3952},[3946,33339,33340,33342,33344,33346],{"class":3948,"line":6653},[3946,33341,28685],{"class":4224},[3946,33343,4331],{"class":3952},[3946,33345,17493],{"class":4255},[3946,33347,4337],{"class":3952},[3946,33349,33350],{"class":3948,"line":6659},[3946,33351,7095],{"class":3952},[3946,33353,33354,33356,33358,33360,33363],{"class":3948,"line":6671},[3946,33355,7069],{"class":4251},[3946,33357,27937],{"class":4262},[3946,33359,4298],{"class":3952},[3946,33361,33362],{"class":4224},"createNote",[3946,33364,8512],{"class":3952},[3946,33366,33367,33370,33373,33375,33377],{"class":3948,"line":6689},[3946,33368,33369],{"class":4262},"        title:",[3946,33371,33372],{"class":4262}," title",[3946,33374,4298],{"class":3952},[3946,33376,23148],{"class":4224},[3946,33378,19488],{"class":3952},[3946,33380,33381,33384,33387,33389,33391],{"class":3948,"line":6694},[3946,33382,33383],{"class":4262},"        content:",[3946,33385,33386],{"class":4262}," content",[3946,33388,4298],{"class":3952},[3946,33390,23148],{"class":4224},[3946,33392,19488],{"class":3952},[3946,33394,33395],{"class":3948,"line":6699},[3946,33396,10831],{"class":3952},[3946,33398,33399],{"class":3948,"line":6704},[3946,33400,4278],{"emptyLinePlaceholder":4277},[3946,33402,33403,33405,33407,33409,33411,33413,33415,33418],{"class":3948,"line":6709},[3946,33404,23537],{"class":4262},[3946,33406,4298],{"class":3952},[3946,33408,23542],{"class":4224},[3946,33410,4331],{"class":3952},[3946,33412,29097],{"class":3966},[3946,33414,4447],{"class":3952},[3946,33416,33417],{"class":3966},"'Нотатку створено'",[3946,33419,31550],{"class":3952},[3946,33421,33422],{"class":3948,"line":6715},[3946,33423,28971],{"class":3952},[3946,33425,33426,33428,33430],{"class":3948,"line":6720},[3946,33427,28976],{"class":4262},[3946,33429,23574],{"class":3966},[3946,33431,3970],{"class":3952},[3946,33433,33434,33436,33438,33440,33442,33444,33446,33448],{"class":3948,"line":6732},[3946,33435,28996],{"class":4224},[3946,33437,8545],{"class":4262},[3946,33439,11004],{"class":3952},[3946,33441,6453],{"class":4255},[3946,33443,15004],{"class":4262},[3946,33445,4298],{"class":3952},[3946,33447,16197],{"class":4224},[3946,33449,19488],{"class":3952},[3946,33451,33452],{"class":3948,"line":6743},[3946,33453,14311],{"class":3952},[3946,33455,33456],{"class":3948,"line":6754},[3946,33457,33458],{"class":3952},"      ]);\n",[3946,33460,33461,33463,33465,33467,33469],{"class":3948,"line":6768},[3946,33462,7115],{"class":3952},[3946,33464,4476],{"class":4251},[3946,33466,4479],{"class":3952},[3946,33468,4482],{"class":4262},[3946,33470,4318],{"class":3952},[3946,33472,33473,33475,33477,33479,33481,33484,33486,33488],{"class":3948,"line":7572},[3946,33474,5525],{"class":4262},[3946,33476,4298],{"class":3952},[3946,33478,4482],{"class":4224},[3946,33480,4331],{"class":3952},[3946,33482,33483],{"class":3966},"'Помилка створення нотатки:'",[3946,33485,4447],{"class":3952},[3946,33487,4482],{"class":4262},[3946,33489,4337],{"class":3952},[3946,33491,33492,33494,33496,33498,33500,33502,33504,33507],{"class":3948,"line":7590},[3946,33493,23537],{"class":4262},[3946,33495,4298],{"class":3952},[3946,33497,23542],{"class":4224},[3946,33499,4331],{"class":3952},[3946,33501,29130],{"class":3966},[3946,33503,4447],{"class":3952},[3946,33505,33506],{"class":3966},"'Не вдалося створити нотатку'",[3946,33508,4337],{"class":3952},[3946,33510,33511,33513,33515],{"class":3948,"line":7609},[3946,33512,7115],{"class":3952},[3946,33514,12029],{"class":4251},[3946,33516,4427],{"class":3952},[3946,33518,33519,33521,33523,33525],{"class":3948,"line":7615},[3946,33520,28685],{"class":4224},[3946,33522,4331],{"class":3952},[3946,33524,13575],{"class":4255},[3946,33526,4337],{"class":3952},[3946,33528,33529],{"class":3948,"line":7633},[3946,33530,5550],{"class":3952},[3946,33532,33533],{"class":3948,"line":7638},[3946,33534,15539],{"class":3952},[3946,33536,33537],{"class":3948,"line":7644},[3946,33538,4278],{"emptyLinePlaceholder":4277},[3946,33540,33541,33543],{"class":3948,"line":7677},[3946,33542,5062],{"class":4251},[3946,33544,13079],{"class":3952},[3946,33546,33547,33549],{"class":3948,"line":7682},[3946,33548,13158],{"class":3952},[3946,33550,23663],{"class":4262},[3946,33552,33553,33555,33557,33559],{"class":3948,"line":7694},[3946,33554,21472],{"class":4262},[3946,33556,13092],{"class":3952},[3946,33558,15105],{"class":4262},[3946,33560,4040],{"class":3952},[3946,33562,33563,33565,33567,33569,33571,33573,33575,33577,33579,33581],{"class":3948,"line":7710},[3946,33564,23678],{"class":4262},[3946,33566,23681],{"class":3952},[3946,33568,23684],{"class":4286},[3946,33570,8816],{"class":3952},[3946,33572,23689],{"class":3966},[3946,33574,11523],{"class":3952},[3946,33576,23694],{"class":3966},[3946,33578,11532],{"class":3952},[3946,33580,23699],{"class":3966},[3946,33582,4040],{"class":3952},[3946,33584,33585],{"class":3948,"line":7715},[3946,33586,13602],{"class":3952},[3946,33588,33589,33591,33593],{"class":3948,"line":7720},[3946,33590,13167],{"class":3952},[3946,33592,23747],{"class":4342},[3946,33594,4040],{"class":3952},[3946,33596,33597,33599,33601,33603,33605,33607],{"class":3948,"line":7729},[3946,33598,13084],{"class":3952},[3946,33600,12926],{"class":4262},[3946,33602,13089],{"class":4262},[3946,33604,13092],{"class":3952},[3946,33606,23762],{"class":4262},[3946,33608,13098],{"class":3952},[3946,33610,33611,33613],{"class":3948,"line":7734},[3946,33612,13103],{"class":3952},[3946,33614,15436],{"class":4262},[3946,33616,33617,33619,33621,33623],{"class":3948,"line":7739},[3946,33618,21557],{"class":4262},[3946,33620,13092],{"class":3952},[3946,33622,31850],{"class":4262},[3946,33624,4040],{"class":3952},[3946,33626,33627,33629],{"class":3948,"line":7744},[3946,33628,28996],{"class":4262},[3946,33630,15455],{"class":3952},[3946,33632,33633],{"class":3948,"line":7750},[3946,33634,21593],{"class":3952},[3946,33636,33637,33639,33641,33643,33645,33648,33650,33652,33655,33657,33659,33661,33663],{"class":3948,"line":7755},[3946,33638,15112],{"class":3952},[3946,33640,13775],{"class":4262},[3946,33642,13616],{"class":4262},[3946,33644,13111],{"class":3952},[3946,33646,33647],{"class":3966},"\"close\"",[3946,33649,13108],{"class":4262},[3946,33651,12602],{"class":3952},[3946,33653,33654],{"class":4020},"28",[3946,33656,5928],{"class":3952},[3946,33658,14080],{"class":4262},[3946,33660,13111],{"class":3952},[3946,33662,13122],{"class":3966},[3946,33664,13125],{"class":3952},[3946,33666,33667,33669,33671],{"class":3948,"line":7765},[3946,33668,15256],{"class":3952},[3946,33670,14771],{"class":4262},[3946,33672,13135],{"class":3952},[3946,33674,33675],{"class":3948,"line":7777},[3946,33676,8635],{"class":3952},[3946,33678,33679,33681,33683,33685,33687,33689,33691,33694,33697,33699,33701],{"class":3948,"line":7786},[3946,33680,13103],{"class":3952},[3946,33682,14762],{"class":4262},[3946,33684,13089],{"class":4262},[3946,33686,13092],{"class":3952},[3946,33688,29847],{"class":4262},[3946,33690,15124],{"class":3952},[3946,33692,33693],{"class":4262},"Нова",[3946,33695,33696],{"class":4262}," Нотатка",[3946,33698,15133],{"class":3952},[3946,33700,14762],{"class":4262},[3946,33702,13135],{"class":3952},[3946,33704,33705],{"class":3948,"line":7799},[3946,33706,8635],{"class":3952},[3946,33708,33709,33711,33713,33715,33717,33719],{"class":3948,"line":7818},[3946,33710,13103],{"class":3952},[3946,33712,12926],{"class":4262},[3946,33714,13089],{"class":4262},[3946,33716,13092],{"class":3952},[3946,33718,31850],{"class":4262},[3946,33720,13631],{"class":3952},[3946,33722,33723,33725,33727],{"class":3948,"line":7823},[3946,33724,13130],{"class":3952},[3946,33726,12926],{"class":4262},[3946,33728,13135],{"class":3952},[3946,33730,33731],{"class":3948,"line":7834},[3946,33732,4278],{"emptyLinePlaceholder":4277},[3946,33734,33735,33737],{"class":3948,"line":7850},[3946,33736,13084],{"class":3952},[3946,33738,23712],{"class":4262},[3946,33740,33741,33743,33745,33747],{"class":3948,"line":7855},[3946,33742,29480],{"class":4262},[3946,33744,13092],{"class":3952},[3946,33746,21027],{"class":4262},[3946,33748,4040],{"class":3952},[3946,33750,33751,33753,33755,33757],{"class":3948,"line":7860},[3946,33752,23717],{"class":4262},[3946,33754,13092],{"class":3952},[3946,33756,32033],{"class":4262},[3946,33758,4040],{"class":3952},[3946,33760,33761,33763,33765],{"class":3948,"line":7891},[3946,33762,23729],{"class":4262},[3946,33764,13111],{"class":3952},[3946,33766,23734],{"class":3966},[3946,33768,33769],{"class":3948,"line":7896},[3946,33770,23739],{"class":3952},[3946,33772,33773,33775],{"class":3948,"line":7901},[3946,33774,13103],{"class":3952},[3946,33776,23877],{"class":4262},[3946,33778,33779,33782,33784],{"class":3948,"line":7906},[3946,33780,33781],{"class":4262},"          label",[3946,33783,13111],{"class":3952},[3946,33785,33786],{"class":3966},"\"Заголовок\"\n",[3946,33788,33789,33792,33794],{"class":3948,"line":7912},[3946,33790,33791],{"class":4262},"          placeholder",[3946,33793,13111],{"class":3952},[3946,33795,33796],{"class":3966},"\"Введіть заголовок нотатки\"\n",[3946,33798,33799,33802,33804,33806],{"class":3948,"line":7917},[3946,33800,33801],{"class":4262},"          value",[3946,33803,12602],{"class":3952},[3946,33805,15121],{"class":4262},[3946,33807,4040],{"class":3952},[3946,33809,33810,33813,33815,33817],{"class":3948,"line":7935},[3946,33811,33812],{"class":4262},"          onChangeText",[3946,33814,12602],{"class":3952},[3946,33816,32940],{"class":4262},[3946,33818,4040],{"class":3952},[3946,33820,33821,33823,33826,33828],{"class":3948,"line":7942},[3946,33822,11516],{"class":4262},[3946,33824,33825],{"class":3952},"={errors.",[3946,33827,15121],{"class":4262},[3946,33829,4040],{"class":3952},[3946,33831,33832,33835,33837,33839],{"class":3948,"line":7963},[3946,33833,33834],{"class":4262},"          editable",[3946,33836,23969],{"class":3952},[3946,33838,13046],{"class":4262},[3946,33840,4040],{"class":3952},[3946,33842,33843],{"class":3948,"line":7979},[3946,33844,22229],{"class":3952},[3946,33846,33847],{"class":3948,"line":7992},[3946,33848,4278],{"emptyLinePlaceholder":4277},[3946,33850,33851,33853,33855,33857,33859,33862],{"class":3948,"line":8012},[3946,33852,13103],{"class":3952},[3946,33854,12926],{"class":4262},[3946,33856,13089],{"class":4262},[3946,33858,13092],{"class":3952},[3946,33860,33861],{"class":4262},"textAreaContainer",[3946,33863,13098],{"class":3952},[3946,33865,33866,33868,33870,33872,33874,33876,33878,33881,33883,33885],{"class":3948,"line":8018},[3946,33867,15112],{"class":3952},[3946,33869,14762],{"class":4262},[3946,33871,13089],{"class":4262},[3946,33873,13092],{"class":3952},[3946,33875,22119],{"class":4262},[3946,33877,15124],{"class":3952},[3946,33879,33880],{"class":4262},"Вміст",[3946,33882,15133],{"class":3952},[3946,33884,14762],{"class":4262},[3946,33886,13135],{"class":3952},[3946,33888,33889,33891],{"class":3948,"line":8023},[3946,33890,15112],{"class":3952},[3946,33892,22167],{"class":4262},[3946,33894,33895,33897,33899,33902,33904],{"class":3948,"line":8028},[3946,33896,15441],{"class":4262},[3946,33898,12602],{"class":3952},[3946,33900,33901],{"class":4262},"[styles.textArea, errors.content ",[3946,33903,21501],{"class":3952},[3946,33905,33906],{"class":4262}," styles.textAreaError]}\n",[3946,33908,33909],{"class":3948,"line":8033},[3946,33910,33911],{"class":4262},"            placeholder=\"Введіть вміст нотатки...\"\n",[3946,33913,33914],{"class":3948,"line":8038},[3946,33915,33916],{"class":4262},"            value={content}\n",[3946,33918,33919],{"class":3948,"line":8044},[3946,33920,33921],{"class":4262},"            onChangeText={setContent}\n",[3946,33923,33924],{"class":3948,"line":8049},[3946,33925,33926],{"class":4262},"            multiline\n",[3946,33928,33929],{"class":3948,"line":8071},[3946,33930,33931],{"class":4262},"            numberOfLines={10}\n",[3946,33933,33934],{"class":3948,"line":8090},[3946,33935,33936],{"class":4262},"            textAlignVertical=\"top\"\n",[3946,33938,33939],{"class":3948,"line":8095},[3946,33940,33941],{"class":4262},"            editable={!isLoading}\n",[3946,33943,33944],{"class":3948,"line":8112},[3946,33945,33946],{"class":4262},"            placeholderTextColor=\"#999999\"\n",[3946,33948,33949],{"class":3948,"line":8117},[3946,33950,23978],{"class":4262},[3946,33952,33953],{"class":3948,"line":8160},[3946,33954,33955],{"class":4262},"          {errors.content && (\n",[3946,33957,33958],{"class":3948,"line":8185},[3946,33959,33960],{"class":4262},"            \u003CText style={styles.errorText}>{errors.content}\u003C\u002FText>\n",[3946,33962,33963],{"class":3948,"line":8190},[3946,33964,33965],{"class":4262},"          )}\n",[3946,33967,33968],{"class":3948,"line":8195},[3946,33969,33970],{"class":4262},"        \u003C\u002FView>\n",[3946,33972,33973],{"class":3948,"line":8200},[3946,33974,4278],{"emptyLinePlaceholder":4277},[3946,33976,33977],{"class":3948,"line":8206},[3946,33978,33979],{"class":4262},"        \u003CButton\n",[3946,33981,33982],{"class":3948,"line":9571},[3946,33983,33984],{"class":4262},"          title=\"Створити нотатку\"\n",[3946,33986,33987],{"class":3948,"line":9589},[3946,33988,33989],{"class":4262},"          onPress={handleCreate}\n",[3946,33991,33992],{"class":3948,"line":9596},[3946,33993,33994],{"class":4262},"          loading={isLoading}\n",[3946,33996,33997],{"class":3948,"line":9618},[3946,33998,22229],{"class":4262},[3946,34000,34001],{"class":3948,"line":9627},[3946,34002,34003],{"class":4262},"      \u003C\u002FScrollView>\n",[3946,34005,34006],{"class":3948,"line":9636},[3946,34007,34008],{"class":4262},"    \u003C\u002FKeyboardAvoidingView>\n",[3946,34010,34011],{"class":3948,"line":9645},[3946,34012,10875],{"class":4262},[3946,34014,34015],{"class":3948,"line":9650},[3946,34016,4040],{"class":4262},[3946,34018,34019],{"class":3948,"line":9655},[3946,34020,4278],{"emptyLinePlaceholder":4277},[3946,34022,34023],{"class":3948,"line":9660},[3946,34024,21630],{"class":4262},[3946,34026,34027,34029],{"class":3948,"line":9665},[3946,34028,15568],{"class":4262},[3946,34030,4427],{"class":3952},[3946,34032,34033,34035,34037],{"class":3948,"line":9671},[3946,34034,13232],{"class":4262},[3946,34036,13235],{"class":4020},[3946,34038,3970],{"class":3952},[3946,34040,34041,34043,34045],{"class":3948,"line":9676},[3946,34042,13261],{"class":4262},[3946,34044,13264],{"class":3966},[3946,34046,3970],{"class":3952},[3946,34048,34049],{"class":3948,"line":9700},[3946,34050,13271],{"class":3952},[3946,34052,34053,34055],{"class":3948,"line":9721},[3946,34054,24431],{"class":4262},[3946,34056,4427],{"class":3952},[3946,34058,34059,34061,34063],{"class":3948,"line":9756},[3946,34060,30109],{"class":4262},[3946,34062,30112],{"class":3966},[3946,34064,3970],{"class":3952},[3946,34066,34067,34069,34071],{"class":3948,"line":9778},[3946,34068,13242],{"class":4262},[3946,34070,30121],{"class":3966},[3946,34072,3970],{"class":3952},[3946,34074,34075,34077,34079],{"class":3948,"line":9783},[3946,34076,13252],{"class":4262},[3946,34078,13245],{"class":3966},[3946,34080,3970],{"class":3952},[3946,34082,34083,34085,34087],{"class":3948,"line":9789},[3946,34084,15734],{"class":4262},[3946,34086,15681],{"class":4020},[3946,34088,3970],{"class":3952},[3946,34090,34091,34093,34095],{"class":3948,"line":9801},[3946,34092,15743],{"class":4262},[3946,34094,15661],{"class":4020},[3946,34096,3970],{"class":3952},[3946,34098,34099,34101,34103],{"class":3948,"line":9813},[3946,34100,30160],{"class":4262},[3946,34102,13235],{"class":4020},[3946,34104,3970],{"class":3952},[3946,34106,34107,34109,34111],{"class":3948,"line":9830},[3946,34108,30169],{"class":4262},[3946,34110,30172],{"class":3966},[3946,34112,3970],{"class":3952},[3946,34114,34115],{"class":3948,"line":9840},[3946,34116,13271],{"class":3952},[3946,34118,34119,34121],{"class":3948,"line":9856},[3946,34120,32378],{"class":4262},[3946,34122,4427],{"class":3952},[3946,34124,34125,34127,34129],{"class":3948,"line":9866},[3946,34126,30226],{"class":4262},[3946,34128,24440],{"class":4020},[3946,34130,3970],{"class":3952},[3946,34132,34133,34135,34137],{"class":3948,"line":9882},[3946,34134,30235],{"class":4262},[3946,34136,24440],{"class":4020},[3946,34138,3970],{"class":3952},[3946,34140,34141,34143,34145],{"class":3948,"line":9892},[3946,34142,13242],{"class":4262},[3946,34144,13245],{"class":3966},[3946,34146,3970],{"class":3952},[3946,34148,34149,34151,34153],{"class":3948,"line":9908},[3946,34150,13252],{"class":4262},[3946,34152,13245],{"class":3966},[3946,34154,3970],{"class":3952},[3946,34156,34157],{"class":3948,"line":9918},[3946,34158,13271],{"class":3952},[3946,34160,34161,34163],{"class":3948,"line":9934},[3946,34162,30183],{"class":4262},[3946,34164,4427],{"class":3952},[3946,34166,34167,34169,34171],{"class":3948,"line":9944},[3946,34168,15628],{"class":4262},[3946,34170,30467],{"class":4020},[3946,34172,3970],{"class":3952},[3946,34174,34175,34177,34179],{"class":3948,"line":9960},[3946,34176,15638],{"class":4262},[3946,34178,15791],{"class":3966},[3946,34180,3970],{"class":3952},[3946,34182,34183,34185,34187],{"class":3948,"line":9970},[3946,34184,15648],{"class":4262},[3946,34186,15651],{"class":3966},[3946,34188,3970],{"class":3952},[3946,34190,34191],{"class":3948,"line":9986},[3946,34192,13271],{"class":3952},[3946,34194,34195,34197],{"class":3948,"line":9994},[3946,34196,32455],{"class":4262},[3946,34198,4427],{"class":3952},[3946,34200,34201,34203,34205],{"class":3948,"line":10014},[3946,34202,13232],{"class":4262},[3946,34204,13235],{"class":4020},[3946,34206,3970],{"class":3952},[3946,34208,34209],{"class":3948,"line":10019},[3946,34210,13271],{"class":3952},[3946,34212,34213,34215],{"class":3948,"line":10024},[3946,34214,32474],{"class":4262},[3946,34216,4427],{"class":3952},[3946,34218,34219,34221,34223],{"class":3948,"line":10029},[3946,34220,15599],{"class":4262},[3946,34222,15602],{"class":4020},[3946,34224,3970],{"class":3952},[3946,34226,34227],{"class":3948,"line":10044},[3946,34228,13271],{"class":3952},[3946,34230,34231,34234],{"class":3948,"line":10053},[3946,34232,34233],{"class":4262},"  textAreaContainer:",[3946,34235,4427],{"class":3952},[3946,34237,34238,34240,34242],{"class":3948,"line":10058},[3946,34239,15658],{"class":4262},[3946,34241,15681],{"class":4020},[3946,34243,3970],{"class":3952},[3946,34245,34246],{"class":3948,"line":10063},[3946,34247,13271],{"class":3952},[3946,34249,34250,34252],{"class":3948,"line":10079},[3946,34251,22415],{"class":4262},[3946,34253,4427],{"class":3952},[3946,34255,34256,34258,34260],{"class":3948,"line":10084},[3946,34257,15628],{"class":4262},[3946,34259,21643],{"class":4020},[3946,34261,3970],{"class":3952},[3946,34263,34264,34266,34268],{"class":3948,"line":10089},[3946,34265,15638],{"class":4262},[3946,34267,15791],{"class":3966},[3946,34269,3970],{"class":3952},[3946,34271,34272,34274,34276],{"class":3948,"line":10094},[3946,34273,15648],{"class":4262},[3946,34275,15651],{"class":3966},[3946,34277,3970],{"class":3952},[3946,34279,34280,34282,34284],{"class":3948,"line":10099},[3946,34281,15658],{"class":4262},[3946,34283,15755],{"class":4020},[3946,34285,3970],{"class":3952},[3946,34287,34288],{"class":3948,"line":11862},[3946,34289,13271],{"class":3952},[3946,34291,34292,34295],{"class":3948,"line":11871},[3946,34293,34294],{"class":4262},"  textArea:",[3946,34296,4427],{"class":3952},[3946,34298,34299,34301,34303],{"class":3948,"line":11876},[3946,34300,13261],{"class":4262},[3946,34302,22488],{"class":3966},[3946,34304,3970],{"class":3952},[3946,34306,34307,34309,34311],{"class":3948,"line":11881},[3946,34308,15752],{"class":4262},[3946,34310,15661],{"class":4020},[3946,34312,3970],{"class":3952},[3946,34314,34315,34317,34319],{"class":3948,"line":11894},[3946,34316,15599],{"class":4262},[3946,34318,15681],{"class":4020},[3946,34320,3970],{"class":3952},[3946,34322,34323,34325,34327],{"class":3948,"line":11899},[3946,34324,15628],{"class":4262},[3946,34326,15681],{"class":4020},[3946,34328,3970],{"class":3952},[3946,34330,34331,34333,34335],{"class":3948,"line":11904},[3946,34332,15648],{"class":4262},[3946,34334,15651],{"class":3966},[3946,34336,3970],{"class":3952},[3946,34338,34339,34341,34344],{"class":3948,"line":11909},[3946,34340,21682],{"class":4262},[3946,34342,34343],{"class":4020}," 200",[3946,34345,3970],{"class":3952},[3946,34347,34348,34350,34352],{"class":3948,"line":11915},[3946,34349,21751],{"class":4262},[3946,34351,13235],{"class":4020},[3946,34353,3970],{"class":3952},[3946,34355,34356,34358,34360],{"class":3948,"line":11920},[3946,34357,21761],{"class":4262},[3946,34359,21744],{"class":3966},[3946,34361,3970],{"class":3952},[3946,34363,34364],{"class":3948,"line":11941},[3946,34365,13271],{"class":3952},[3946,34367,34368,34371],{"class":3948,"line":11948},[3946,34369,34370],{"class":4262},"  textAreaError:",[3946,34372,4427],{"class":3952},[3946,34374,34375,34377,34379],{"class":3948,"line":11961},[3946,34376,21761],{"class":4262},[3946,34378,18618],{"class":3966},[3946,34380,3970],{"class":3952},[3946,34382,34383],{"class":3948,"line":11966},[3946,34384,13271],{"class":3952},[3946,34386,34387,34389],{"class":3948,"line":11972},[3946,34388,22632],{"class":4262},[3946,34390,4427],{"class":3952},[3946,34392,34393,34395,34397],{"class":3948,"line":11986},[3946,34394,15628],{"class":4262},[3946,34396,15661],{"class":4020},[3946,34398,3970],{"class":3952},[3946,34400,34401,34403,34405],{"class":3948,"line":11999},[3946,34402,15648],{"class":4262},[3946,34404,18618],{"class":3966},[3946,34406,3970],{"class":3952},[3946,34408,34409,34411,34413],{"class":3948,"line":12018},[3946,34410,22655],{"class":4262},[3946,34412,22658],{"class":4020},[3946,34414,3970],{"class":3952},[3946,34416,34417],{"class":3948,"line":12024},[3946,34418,13271],{"class":3952},[3946,34420,34421],{"class":3948,"line":12034},[3946,34422,13276],{"class":3952},[3750,34424,34426],{"id":34425},"_711-profile-screen-з-logout","7.11. Profile Screen з Logout",[3857,34428,34430],{"className":4242,"code":34429,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FProfileScreen.tsx\n\nimport React from 'react';\nimport {\n  View,\n  Text,\n  StyleSheet,\n  ScrollView,\n  TouchableOpacity,\n  Alert,\n} from 'react-native';\nimport { Ionicons } from '@expo\u002Fvector-icons';\nimport { useAuth } from '..\u002Fcontext\u002FAuthContext';\n\nexport function ProfileScreen() {\n  const { user, logout, isLoading } = useAuth();\n\n  \u002F**\n   * Обробка виходу\n   *\u002F\n  const handleLogout = () => {\n    Alert.alert(\n      'Вийти з акаунту?',\n      'Ви впевнені, що хочете вийти?',\n      [\n        { text: 'Скасувати', style: 'cancel' },\n        {\n          text: 'Вийти',\n          style: 'destructive',\n          onPress: async () => {\n            try {\n              await logout();\n            } catch (error) {\n              Alert.alert('Помилка', 'Не вдалося вийти з акаунту');\n            }\n          },\n        },\n      ]\n    );\n  };\n\n  if (!user) {\n    return (\n      \u003CView style={styles.centerContainer}>\n        \u003CText>Завантаження...\u003C\u002FText>\n      \u003C\u002FView>\n    );\n  }\n\n  return (\n    \u003CScrollView style={styles.container} contentContainerStyle={styles.content}>\n      {\u002F* Header *\u002F}\n      \u003CView style={styles.header}>\n        \u003CView style={styles.avatarContainer}>\n          \u003CText style={styles.avatarText}>\n            {user.name.charAt(0).toUpperCase()}\n          \u003C\u002FText>\n        \u003C\u002FView>\n        \n        \u003CText style={styles.name}>{user.name}\u003C\u002FText>\n        \u003CText style={styles.email}>{user.email}\u003C\u002FText>\n        \u003CView style={styles.roleBadge}>\n          \u003CText style={styles.roleText}>{user.role}\u003C\u002FText>\n        \u003C\u002FView>\n      \u003C\u002FView>\n\n      {\u002F* Menu Items *\u002F}\n      \u003CView style={styles.section}>\n        \u003CText style={styles.sectionTitle}>Налаштування акаунту\u003C\u002FText>\n        \n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"person-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Редагувати профіль\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n\n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"lock-closed-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Змінити пароль\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n\n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"shield-checkmark-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Безпека\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n      \u003C\u002FView>\n\n      \u003CView style={styles.section}>\n        \u003CText style={styles.sectionTitle}>Додаток\u003C\u002FText>\n        \n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"notifications-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Сповіщення\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n\n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"help-circle-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Допомога\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n\n        \u003CTouchableOpacity style={styles.menuItem}>\n          \u003CIonicons name=\"information-circle-outline\" size={24} color=\"#666666\" \u002F>\n          \u003CText style={styles.menuItemText}>Про додаток\u003C\u002FText>\n          \u003CIonicons name=\"chevron-forward\" size={20} color=\"#CCCCCC\" \u002F>\n        \u003C\u002FTouchableOpacity>\n      \u003C\u002FView>\n\n      {\u002F* Logout Button *\u002F}\n      \u003CTouchableOpacity\n        style={styles.logoutButton}\n        onPress={handleLogout}\n        disabled={isLoading}\n      >\n        \u003CIonicons name=\"log-out-outline\" size={24} color=\"#FF3B30\" \u002F>\n        \u003CText style={styles.logoutText}>Вийти з акаунту\u003C\u002FText>\n      \u003C\u002FTouchableOpacity>\n\n      \u003CText style={styles.version}>Версія 1.0.0\u003C\u002FText>\n    \u003C\u002FScrollView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: '#F5F5F5',\n  },\n  centerContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  content: {\n    paddingBottom: 40,\n  },\n  header: {\n    backgroundColor: '#FFFFFF',\n    alignItems: 'center',\n    paddingVertical: 32,\n    marginBottom: 20,\n  },\n  avatarContainer: {\n    width: 80,\n    height: 80,\n    borderRadius: 40,\n    backgroundColor: '#007AFF',\n    justifyContent: 'center',\n    alignItems: 'center',\n    marginBottom: 16,\n  },\n  avatarText: {\n    fontSize: 32,\n    fontWeight: 'bold',\n    color: '#FFFFFF',\n  },\n  name: {\n    fontSize: 24,\n    fontWeight: 'bold',\n    color: '#000000',\n    marginBottom: 4,\n  },\n  email: {\n    fontSize: 14,\n    color: '#666666',\n    marginBottom: 12,\n  },\n  roleBadge: {\n    backgroundColor: '#E3F2FD',\n    paddingHorizontal: 12,\n    paddingVertical: 4,\n    borderRadius: 12,\n  },\n  roleText: {\n    fontSize: 12,\n    fontWeight: '600',\n    color: '#007AFF',\n    textTransform: 'uppercase',\n  },\n  section: {\n    backgroundColor: '#FFFFFF',\n    marginBottom: 20,\n    paddingHorizontal: 16,\n  },\n  sectionTitle: {\n    fontSize: 12,\n    fontWeight: '600',\n    color: '#999999',\n    textTransform: 'uppercase',\n    marginTop: 16,\n    marginBottom: 8,\n    paddingHorizontal: 4,\n  },\n  menuItem: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    paddingVertical: 16,\n    borderBottomWidth: 1,\n    borderBottomColor: '#F5F5F5',\n  },\n  menuItemText: {\n    flex: 1,\n    fontSize: 16,\n    color: '#000000',\n    marginLeft: 16,\n  },\n  logoutButton: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    backgroundColor: '#FFFFFF',\n    marginHorizontal: 16,\n    marginTop: 20,\n    paddingVertical: 16,\n    borderRadius: 12,\n    borderWidth: 1,\n    borderColor: '#FF3B30',\n  },\n  logoutText: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: '#FF3B30',\n    marginLeft: 8,\n  },\n  version: {\n    fontSize: 12,\n    color: '#999999',\n    textAlign: 'center',\n    marginTop: 20,\n  },\n});\n",[3782,34431,34432,34437,34441,34453,34459,34465,34471,34477,34483,34489,34495,34505,34521,34537,34541,34552,34574,34578,34582,34587,34591,34604,34614,34621,34628,34632,34648,34652,34661,34669,34683,34689,34697,34709,34728,34732,34736,34740,34744,34748,34752,34756,34766,34772,34786,34802,34810,34814,34818,34822,34828,34850,34858,34872,34887,34902,34926,34934,34942,34946,34969,34991,35006,35029,35037,35045,35049,35058,35073,35100,35104,35119,35149,35176,35205,35213,35217,35231,35260,35286,35314,35322,35326,35340,35369,35392,35420,35428,35436,35440,35454,35477,35481,35495,35524,35547,35575,35583,35587,35601,35630,35653,35681,35689,35693,35707,35736,35762,35790,35798,35806,35810,35819,35825,35836,35847,35858,35862,35891,35920,35928,35932,35963,35971,35975,35979,35983,35999,36005,36013,36021,36025,36031,36039,36047,36055,36059,36065,36073,36077,36083,36091,36099,36107,36115,36119,36126,36135,36143,36151,36159,36167,36175,36183,36187,36194,36202,36210,36218,36222,36229,36237,36245,36253,36261,36265,36272,36280,36288,36296,36300,36307,36315,36323,36331,36339,36343,36350,36358,36366,36374,36384,36388,36395,36403,36411,36419,36423,36430,36438,36446,36454,36462,36470,36478,36486,36490,36497,36505,36513,36521,36529,36537,36541,36548,36556,36564,36572,36580,36584,36591,36599,36607,36615,36623,36632,36640,36648,36656,36664,36672,36676,36683,36691,36699,36707,36715,36719,36726,36734,36742,36750,36758,36762],{"__ignoreMap":3865},[3946,34433,34434],{"class":3948,"line":3949},[3946,34435,34436],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FProfileScreen.tsx\n",[3946,34438,34439],{"class":3948,"line":3956},[3946,34440,4278],{"emptyLinePlaceholder":4277},[3946,34442,34443,34445,34447,34449,34451],{"class":3948,"line":3973},[3946,34444,4252],{"class":4251},[3946,34446,10244],{"class":4262},[3946,34448,4266],{"class":4251},[3946,34450,10304],{"class":3966},[3946,34452,4272],{"class":3952},[3946,34454,34455,34457],{"class":3948,"line":3986},[3946,34456,4252],{"class":4251},[3946,34458,4427],{"class":3952},[3946,34460,34461,34463],{"class":3948,"line":3999},[3946,34462,21895],{"class":4262},[3946,34464,3970],{"class":3952},[3946,34466,34467,34469],{"class":3948,"line":4012},[3946,34468,21283],{"class":4262},[3946,34470,3970],{"class":3952},[3946,34472,34473,34475],{"class":3948,"line":4026},[3946,34474,21290],{"class":4262},[3946,34476,3970],{"class":3952},[3946,34478,34479,34481],{"class":3948,"line":4037},[3946,34480,22747],{"class":4262},[3946,34482,3970],{"class":3952},[3946,34484,34485,34487],{"class":3948,"line":4487},[3946,34486,21276],{"class":4262},[3946,34488,3970],{"class":3952},[3946,34490,34491,34493],{"class":3948,"line":4507},[3946,34492,22754],{"class":4262},[3946,34494,3970],{"class":3952},[3946,34496,34497,34499,34501,34503],{"class":3948,"line":4518},[3946,34498,5928],{"class":3952},[3946,34500,6826],{"class":4251},[3946,34502,12943],{"class":3966},[3946,34504,4272],{"class":3952},[3946,34506,34507,34509,34511,34513,34515,34517,34519],{"class":3948,"line":4524},[3946,34508,4252],{"class":4251},[3946,34510,6817],{"class":3952},[3946,34512,13775],{"class":4262},[3946,34514,6823],{"class":3952},[3946,34516,6826],{"class":4251},[3946,34518,13782],{"class":3966},[3946,34520,4272],{"class":3952},[3946,34522,34523,34525,34527,34529,34531,34533,34535],{"class":3948,"line":4529},[3946,34524,4252],{"class":4251},[3946,34526,6817],{"class":3952},[3946,34528,12954],{"class":4262},[3946,34530,6823],{"class":3952},[3946,34532,6826],{"class":4251},[3946,34534,14794],{"class":3966},[3946,34536,4272],{"class":3952},[3946,34538,34539],{"class":3948,"line":4534},[3946,34540,4278],{"emptyLinePlaceholder":4277},[3946,34542,34543,34545,34547,34550],{"class":3948,"line":4540},[3946,34544,6030],{"class":4251},[3946,34546,4390],{"class":4255},[3946,34548,34549],{"class":4224}," ProfileScreen",[3946,34551,8490],{"class":3952},[3946,34553,34554,34556,34558,34560,34562,34564,34566,34568,34570,34572],{"class":3948,"line":4567},[3946,34555,5018],{"class":4255},[3946,34557,6817],{"class":3952},[3946,34559,10775],{"class":4286},[3946,34561,4447],{"class":3952},[3946,34563,11981],{"class":4286},[3946,34565,4447],{"class":3952},[3946,34567,13046],{"class":4286},[3946,34569,13049],{"class":3952},[3946,34571,12954],{"class":4224},[3946,34573,4304],{"class":3952},[3946,34575,34576],{"class":3948,"line":4574},[3946,34577,4278],{"emptyLinePlaceholder":4277},[3946,34579,34580],{"class":3948,"line":4600},[3946,34581,6908],{"class":4342},[3946,34583,34584],{"class":3948,"line":4610},[3946,34585,34586],{"class":4342},"   * Обробка виходу\n",[3946,34588,34589],{"class":3948,"line":4623},[3946,34590,6918],{"class":4342},[3946,34592,34593,34595,34598,34600,34602],{"class":3948,"line":4643},[3946,34594,5018],{"class":4255},[3946,34596,34597],{"class":4224}," handleLogout",[3946,34599,18252],{"class":3952},[3946,34601,6453],{"class":4255},[3946,34603,4427],{"class":3952},[3946,34605,34606,34608,34610,34612],{"class":3948,"line":4653},[3946,34607,28909],{"class":4262},[3946,34609,4298],{"class":3952},[3946,34611,23542],{"class":4224},[3946,34613,6594],{"class":3952},[3946,34615,34616,34619],{"class":3948,"line":4658},[3946,34617,34618],{"class":3966},"      'Вийти з акаунту?'",[3946,34620,3970],{"class":3952},[3946,34622,34623,34626],{"class":3948,"line":4663},[3946,34624,34625],{"class":3966},"      'Ви впевнені, що хочете вийти?'",[3946,34627,3970],{"class":3952},[3946,34629,34630],{"class":3948,"line":4668},[3946,34631,28947],{"class":3952},[3946,34633,34634,34636,34638,34640,34642,34644,34646],{"class":3948,"line":4674},[3946,34635,9369],{"class":3952},[3946,34637,23571],{"class":4262},[3946,34639,28956],{"class":3966},[3946,34641,4447],{"class":3952},[3946,34643,28961],{"class":4262},[3946,34645,28964],{"class":3966},[3946,34647,19998],{"class":3952},[3946,34649,34650],{"class":3948,"line":4694},[3946,34651,28971],{"class":3952},[3946,34653,34654,34656,34659],{"class":3948,"line":4701},[3946,34655,28976],{"class":4262},[3946,34657,34658],{"class":3966}," 'Вийти'",[3946,34660,3970],{"class":3952},[3946,34662,34663,34665,34667],{"class":3948,"line":4719},[3946,34664,28986],{"class":4262},[3946,34666,28989],{"class":3966},[3946,34668,3970],{"class":3952},[3946,34670,34671,34673,34675,34677,34679,34681],{"class":3948,"line":4735},[3946,34672,28996],{"class":4224},[3946,34674,8545],{"class":4262},[3946,34676,29001],{"class":4255},[3946,34678,11004],{"class":3952},[3946,34680,6453],{"class":4255},[3946,34682,4427],{"class":3952},[3946,34684,34685,34687],{"class":3948,"line":4748},[3946,34686,29012],{"class":4251},[3946,34688,4427],{"class":3952},[3946,34690,34691,34693,34695],{"class":3948,"line":4768},[3946,34692,29019],{"class":4251},[3946,34694,9202],{"class":4224},[3946,34696,4304],{"class":3952},[3946,34698,34699,34701,34703,34705,34707],{"class":3948,"line":4777},[3946,34700,29109],{"class":3952},[3946,34702,4476],{"class":4251},[3946,34704,4479],{"class":3952},[3946,34706,4482],{"class":4262},[3946,34708,4318],{"class":3952},[3946,34710,34711,34713,34715,34717,34719,34721,34723,34726],{"class":3948,"line":4782},[3946,34712,29088],{"class":4262},[3946,34714,4298],{"class":3952},[3946,34716,23542],{"class":4224},[3946,34718,4331],{"class":3952},[3946,34720,29130],{"class":3966},[3946,34722,4447],{"class":3952},[3946,34724,34725],{"class":3966},"'Не вдалося вийти з акаунту'",[3946,34727,4337],{"class":3952},[3946,34729,34730],{"class":3948,"line":6262},[3946,34731,29142],{"class":3952},[3946,34733,34734],{"class":3948,"line":6273},[3946,34735,29147],{"class":3952},[3946,34737,34738],{"class":3948,"line":6284},[3946,34739,14311],{"class":3952},[3946,34741,34742],{"class":3948,"line":6299},[3946,34743,29156],{"class":3952},[3946,34745,34746],{"class":3948,"line":6304},[3946,34747,8731],{"class":3952},[3946,34749,34750],{"class":3948,"line":6309},[3946,34751,15539],{"class":3952},[3946,34753,34754],{"class":3948,"line":6314},[3946,34755,4278],{"emptyLinePlaceholder":4277},[3946,34757,34758,34760,34762,34764],{"class":3948,"line":6320},[3946,34759,5776],{"class":4251},[3946,34761,4312],{"class":3952},[3946,34763,10775],{"class":4262},[3946,34765,4318],{"class":3952},[3946,34767,34768,34770],{"class":3948,"line":6325},[3946,34769,4603],{"class":4251},[3946,34771,13079],{"class":3952},[3946,34773,34774,34776,34778,34780,34782,34784],{"class":3948,"line":6337},[3946,34775,13084],{"class":3952},[3946,34777,12926],{"class":4262},[3946,34779,13089],{"class":4262},[3946,34781,13092],{"class":3952},[3946,34783,29754],{"class":4262},[3946,34785,13098],{"class":3952},[3946,34787,34788,34790,34792,34794,34796,34798,34800],{"class":3948,"line":6352},[3946,34789,13103],{"class":3952},[3946,34791,14762],{"class":4403},[3946,34793,16361],{"class":3952},[3946,34795,16364],{"class":4262},[3946,34797,16367],{"class":3952},[3946,34799,14762],{"class":4262},[3946,34801,13135],{"class":3952},[3946,34803,34804,34806,34808],{"class":3948,"line":6364},[3946,34805,13130],{"class":3952},[3946,34807,12926],{"class":4262},[3946,34809,13135],{"class":3952},[3946,34811,34812],{"class":3948,"line":6376},[3946,34813,8731],{"class":3952},[3946,34815,34816],{"class":3948,"line":6392},[3946,34817,4521],{"class":3952},[3946,34819,34820],{"class":3948,"line":6397},[3946,34821,4278],{"emptyLinePlaceholder":4277},[3946,34823,34824,34826],{"class":3948,"line":6402},[3946,34825,5062],{"class":4251},[3946,34827,13079],{"class":3952},[3946,34829,34830,34832,34834,34836,34838,34840,34842,34844,34846,34848],{"class":3948,"line":6407},[3946,34831,13158],{"class":3952},[3946,34833,24325],{"class":4262},[3946,34835,13089],{"class":4262},[3946,34837,13092],{"class":3952},[3946,34839,15105],{"class":4262},[3946,34841,5928],{"class":3952},[3946,34843,32028],{"class":4262},[3946,34845,13092],{"class":3952},[3946,34847,21027],{"class":4262},[3946,34849,13098],{"class":3952},[3946,34851,34852,34854,34856],{"class":3948,"line":6413},[3946,34853,13167],{"class":3952},[3946,34855,23747],{"class":4342},[3946,34857,4040],{"class":3952},[3946,34859,34860,34862,34864,34866,34868,34870],{"class":3948,"line":6418},[3946,34861,13084],{"class":3952},[3946,34863,12926],{"class":4262},[3946,34865,13089],{"class":4262},[3946,34867,13092],{"class":3952},[3946,34869,23762],{"class":4262},[3946,34871,13098],{"class":3952},[3946,34873,34874,34876,34878,34880,34882,34885],{"class":3948,"line":6434},[3946,34875,13103],{"class":3952},[3946,34877,12926],{"class":4262},[3946,34879,13089],{"class":4262},[3946,34881,13092],{"class":3952},[3946,34883,34884],{"class":4262},"avatarContainer",[3946,34886,13098],{"class":3952},[3946,34888,34889,34891,34893,34895,34897,34900],{"class":3948,"line":6466},[3946,34890,15112],{"class":3952},[3946,34892,14762],{"class":4262},[3946,34894,13089],{"class":4262},[3946,34896,13092],{"class":3952},[3946,34898,34899],{"class":4262},"avatarText",[3946,34901,13098],{"class":3952},[3946,34903,34904,34906,34908,34910,34912,34914,34917,34920,34923],{"class":3948,"line":6493},[3946,34905,15413],{"class":3952},[3946,34907,10775],{"class":4262},[3946,34909,4298],{"class":3952},[3946,34911,6679],{"class":4262},[3946,34913,4298],{"class":3952},[3946,34915,34916],{"class":4262},"charAt",[3946,34918,34919],{"class":3952},"(0).",[3946,34921,34922],{"class":4262},"toUpperCase",[3946,34924,34925],{"class":3952},"()}\n",[3946,34927,34928,34930,34932],{"class":3948,"line":6512},[3946,34929,15182],{"class":3952},[3946,34931,14762],{"class":4262},[3946,34933,13135],{"class":3952},[3946,34935,34936,34938,34940],{"class":3948,"line":6530},[3946,34937,15256],{"class":3952},[3946,34939,12926],{"class":4262},[3946,34941,13135],{"class":3952},[3946,34943,34944],{"class":3948,"line":6545},[3946,34945,8635],{"class":3952},[3946,34947,34948,34950,34952,34954,34956,34958,34961,34963,34965,34967],{"class":3948,"line":6550},[3946,34949,13103],{"class":3952},[3946,34951,14762],{"class":4262},[3946,34953,13089],{"class":4262},[3946,34955,13092],{"class":3952},[3946,34957,6679],{"class":4262},[3946,34959,34960],{"class":3952},"}>{user.",[3946,34962,6679],{"class":4262},[3946,34964,12613],{"class":3952},[3946,34966,14762],{"class":4262},[3946,34968,13135],{"class":3952},[3946,34970,34971,34973,34975,34977,34979,34981,34983,34985,34987,34989],{"class":3948,"line":6555},[3946,34972,13103],{"class":3952},[3946,34974,14762],{"class":4262},[3946,34976,13089],{"class":4262},[3946,34978,13092],{"class":3952},[3946,34980,10853],{"class":4262},[3946,34982,34960],{"class":3952},[3946,34984,10853],{"class":4262},[3946,34986,12613],{"class":3952},[3946,34988,14762],{"class":4262},[3946,34990,13135],{"class":3952},[3946,34992,34993,34995,34997,34999,35001,35004],{"class":3948,"line":6560},[3946,34994,13103],{"class":3952},[3946,34996,12926],{"class":4262},[3946,34998,13089],{"class":4262},[3946,35000,13092],{"class":3952},[3946,35002,35003],{"class":4262},"roleBadge",[3946,35005,13098],{"class":3952},[3946,35007,35008,35010,35012,35014,35016,35019,35021,35023,35025,35027],{"class":3948,"line":6566},[3946,35009,15112],{"class":3952},[3946,35011,14762],{"class":4262},[3946,35013,13089],{"class":4262},[3946,35015,13092],{"class":3952},[3946,35017,35018],{"class":4262},"roleText",[3946,35020,34960],{"class":3952},[3946,35022,15300],{"class":4262},[3946,35024,12613],{"class":3952},[3946,35026,14762],{"class":4262},[3946,35028,13135],{"class":3952},[3946,35030,35031,35033,35035],{"class":3948,"line":6571},[3946,35032,15256],{"class":3952},[3946,35034,12926],{"class":4262},[3946,35036,13135],{"class":3952},[3946,35038,35039,35041,35043],{"class":3948,"line":6588},[3946,35040,13130],{"class":3952},[3946,35042,12926],{"class":4262},[3946,35044,13135],{"class":3952},[3946,35046,35047],{"class":3948,"line":6597},[3946,35048,4278],{"emptyLinePlaceholder":4277},[3946,35050,35051,35053,35056],{"class":3948,"line":6609},[3946,35052,13167],{"class":3952},[3946,35054,35055],{"class":4342},"\u002F* Menu Items *\u002F",[3946,35057,4040],{"class":3952},[3946,35059,35060,35062,35064,35066,35068,35071],{"class":3948,"line":6640},[3946,35061,13084],{"class":3952},[3946,35063,12926],{"class":4262},[3946,35065,13089],{"class":4262},[3946,35067,13092],{"class":3952},[3946,35069,35070],{"class":4262},"section",[3946,35072,13098],{"class":3952},[3946,35074,35075,35077,35079,35081,35083,35086,35088,35091,35094,35096,35098],{"class":3948,"line":6653},[3946,35076,13103],{"class":3952},[3946,35078,14762],{"class":4262},[3946,35080,13089],{"class":4262},[3946,35082,13092],{"class":3952},[3946,35084,35085],{"class":4262},"sectionTitle",[3946,35087,15124],{"class":3952},[3946,35089,35090],{"class":4262},"Налаштування",[3946,35092,35093],{"class":4262}," акаунту",[3946,35095,15133],{"class":3952},[3946,35097,14762],{"class":4262},[3946,35099,13135],{"class":3952},[3946,35101,35102],{"class":3948,"line":6659},[3946,35103,8635],{"class":3952},[3946,35105,35106,35108,35110,35112,35114,35117],{"class":3948,"line":6671},[3946,35107,13103],{"class":3952},[3946,35109,14771],{"class":4262},[3946,35111,13089],{"class":4262},[3946,35113,13092],{"class":3952},[3946,35115,35116],{"class":4262},"menuItem",[3946,35118,13098],{"class":3952},[3946,35120,35121,35123,35125,35127,35129,35132,35134,35136,35138,35140,35142,35144,35147],{"class":3948,"line":6689},[3946,35122,15112],{"class":3952},[3946,35124,13775],{"class":4262},[3946,35126,13616],{"class":4262},[3946,35128,13111],{"class":3952},[3946,35130,35131],{"class":3966},"\"person-outline\"",[3946,35133,13108],{"class":4262},[3946,35135,12602],{"class":3952},[3946,35137,31882],{"class":4020},[3946,35139,5928],{"class":3952},[3946,35141,14080],{"class":4262},[3946,35143,13111],{"class":3952},[3946,35145,35146],{"class":3966},"\"#666666\"",[3946,35148,13125],{"class":3952},[3946,35150,35151,35153,35155,35157,35159,35162,35164,35167,35170,35172,35174],{"class":3948,"line":6694},[3946,35152,15112],{"class":3952},[3946,35154,14762],{"class":4262},[3946,35156,13089],{"class":4262},[3946,35158,13092],{"class":3952},[3946,35160,35161],{"class":4262},"menuItemText",[3946,35163,15124],{"class":3952},[3946,35165,35166],{"class":4262},"Редагувати",[3946,35168,35169],{"class":4262}," профіль",[3946,35171,15133],{"class":3952},[3946,35173,14762],{"class":4262},[3946,35175,13135],{"class":3952},[3946,35177,35178,35180,35182,35184,35186,35189,35191,35193,35195,35197,35199,35201,35203],{"class":3948,"line":6699},[3946,35179,15112],{"class":3952},[3946,35181,13775],{"class":4262},[3946,35183,13616],{"class":4262},[3946,35185,13111],{"class":3952},[3946,35187,35188],{"class":3966},"\"chevron-forward\"",[3946,35190,13108],{"class":4262},[3946,35192,12602],{"class":3952},[3946,35194,29527],{"class":4020},[3946,35196,5928],{"class":3952},[3946,35198,14080],{"class":4262},[3946,35200,13111],{"class":3952},[3946,35202,29632],{"class":3966},[3946,35204,13125],{"class":3952},[3946,35206,35207,35209,35211],{"class":3948,"line":6704},[3946,35208,15256],{"class":3952},[3946,35210,14771],{"class":4262},[3946,35212,13135],{"class":3952},[3946,35214,35215],{"class":3948,"line":6709},[3946,35216,4278],{"emptyLinePlaceholder":4277},[3946,35218,35219,35221,35223,35225,35227,35229],{"class":3948,"line":6715},[3946,35220,13103],{"class":3952},[3946,35222,14771],{"class":4262},[3946,35224,13089],{"class":4262},[3946,35226,13092],{"class":3952},[3946,35228,35116],{"class":4262},[3946,35230,13098],{"class":3952},[3946,35232,35233,35235,35237,35239,35241,35244,35246,35248,35250,35252,35254,35256,35258],{"class":3948,"line":6720},[3946,35234,15112],{"class":3952},[3946,35236,13775],{"class":4262},[3946,35238,13616],{"class":4262},[3946,35240,13111],{"class":3952},[3946,35242,35243],{"class":3966},"\"lock-closed-outline\"",[3946,35245,13108],{"class":4262},[3946,35247,12602],{"class":3952},[3946,35249,31882],{"class":4020},[3946,35251,5928],{"class":3952},[3946,35253,14080],{"class":4262},[3946,35255,13111],{"class":3952},[3946,35257,35146],{"class":3966},[3946,35259,13125],{"class":3952},[3946,35261,35262,35264,35266,35268,35270,35272,35274,35277,35280,35282,35284],{"class":3948,"line":6732},[3946,35263,15112],{"class":3952},[3946,35265,14762],{"class":4262},[3946,35267,13089],{"class":4262},[3946,35269,13092],{"class":3952},[3946,35271,35161],{"class":4262},[3946,35273,15124],{"class":3952},[3946,35275,35276],{"class":4262},"Змінити",[3946,35278,35279],{"class":4262}," пароль",[3946,35281,15133],{"class":3952},[3946,35283,14762],{"class":4262},[3946,35285,13135],{"class":3952},[3946,35287,35288,35290,35292,35294,35296,35298,35300,35302,35304,35306,35308,35310,35312],{"class":3948,"line":6743},[3946,35289,15112],{"class":3952},[3946,35291,13775],{"class":4262},[3946,35293,13616],{"class":4262},[3946,35295,13111],{"class":3952},[3946,35297,35188],{"class":3966},[3946,35299,13108],{"class":4262},[3946,35301,12602],{"class":3952},[3946,35303,29527],{"class":4020},[3946,35305,5928],{"class":3952},[3946,35307,14080],{"class":4262},[3946,35309,13111],{"class":3952},[3946,35311,29632],{"class":3966},[3946,35313,13125],{"class":3952},[3946,35315,35316,35318,35320],{"class":3948,"line":6754},[3946,35317,15256],{"class":3952},[3946,35319,14771],{"class":4262},[3946,35321,13135],{"class":3952},[3946,35323,35324],{"class":3948,"line":6768},[3946,35325,4278],{"emptyLinePlaceholder":4277},[3946,35327,35328,35330,35332,35334,35336,35338],{"class":3948,"line":7572},[3946,35329,13103],{"class":3952},[3946,35331,14771],{"class":4262},[3946,35333,13089],{"class":4262},[3946,35335,13092],{"class":3952},[3946,35337,35116],{"class":4262},[3946,35339,13098],{"class":3952},[3946,35341,35342,35344,35346,35348,35350,35353,35355,35357,35359,35361,35363,35365,35367],{"class":3948,"line":7590},[3946,35343,15112],{"class":3952},[3946,35345,13775],{"class":4262},[3946,35347,13616],{"class":4262},[3946,35349,13111],{"class":3952},[3946,35351,35352],{"class":3966},"\"shield-checkmark-outline\"",[3946,35354,13108],{"class":4262},[3946,35356,12602],{"class":3952},[3946,35358,31882],{"class":4020},[3946,35360,5928],{"class":3952},[3946,35362,14080],{"class":4262},[3946,35364,13111],{"class":3952},[3946,35366,35146],{"class":3966},[3946,35368,13125],{"class":3952},[3946,35370,35371,35373,35375,35377,35379,35381,35383,35386,35388,35390],{"class":3948,"line":7609},[3946,35372,15112],{"class":3952},[3946,35374,14762],{"class":4262},[3946,35376,13089],{"class":4262},[3946,35378,13092],{"class":3952},[3946,35380,35161],{"class":4262},[3946,35382,15124],{"class":3952},[3946,35384,35385],{"class":4262},"Безпека",[3946,35387,15133],{"class":3952},[3946,35389,14762],{"class":4262},[3946,35391,13135],{"class":3952},[3946,35393,35394,35396,35398,35400,35402,35404,35406,35408,35410,35412,35414,35416,35418],{"class":3948,"line":7615},[3946,35395,15112],{"class":3952},[3946,35397,13775],{"class":4262},[3946,35399,13616],{"class":4262},[3946,35401,13111],{"class":3952},[3946,35403,35188],{"class":3966},[3946,35405,13108],{"class":4262},[3946,35407,12602],{"class":3952},[3946,35409,29527],{"class":4020},[3946,35411,5928],{"class":3952},[3946,35413,14080],{"class":4262},[3946,35415,13111],{"class":3952},[3946,35417,29632],{"class":3966},[3946,35419,13125],{"class":3952},[3946,35421,35422,35424,35426],{"class":3948,"line":7633},[3946,35423,15256],{"class":3952},[3946,35425,14771],{"class":4262},[3946,35427,13135],{"class":3952},[3946,35429,35430,35432,35434],{"class":3948,"line":7638},[3946,35431,13130],{"class":3952},[3946,35433,12926],{"class":4262},[3946,35435,13135],{"class":3952},[3946,35437,35438],{"class":3948,"line":7644},[3946,35439,4278],{"emptyLinePlaceholder":4277},[3946,35441,35442,35444,35446,35448,35450,35452],{"class":3948,"line":7677},[3946,35443,13084],{"class":3952},[3946,35445,12926],{"class":4262},[3946,35447,13089],{"class":4262},[3946,35449,13092],{"class":3952},[3946,35451,35070],{"class":4262},[3946,35453,13098],{"class":3952},[3946,35455,35456,35458,35460,35462,35464,35466,35468,35471,35473,35475],{"class":3948,"line":7682},[3946,35457,13103],{"class":3952},[3946,35459,14762],{"class":4262},[3946,35461,13089],{"class":4262},[3946,35463,13092],{"class":3952},[3946,35465,35085],{"class":4262},[3946,35467,15124],{"class":3952},[3946,35469,35470],{"class":4262},"Додаток",[3946,35472,15133],{"class":3952},[3946,35474,14762],{"class":4262},[3946,35476,13135],{"class":3952},[3946,35478,35479],{"class":3948,"line":7694},[3946,35480,8635],{"class":3952},[3946,35482,35483,35485,35487,35489,35491,35493],{"class":3948,"line":7710},[3946,35484,13103],{"class":3952},[3946,35486,14771],{"class":4262},[3946,35488,13089],{"class":4262},[3946,35490,13092],{"class":3952},[3946,35492,35116],{"class":4262},[3946,35494,13098],{"class":3952},[3946,35496,35497,35499,35501,35503,35505,35508,35510,35512,35514,35516,35518,35520,35522],{"class":3948,"line":7715},[3946,35498,15112],{"class":3952},[3946,35500,13775],{"class":4262},[3946,35502,13616],{"class":4262},[3946,35504,13111],{"class":3952},[3946,35506,35507],{"class":3966},"\"notifications-outline\"",[3946,35509,13108],{"class":4262},[3946,35511,12602],{"class":3952},[3946,35513,31882],{"class":4020},[3946,35515,5928],{"class":3952},[3946,35517,14080],{"class":4262},[3946,35519,13111],{"class":3952},[3946,35521,35146],{"class":3966},[3946,35523,13125],{"class":3952},[3946,35525,35526,35528,35530,35532,35534,35536,35538,35541,35543,35545],{"class":3948,"line":7720},[3946,35527,15112],{"class":3952},[3946,35529,14762],{"class":4262},[3946,35531,13089],{"class":4262},[3946,35533,13092],{"class":3952},[3946,35535,35161],{"class":4262},[3946,35537,15124],{"class":3952},[3946,35539,35540],{"class":4262},"Сповіщення",[3946,35542,15133],{"class":3952},[3946,35544,14762],{"class":4262},[3946,35546,13135],{"class":3952},[3946,35548,35549,35551,35553,35555,35557,35559,35561,35563,35565,35567,35569,35571,35573],{"class":3948,"line":7729},[3946,35550,15112],{"class":3952},[3946,35552,13775],{"class":4262},[3946,35554,13616],{"class":4262},[3946,35556,13111],{"class":3952},[3946,35558,35188],{"class":3966},[3946,35560,13108],{"class":4262},[3946,35562,12602],{"class":3952},[3946,35564,29527],{"class":4020},[3946,35566,5928],{"class":3952},[3946,35568,14080],{"class":4262},[3946,35570,13111],{"class":3952},[3946,35572,29632],{"class":3966},[3946,35574,13125],{"class":3952},[3946,35576,35577,35579,35581],{"class":3948,"line":7734},[3946,35578,15256],{"class":3952},[3946,35580,14771],{"class":4262},[3946,35582,13135],{"class":3952},[3946,35584,35585],{"class":3948,"line":7739},[3946,35586,4278],{"emptyLinePlaceholder":4277},[3946,35588,35589,35591,35593,35595,35597,35599],{"class":3948,"line":7744},[3946,35590,13103],{"class":3952},[3946,35592,14771],{"class":4262},[3946,35594,13089],{"class":4262},[3946,35596,13092],{"class":3952},[3946,35598,35116],{"class":4262},[3946,35600,13098],{"class":3952},[3946,35602,35603,35605,35607,35609,35611,35614,35616,35618,35620,35622,35624,35626,35628],{"class":3948,"line":7750},[3946,35604,15112],{"class":3952},[3946,35606,13775],{"class":4262},[3946,35608,13616],{"class":4262},[3946,35610,13111],{"class":3952},[3946,35612,35613],{"class":3966},"\"help-circle-outline\"",[3946,35615,13108],{"class":4262},[3946,35617,12602],{"class":3952},[3946,35619,31882],{"class":4020},[3946,35621,5928],{"class":3952},[3946,35623,14080],{"class":4262},[3946,35625,13111],{"class":3952},[3946,35627,35146],{"class":3966},[3946,35629,13125],{"class":3952},[3946,35631,35632,35634,35636,35638,35640,35642,35644,35647,35649,35651],{"class":3948,"line":7755},[3946,35633,15112],{"class":3952},[3946,35635,14762],{"class":4262},[3946,35637,13089],{"class":4262},[3946,35639,13092],{"class":3952},[3946,35641,35161],{"class":4262},[3946,35643,15124],{"class":3952},[3946,35645,35646],{"class":4262},"Допомога",[3946,35648,15133],{"class":3952},[3946,35650,14762],{"class":4262},[3946,35652,13135],{"class":3952},[3946,35654,35655,35657,35659,35661,35663,35665,35667,35669,35671,35673,35675,35677,35679],{"class":3948,"line":7765},[3946,35656,15112],{"class":3952},[3946,35658,13775],{"class":4262},[3946,35660,13616],{"class":4262},[3946,35662,13111],{"class":3952},[3946,35664,35188],{"class":3966},[3946,35666,13108],{"class":4262},[3946,35668,12602],{"class":3952},[3946,35670,29527],{"class":4020},[3946,35672,5928],{"class":3952},[3946,35674,14080],{"class":4262},[3946,35676,13111],{"class":3952},[3946,35678,29632],{"class":3966},[3946,35680,13125],{"class":3952},[3946,35682,35683,35685,35687],{"class":3948,"line":7777},[3946,35684,15256],{"class":3952},[3946,35686,14771],{"class":4262},[3946,35688,13135],{"class":3952},[3946,35690,35691],{"class":3948,"line":7786},[3946,35692,4278],{"emptyLinePlaceholder":4277},[3946,35694,35695,35697,35699,35701,35703,35705],{"class":3948,"line":7799},[3946,35696,13103],{"class":3952},[3946,35698,14771],{"class":4262},[3946,35700,13089],{"class":4262},[3946,35702,13092],{"class":3952},[3946,35704,35116],{"class":4262},[3946,35706,13098],{"class":3952},[3946,35708,35709,35711,35713,35715,35717,35720,35722,35724,35726,35728,35730,35732,35734],{"class":3948,"line":7818},[3946,35710,15112],{"class":3952},[3946,35712,13775],{"class":4262},[3946,35714,13616],{"class":4262},[3946,35716,13111],{"class":3952},[3946,35718,35719],{"class":3966},"\"information-circle-outline\"",[3946,35721,13108],{"class":4262},[3946,35723,12602],{"class":3952},[3946,35725,31882],{"class":4020},[3946,35727,5928],{"class":3952},[3946,35729,14080],{"class":4262},[3946,35731,13111],{"class":3952},[3946,35733,35146],{"class":3966},[3946,35735,13125],{"class":3952},[3946,35737,35738,35740,35742,35744,35746,35748,35750,35753,35756,35758,35760],{"class":3948,"line":7823},[3946,35739,15112],{"class":3952},[3946,35741,14762],{"class":4262},[3946,35743,13089],{"class":4262},[3946,35745,13092],{"class":3952},[3946,35747,35161],{"class":4262},[3946,35749,15124],{"class":3952},[3946,35751,35752],{"class":4262},"Про",[3946,35754,35755],{"class":4262}," додаток",[3946,35757,15133],{"class":3952},[3946,35759,14762],{"class":4262},[3946,35761,13135],{"class":3952},[3946,35763,35764,35766,35768,35770,35772,35774,35776,35778,35780,35782,35784,35786,35788],{"class":3948,"line":7834},[3946,35765,15112],{"class":3952},[3946,35767,13775],{"class":4262},[3946,35769,13616],{"class":4262},[3946,35771,13111],{"class":3952},[3946,35773,35188],{"class":3966},[3946,35775,13108],{"class":4262},[3946,35777,12602],{"class":3952},[3946,35779,29527],{"class":4020},[3946,35781,5928],{"class":3952},[3946,35783,14080],{"class":4262},[3946,35785,13111],{"class":3952},[3946,35787,29632],{"class":3966},[3946,35789,13125],{"class":3952},[3946,35791,35792,35794,35796],{"class":3948,"line":7850},[3946,35793,15256],{"class":3952},[3946,35795,14771],{"class":4262},[3946,35797,13135],{"class":3952},[3946,35799,35800,35802,35804],{"class":3948,"line":7855},[3946,35801,13130],{"class":3952},[3946,35803,12926],{"class":4262},[3946,35805,13135],{"class":3952},[3946,35807,35808],{"class":3948,"line":7860},[3946,35809,4278],{"emptyLinePlaceholder":4277},[3946,35811,35812,35814,35817],{"class":3948,"line":7891},[3946,35813,13167],{"class":3952},[3946,35815,35816],{"class":4342},"\u002F* Logout Button *\u002F",[3946,35818,4040],{"class":3952},[3946,35820,35821,35823],{"class":3948,"line":7896},[3946,35822,13084],{"class":3952},[3946,35824,15436],{"class":4262},[3946,35826,35827,35829,35831,35834],{"class":3948,"line":7901},[3946,35828,29480],{"class":4262},[3946,35830,13092],{"class":3952},[3946,35832,35833],{"class":4262},"logoutButton",[3946,35835,4040],{"class":3952},[3946,35837,35838,35840,35842,35845],{"class":3948,"line":7906},[3946,35839,29492],{"class":4262},[3946,35841,12602],{"class":3952},[3946,35843,35844],{"class":4262},"handleLogout",[3946,35846,4040],{"class":3952},[3946,35848,35849,35852,35854,35856],{"class":3948,"line":7912},[3946,35850,35851],{"class":4262},"        disabled",[3946,35853,12602],{"class":3952},[3946,35855,13046],{"class":4262},[3946,35857,4040],{"class":3952},[3946,35859,35860],{"class":3948,"line":7917},[3946,35861,23739],{"class":3952},[3946,35863,35864,35866,35868,35870,35872,35875,35877,35879,35881,35883,35885,35887,35889],{"class":3948,"line":7935},[3946,35865,13103],{"class":3952},[3946,35867,13775],{"class":4262},[3946,35869,13616],{"class":4262},[3946,35871,13111],{"class":3952},[3946,35873,35874],{"class":3966},"\"log-out-outline\"",[3946,35876,13108],{"class":4262},[3946,35878,12602],{"class":3952},[3946,35880,31882],{"class":4020},[3946,35882,5928],{"class":3952},[3946,35884,14080],{"class":4262},[3946,35886,13111],{"class":3952},[3946,35888,29536],{"class":3966},[3946,35890,13125],{"class":3952},[3946,35892,35893,35895,35897,35899,35901,35904,35906,35909,35912,35914,35916,35918],{"class":3948,"line":7942},[3946,35894,13103],{"class":3952},[3946,35896,14762],{"class":4262},[3946,35898,13089],{"class":4262},[3946,35900,13092],{"class":3952},[3946,35902,35903],{"class":4262},"logoutText",[3946,35905,15124],{"class":3952},[3946,35907,35908],{"class":4262},"Вийти",[3946,35910,35911],{"class":4262}," з",[3946,35913,35093],{"class":4262},[3946,35915,15133],{"class":3952},[3946,35917,14762],{"class":4262},[3946,35919,13135],{"class":3952},[3946,35921,35922,35924,35926],{"class":3948,"line":7963},[3946,35923,13130],{"class":3952},[3946,35925,14771],{"class":4262},[3946,35927,13135],{"class":3952},[3946,35929,35930],{"class":3948,"line":7979},[3946,35931,4278],{"emptyLinePlaceholder":4277},[3946,35933,35934,35936,35938,35940,35942,35945,35947,35950,35953,35955,35957,35959,35961],{"class":3948,"line":7992},[3946,35935,13084],{"class":3952},[3946,35937,14762],{"class":4262},[3946,35939,13089],{"class":4262},[3946,35941,13092],{"class":3952},[3946,35943,35944],{"class":4262},"version",[3946,35946,15124],{"class":3952},[3946,35948,35949],{"class":4262},"Версія",[3946,35951,35952],{"class":4020}," 1.0",[3946,35954,4298],{"class":3952},[3946,35956,8175],{"class":4020},[3946,35958,15133],{"class":3952},[3946,35960,14762],{"class":4262},[3946,35962,13135],{"class":3952},[3946,35964,35965,35967,35969],{"class":3948,"line":8012},[3946,35966,13187],{"class":3952},[3946,35968,24325],{"class":4262},[3946,35970,13135],{"class":3952},[3946,35972,35973],{"class":3948,"line":8018},[3946,35974,10875],{"class":3952},[3946,35976,35977],{"class":3948,"line":8023},[3946,35978,4040],{"class":3952},[3946,35980,35981],{"class":3948,"line":8028},[3946,35982,4278],{"emptyLinePlaceholder":4277},[3946,35984,35985,35987,35989,35991,35993,35995,35997],{"class":3948,"line":8033},[3946,35986,4283],{"class":4255},[3946,35988,13210],{"class":4286},[3946,35990,4290],{"class":3952},[3946,35992,12936],{"class":4262},[3946,35994,4298],{"class":3952},[3946,35996,8509],{"class":4224},[3946,35998,8512],{"class":3952},[3946,36000,36001,36003],{"class":3948,"line":8038},[3946,36002,15568],{"class":4262},[3946,36004,4427],{"class":3952},[3946,36006,36007,36009,36011],{"class":3948,"line":8044},[3946,36008,13232],{"class":4262},[3946,36010,13235],{"class":4020},[3946,36012,3970],{"class":3952},[3946,36014,36015,36017,36019],{"class":3948,"line":8049},[3946,36016,13261],{"class":4262},[3946,36018,22488],{"class":3966},[3946,36020,3970],{"class":3952},[3946,36022,36023],{"class":3948,"line":8071},[3946,36024,13271],{"class":3952},[3946,36026,36027,36029],{"class":3948,"line":8090},[3946,36028,30068],{"class":4262},[3946,36030,4427],{"class":3952},[3946,36032,36033,36035,36037],{"class":3948,"line":8095},[3946,36034,13232],{"class":4262},[3946,36036,13235],{"class":4020},[3946,36038,3970],{"class":3952},[3946,36040,36041,36043,36045],{"class":3948,"line":8112},[3946,36042,13242],{"class":4262},[3946,36044,13245],{"class":3966},[3946,36046,3970],{"class":3952},[3946,36048,36049,36051,36053],{"class":3948,"line":8117},[3946,36050,13252],{"class":4262},[3946,36052,13245],{"class":3966},[3946,36054,3970],{"class":3952},[3946,36056,36057],{"class":3948,"line":8160},[3946,36058,13271],{"class":3952},[3946,36060,36061,36063],{"class":3948,"line":8185},[3946,36062,32455],{"class":4262},[3946,36064,4427],{"class":3952},[3946,36066,36067,36069,36071],{"class":3948,"line":8190},[3946,36068,32550],{"class":4262},[3946,36070,24440],{"class":4020},[3946,36072,3970],{"class":3952},[3946,36074,36075],{"class":3948,"line":8195},[3946,36076,13271],{"class":3952},[3946,36078,36079,36081],{"class":3948,"line":8200},[3946,36080,24431],{"class":4262},[3946,36082,4427],{"class":3952},[3946,36084,36085,36087,36089],{"class":3948,"line":8206},[3946,36086,13261],{"class":4262},[3946,36088,13264],{"class":3966},[3946,36090,3970],{"class":3952},[3946,36092,36093,36095,36097],{"class":3948,"line":9571},[3946,36094,13252],{"class":4262},[3946,36096,13245],{"class":3966},[3946,36098,3970],{"class":3952},[3946,36100,36101,36103,36105],{"class":3948,"line":9589},[3946,36102,15743],{"class":4262},[3946,36104,24467],{"class":4020},[3946,36106,3970],{"class":3952},[3946,36108,36109,36111,36113],{"class":3948,"line":9596},[3946,36110,15658],{"class":4262},[3946,36112,15602],{"class":4020},[3946,36114,3970],{"class":3952},[3946,36116,36117],{"class":3948,"line":9618},[3946,36118,13271],{"class":3952},[3946,36120,36121,36124],{"class":3948,"line":9627},[3946,36122,36123],{"class":4262},"  avatarContainer:",[3946,36125,4427],{"class":3952},[3946,36127,36128,36130,36133],{"class":3948,"line":9636},[3946,36129,30226],{"class":4262},[3946,36131,36132],{"class":4020}," 80",[3946,36134,3970],{"class":3952},[3946,36136,36137,36139,36141],{"class":3948,"line":9645},[3946,36138,30235],{"class":4262},[3946,36140,36132],{"class":4020},[3946,36142,3970],{"class":3952},[3946,36144,36145,36147,36149],{"class":3948,"line":9650},[3946,36146,15752],{"class":4262},[3946,36148,24440],{"class":4020},[3946,36150,3970],{"class":3952},[3946,36152,36153,36155,36157],{"class":3948,"line":9655},[3946,36154,13261],{"class":4262},[3946,36156,15727],{"class":3966},[3946,36158,3970],{"class":3952},[3946,36160,36161,36163,36165],{"class":3948,"line":9660},[3946,36162,13242],{"class":4262},[3946,36164,13245],{"class":3966},[3946,36166,3970],{"class":3952},[3946,36168,36169,36171,36173],{"class":3948,"line":9665},[3946,36170,13252],{"class":4262},[3946,36172,13245],{"class":3966},[3946,36174,3970],{"class":3952},[3946,36176,36177,36179,36181],{"class":3948,"line":9671},[3946,36178,15658],{"class":4262},[3946,36180,15681],{"class":4020},[3946,36182,3970],{"class":3952},[3946,36184,36185],{"class":3948,"line":9676},[3946,36186,13271],{"class":3952},[3946,36188,36189,36192],{"class":3948,"line":9700},[3946,36190,36191],{"class":4262},"  avatarText:",[3946,36193,4427],{"class":3952},[3946,36195,36196,36198,36200],{"class":3948,"line":9721},[3946,36197,15628],{"class":4262},[3946,36199,24467],{"class":4020},[3946,36201,3970],{"class":3952},[3946,36203,36204,36206,36208],{"class":3948,"line":9756},[3946,36205,15638],{"class":4262},[3946,36207,15641],{"class":3966},[3946,36209,3970],{"class":3952},[3946,36211,36212,36214,36216],{"class":3948,"line":9778},[3946,36213,15648],{"class":4262},[3946,36215,13264],{"class":3966},[3946,36217,3970],{"class":3952},[3946,36219,36220],{"class":3948,"line":9783},[3946,36221,13271],{"class":3952},[3946,36223,36224,36227],{"class":3948,"line":9789},[3946,36225,36226],{"class":4262},"  name:",[3946,36228,4427],{"class":3952},[3946,36230,36231,36233,36235],{"class":3948,"line":9801},[3946,36232,15628],{"class":4262},[3946,36234,15631],{"class":4020},[3946,36236,3970],{"class":3952},[3946,36238,36239,36241,36243],{"class":3948,"line":9813},[3946,36240,15638],{"class":4262},[3946,36242,15641],{"class":3966},[3946,36244,3970],{"class":3952},[3946,36246,36247,36249,36251],{"class":3948,"line":9830},[3946,36248,15648],{"class":4262},[3946,36250,15651],{"class":3966},[3946,36252,3970],{"class":3952},[3946,36254,36255,36257,36259],{"class":3948,"line":9840},[3946,36256,15658],{"class":4262},[3946,36258,22658],{"class":4020},[3946,36260,3970],{"class":3952},[3946,36262,36263],{"class":3948,"line":9856},[3946,36264,13271],{"class":3952},[3946,36266,36267,36270],{"class":3948,"line":9866},[3946,36268,36269],{"class":4262},"  email:",[3946,36271,4427],{"class":3952},[3946,36273,36274,36276,36278],{"class":3948,"line":9882},[3946,36275,15628],{"class":4262},[3946,36277,21643],{"class":4020},[3946,36279,3970],{"class":3952},[3946,36281,36282,36284,36286],{"class":3948,"line":9892},[3946,36283,15648],{"class":4262},[3946,36285,15690],{"class":3966},[3946,36287,3970],{"class":3952},[3946,36289,36290,36292,36294],{"class":3948,"line":9908},[3946,36291,15658],{"class":4262},[3946,36293,15661],{"class":4020},[3946,36295,3970],{"class":3952},[3946,36297,36298],{"class":3948,"line":9918},[3946,36299,13271],{"class":3952},[3946,36301,36302,36305],{"class":3948,"line":9934},[3946,36303,36304],{"class":4262},"  roleBadge:",[3946,36306,4427],{"class":3952},[3946,36308,36309,36311,36313],{"class":3948,"line":9944},[3946,36310,13261],{"class":4262},[3946,36312,30254],{"class":3966},[3946,36314,3970],{"class":3952},[3946,36316,36317,36319,36321],{"class":3948,"line":9960},[3946,36318,15734],{"class":4262},[3946,36320,15661],{"class":4020},[3946,36322,3970],{"class":3952},[3946,36324,36325,36327,36329],{"class":3948,"line":9970},[3946,36326,15743],{"class":4262},[3946,36328,22658],{"class":4020},[3946,36330,3970],{"class":3952},[3946,36332,36333,36335,36337],{"class":3948,"line":9986},[3946,36334,15752],{"class":4262},[3946,36336,15661],{"class":4020},[3946,36338,3970],{"class":3952},[3946,36340,36341],{"class":3948,"line":9994},[3946,36342,13271],{"class":3952},[3946,36344,36345,36348],{"class":3948,"line":10014},[3946,36346,36347],{"class":4262},"  roleText:",[3946,36349,4427],{"class":3952},[3946,36351,36352,36354,36356],{"class":3948,"line":10019},[3946,36353,15628],{"class":4262},[3946,36355,15661],{"class":4020},[3946,36357,3970],{"class":3952},[3946,36359,36360,36362,36364],{"class":3948,"line":10024},[3946,36361,15638],{"class":4262},[3946,36363,15791],{"class":3966},[3946,36365,3970],{"class":3952},[3946,36367,36368,36370,36372],{"class":3948,"line":10029},[3946,36369,15648],{"class":4262},[3946,36371,15727],{"class":3966},[3946,36373,3970],{"class":3952},[3946,36375,36376,36379,36382],{"class":3948,"line":10044},[3946,36377,36378],{"class":4262},"    textTransform:",[3946,36380,36381],{"class":3966}," 'uppercase'",[3946,36383,3970],{"class":3952},[3946,36385,36386],{"class":3948,"line":10053},[3946,36387,13271],{"class":3952},[3946,36389,36390,36393],{"class":3948,"line":10058},[3946,36391,36392],{"class":4262},"  section:",[3946,36394,4427],{"class":3952},[3946,36396,36397,36399,36401],{"class":3948,"line":10063},[3946,36398,13261],{"class":4262},[3946,36400,13264],{"class":3966},[3946,36402,3970],{"class":3952},[3946,36404,36405,36407,36409],{"class":3948,"line":10079},[3946,36406,15658],{"class":4262},[3946,36408,15602],{"class":4020},[3946,36410,3970],{"class":3952},[3946,36412,36413,36415,36417],{"class":3948,"line":10084},[3946,36414,15734],{"class":4262},[3946,36416,15681],{"class":4020},[3946,36418,3970],{"class":3952},[3946,36420,36421],{"class":3948,"line":10089},[3946,36422,13271],{"class":3952},[3946,36424,36425,36428],{"class":3948,"line":10094},[3946,36426,36427],{"class":4262},"  sectionTitle:",[3946,36429,4427],{"class":3952},[3946,36431,36432,36434,36436],{"class":3948,"line":10099},[3946,36433,15628],{"class":4262},[3946,36435,15661],{"class":4020},[3946,36437,3970],{"class":3952},[3946,36439,36440,36442,36444],{"class":3948,"line":11862},[3946,36441,15638],{"class":4262},[3946,36443,15791],{"class":3966},[3946,36445,3970],{"class":3952},[3946,36447,36448,36450,36452],{"class":3948,"line":11871},[3946,36449,15648],{"class":4262},[3946,36451,30554],{"class":3966},[3946,36453,3970],{"class":3952},[3946,36455,36456,36458,36460],{"class":3948,"line":11876},[3946,36457,36378],{"class":4262},[3946,36459,36381],{"class":3966},[3946,36461,3970],{"class":3952},[3946,36463,36464,36466,36468],{"class":3948,"line":11881},[3946,36465,22655],{"class":4262},[3946,36467,15681],{"class":4020},[3946,36469,3970],{"class":3952},[3946,36471,36472,36474,36476],{"class":3948,"line":11894},[3946,36473,15658],{"class":4262},[3946,36475,15755],{"class":4020},[3946,36477,3970],{"class":3952},[3946,36479,36480,36482,36484],{"class":3948,"line":11899},[3946,36481,15734],{"class":4262},[3946,36483,22658],{"class":4020},[3946,36485,3970],{"class":3952},[3946,36487,36488],{"class":3948,"line":11904},[3946,36489,13271],{"class":3952},[3946,36491,36492,36495],{"class":3948,"line":11909},[3946,36493,36494],{"class":4262},"  menuItem:",[3946,36496,4427],{"class":3952},[3946,36498,36499,36501,36503],{"class":3948,"line":11915},[3946,36500,30109],{"class":4262},[3946,36502,30112],{"class":3966},[3946,36504,3970],{"class":3952},[3946,36506,36507,36509,36511],{"class":3948,"line":11920},[3946,36508,13252],{"class":4262},[3946,36510,13245],{"class":3966},[3946,36512,3970],{"class":3952},[3946,36514,36515,36517,36519],{"class":3948,"line":11941},[3946,36516,15743],{"class":4262},[3946,36518,15681],{"class":4020},[3946,36520,3970],{"class":3952},[3946,36522,36523,36525,36527],{"class":3948,"line":11948},[3946,36524,30160],{"class":4262},[3946,36526,13235],{"class":4020},[3946,36528,3970],{"class":3952},[3946,36530,36531,36533,36535],{"class":3948,"line":11961},[3946,36532,30169],{"class":4262},[3946,36534,22488],{"class":3966},[3946,36536,3970],{"class":3952},[3946,36538,36539],{"class":3948,"line":11966},[3946,36540,13271],{"class":3952},[3946,36542,36543,36546],{"class":3948,"line":11972},[3946,36544,36545],{"class":4262},"  menuItemText:",[3946,36547,4427],{"class":3952},[3946,36549,36550,36552,36554],{"class":3948,"line":11986},[3946,36551,13232],{"class":4262},[3946,36553,13235],{"class":4020},[3946,36555,3970],{"class":3952},[3946,36557,36558,36560,36562],{"class":3948,"line":11999},[3946,36559,15628],{"class":4262},[3946,36561,15681],{"class":4020},[3946,36563,3970],{"class":3952},[3946,36565,36566,36568,36570],{"class":3948,"line":12018},[3946,36567,15648],{"class":4262},[3946,36569,15651],{"class":3966},[3946,36571,3970],{"class":3952},[3946,36573,36574,36576,36578],{"class":3948,"line":12024},[3946,36575,30580],{"class":4262},[3946,36577,15681],{"class":4020},[3946,36579,3970],{"class":3952},[3946,36581,36582],{"class":3948,"line":12034},[3946,36583,13271],{"class":3952},[3946,36585,36586,36589],{"class":3948,"line":12040},[3946,36587,36588],{"class":4262},"  logoutButton:",[3946,36590,4427],{"class":3952},[3946,36592,36593,36595,36597],{"class":3948,"line":12053},[3946,36594,30109],{"class":4262},[3946,36596,30112],{"class":3966},[3946,36598,3970],{"class":3952},[3946,36600,36601,36603,36605],{"class":3948,"line":12058},[3946,36602,13252],{"class":4262},[3946,36604,13245],{"class":3966},[3946,36606,3970],{"class":3952},[3946,36608,36609,36611,36613],{"class":3948,"line":12064},[3946,36610,13242],{"class":4262},[3946,36612,13245],{"class":3966},[3946,36614,3970],{"class":3952},[3946,36616,36617,36619,36621],{"class":3948,"line":12071},[3946,36618,13261],{"class":4262},[3946,36620,13264],{"class":3966},[3946,36622,3970],{"class":3952},[3946,36624,36625,36628,36630],{"class":3948,"line":12076},[3946,36626,36627],{"class":4262},"    marginHorizontal:",[3946,36629,15681],{"class":4020},[3946,36631,3970],{"class":3952},[3946,36633,36634,36636,36638],{"class":3948,"line":12089},[3946,36635,22655],{"class":4262},[3946,36637,15602],{"class":4020},[3946,36639,3970],{"class":3952},[3946,36641,36642,36644,36646],{"class":3948,"line":12094},[3946,36643,15743],{"class":4262},[3946,36645,15681],{"class":4020},[3946,36647,3970],{"class":3952},[3946,36649,36650,36652,36654],{"class":3948,"line":12099},[3946,36651,15752],{"class":4262},[3946,36653,15661],{"class":4020},[3946,36655,3970],{"class":3952},[3946,36657,36658,36660,36662],{"class":3948,"line":12105},[3946,36659,21751],{"class":4262},[3946,36661,13235],{"class":4020},[3946,36663,3970],{"class":3952},[3946,36665,36666,36668,36670],{"class":3948,"line":12110},[3946,36667,21761],{"class":4262},[3946,36669,18618],{"class":3966},[3946,36671,3970],{"class":3952},[3946,36673,36674],{"class":3948,"line":12132},[3946,36675,13271],{"class":3952},[3946,36677,36678,36681],{"class":3948,"line":12139},[3946,36679,36680],{"class":4262},"  logoutText:",[3946,36682,4427],{"class":3952},[3946,36684,36685,36687,36689],{"class":3948,"line":12158},[3946,36686,15628],{"class":4262},[3946,36688,15681],{"class":4020},[3946,36690,3970],{"class":3952},[3946,36692,36693,36695,36697],{"class":3948,"line":12163},[3946,36694,15638],{"class":4262},[3946,36696,15791],{"class":3966},[3946,36698,3970],{"class":3952},[3946,36700,36701,36703,36705],{"class":3948,"line":12178},[3946,36702,15648],{"class":4262},[3946,36704,18618],{"class":3966},[3946,36706,3970],{"class":3952},[3946,36708,36709,36711,36713],{"class":3948,"line":12194},[3946,36710,30580],{"class":4262},[3946,36712,15755],{"class":4020},[3946,36714,3970],{"class":3952},[3946,36716,36717],{"class":3948,"line":12199},[3946,36718,13271],{"class":3952},[3946,36720,36721,36724],{"class":3948,"line":12204},[3946,36722,36723],{"class":4262},"  version:",[3946,36725,4427],{"class":3952},[3946,36727,36728,36730,36732],{"class":3948,"line":12231},[3946,36729,15628],{"class":4262},[3946,36731,15661],{"class":4020},[3946,36733,3970],{"class":3952},[3946,36735,36736,36738,36740],{"class":3948,"line":12236},[3946,36737,15648],{"class":4262},[3946,36739,30554],{"class":3966},[3946,36741,3970],{"class":3952},[3946,36743,36744,36746,36748],{"class":3948,"line":12249},[3946,36745,15697],{"class":4262},[3946,36747,13245],{"class":3966},[3946,36749,3970],{"class":3952},[3946,36751,36752,36754,36756],{"class":3948,"line":12261},[3946,36753,22655],{"class":4262},[3946,36755,15602],{"class":4020},[3946,36757,3970],{"class":3952},[3946,36759,36760],{"class":3948,"line":12272},[3946,36761,13271],{"class":3952},[3946,36763,36764],{"class":3948,"line":12281},[3946,36765,13276],{"class":3952},[3811,36767],{},[3738,36769,36771],{"id":36770},"розділ-8-best-practices-та-поради-з-безпеки","Розділ 8: Best Practices та Поради з Безпеки",[3750,36773,36775],{"id":36774},"_81-безпека-токенів","8.1. Безпека Токенів",[3847,36777,36779],{"id":36778},"ніколи-не-логуйте-токени","Ніколи не логуйте токени",[3857,36781,36783],{"className":4242,"code":36782,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ НЕБЕЗПЕЧНО\nconsole.log('Access token:', token);\nconsole.log('User data:', JSON.stringify(userData));\n\n\u002F\u002F ✅ БЕЗПЕЧНО\nconsole.log('Token received');\nconsole.log('User authenticated:', userData.email);\n",[3782,36784,36785,36790,36810,36838,36842,36847,36862],{"__ignoreMap":3865},[3946,36786,36787],{"class":3948,"line":3949},[3946,36788,36789],{"class":4342},"\u002F\u002F ❌ НЕБЕЗПЕЧНО\n",[3946,36791,36792,36795,36797,36799,36801,36804,36806,36808],{"class":3948,"line":3956},[3946,36793,36794],{"class":4262},"console",[3946,36796,4298],{"class":3952},[3946,36798,4461],{"class":4224},[3946,36800,4331],{"class":3952},[3946,36802,36803],{"class":3966},"'Access token:'",[3946,36805,4447],{"class":3952},[3946,36807,4398],{"class":4262},[3946,36809,4337],{"class":3952},[3946,36811,36812,36814,36816,36818,36820,36823,36825,36827,36829,36831,36833,36836],{"class":3948,"line":3973},[3946,36813,36794],{"class":4262},[3946,36815,4298],{"class":3952},[3946,36817,4461],{"class":4224},[3946,36819,4331],{"class":3952},[3946,36821,36822],{"class":3966},"'User data:'",[3946,36824,4447],{"class":3952},[3946,36826,5685],{"class":4286},[3946,36828,4298],{"class":3952},[3946,36830,5690],{"class":4224},[3946,36832,4331],{"class":3952},[3946,36834,36835],{"class":4262},"userData",[3946,36837,29083],{"class":3952},[3946,36839,36840],{"class":3948,"line":3986},[3946,36841,4278],{"emptyLinePlaceholder":4277},[3946,36843,36844],{"class":3948,"line":3999},[3946,36845,36846],{"class":4342},"\u002F\u002F ✅ БЕЗПЕЧНО\n",[3946,36848,36849,36851,36853,36855,36857,36860],{"class":3948,"line":4012},[3946,36850,36794],{"class":4262},[3946,36852,4298],{"class":3952},[3946,36854,4461],{"class":4224},[3946,36856,4331],{"class":3952},[3946,36858,36859],{"class":3966},"'Token received'",[3946,36861,4337],{"class":3952},[3946,36863,36864,36866,36868,36870,36872,36875,36877,36879,36881,36883],{"class":3948,"line":4026},[3946,36865,36794],{"class":4262},[3946,36867,4298],{"class":3952},[3946,36869,4461],{"class":4224},[3946,36871,4331],{"class":3952},[3946,36873,36874],{"class":3966},"'User authenticated:'",[3946,36876,4447],{"class":3952},[3946,36878,36835],{"class":4262},[3946,36880,4298],{"class":3952},[3946,36882,10853],{"class":4262},[3946,36884,4337],{"class":3952},[3847,36886,36888],{"id":36887},"використовуйте-https-завжди","Використовуйте HTTPS завжди",[3857,36890,36892],{"className":4242,"code":36891,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ НЕБЕЗПЕЧНО\nconst API_URL = 'http:\u002F\u002Fapi.myapp.com';\n\n\u002F\u002F ✅ БЕЗПЕЧНО\nconst API_URL = 'https:\u002F\u002Fapi.myapp.com';\n\n\u002F\u002F Development exception (з явним попередженням)\nconst API_URL = __DEV__\n  ? 'http:\u002F\u002Flocalhost:3000'\n  : 'https:\u002F\u002Fapi.myapp.com';\n\nif (__DEV__ && !API_URL.startsWith('https')) {\n  console.warn('⚠️ Using insecure HTTP in development mode');\n}\n",[3782,36893,36894,36898,36912,36916,36920,36933,36937,36942,36952,36959,36967,36971,36997,37012],{"__ignoreMap":3865},[3946,36895,36896],{"class":3948,"line":3949},[3946,36897,36789],{"class":4342},[3946,36899,36900,36902,36905,36907,36910],{"class":3948,"line":3956},[3946,36901,4283],{"class":4255},[3946,36903,36904],{"class":4286}," API_URL",[3946,36906,4290],{"class":3952},[3946,36908,36909],{"class":3966},"'http:\u002F\u002Fapi.myapp.com'",[3946,36911,4272],{"class":3952},[3946,36913,36914],{"class":3948,"line":3973},[3946,36915,4278],{"emptyLinePlaceholder":4277},[3946,36917,36918],{"class":3948,"line":3986},[3946,36919,36846],{"class":4342},[3946,36921,36922,36924,36926,36928,36931],{"class":3948,"line":3999},[3946,36923,4283],{"class":4255},[3946,36925,36904],{"class":4286},[3946,36927,4290],{"class":3952},[3946,36929,36930],{"class":3966},"'https:\u002F\u002Fapi.myapp.com'",[3946,36932,4272],{"class":3952},[3946,36934,36935],{"class":3948,"line":4012},[3946,36936,4278],{"emptyLinePlaceholder":4277},[3946,36938,36939],{"class":3948,"line":4026},[3946,36940,36941],{"class":4342},"\u002F\u002F Development exception (з явним попередженням)\n",[3946,36943,36944,36946,36948,36950],{"class":3948,"line":4037},[3946,36945,4283],{"class":4255},[3946,36947,36904],{"class":4286},[3946,36949,4290],{"class":3952},[3946,36951,8400],{"class":4262},[3946,36953,36954,36956],{"class":3948,"line":4487},[3946,36955,8405],{"class":3952},[3946,36957,36958],{"class":3966},"'http:\u002F\u002Flocalhost:3000'\n",[3946,36960,36961,36963,36965],{"class":3948,"line":4507},[3946,36962,8413],{"class":3952},[3946,36964,36930],{"class":3966},[3946,36966,4272],{"class":3952},[3946,36968,36969],{"class":3948,"line":4518},[3946,36970,4278],{"emptyLinePlaceholder":4277},[3946,36972,36973,36975,36977,36980,36982,36985,36987,36990,36992,36995],{"class":3948,"line":4524},[3946,36974,4309],{"class":4251},[3946,36976,4479],{"class":3952},[3946,36978,36979],{"class":4262},"__DEV__",[3946,36981,17470],{"class":3952},[3946,36983,36984],{"class":4286},"API_URL",[3946,36986,4298],{"class":3952},[3946,36988,36989],{"class":4224},"startsWith",[3946,36991,4331],{"class":3952},[3946,36993,36994],{"class":3966},"'https'",[3946,36996,9718],{"class":3952},[3946,36998,36999,37001,37003,37005,37007,37010],{"class":3948,"line":4529},[3946,37000,4323],{"class":4262},[3946,37002,4298],{"class":3952},[3946,37004,4328],{"class":4224},[3946,37006,4331],{"class":3952},[3946,37008,37009],{"class":3966},"'⚠️ Using insecure HTTP in development mode'",[3946,37011,4337],{"class":3952},[3946,37013,37014],{"class":3948,"line":4534},[3946,37015,4040],{"class":3952},[3847,37017,37019],{"id":37018},"короткий-lifetime-для-access-tokens","Короткий lifetime для access tokens",[3857,37021,37023],{"className":4242,"code":37022,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ ПОГАНА ПРАКТИКА\nexpiresIn: 86400 * 30 \u002F\u002F 30 днів\n\n\u002F\u002F ✅ КРАЩА ПРАКТИКА\nexpiresIn: 3600 \u002F\u002F 1 година для access token\nrefreshTokenExpiresIn: 86400 * 7 \u002F\u002F 7 днів для refresh token\n",[3782,37024,37025,37030,37047,37051,37056,37068],{"__ignoreMap":3865},[3946,37026,37027],{"class":3948,"line":3949},[3946,37028,37029],{"class":4342},"\u002F\u002F ❌ ПОГАНА ПРАКТИКА\n",[3946,37031,37032,37034,37036,37039,37041,37044],{"class":3948,"line":3956},[3946,37033,7026],{"class":13569},[3946,37035,3963],{"class":3952},[3946,37037,37038],{"class":4020},"86400",[3946,37040,7029],{"class":3952},[3946,37042,37043],{"class":4020},"30",[3946,37045,37046],{"class":4342}," \u002F\u002F 30 днів\n",[3946,37048,37049],{"class":3948,"line":3973},[3946,37050,4278],{"emptyLinePlaceholder":4277},[3946,37052,37053],{"class":3948,"line":3986},[3946,37054,37055],{"class":4342},"\u002F\u002F ✅ КРАЩА ПРАКТИКА\n",[3946,37057,37058,37060,37062,37065],{"class":3948,"line":3999},[3946,37059,7026],{"class":13569},[3946,37061,3963],{"class":3952},[3946,37063,37064],{"class":4020},"3600",[3946,37066,37067],{"class":4342}," \u002F\u002F 1 година для access token\n",[3946,37069,37070,37073,37075,37077,37079,37082],{"class":3948,"line":4012},[3946,37071,37072],{"class":13569},"refreshTokenExpiresIn",[3946,37074,3963],{"class":3952},[3946,37076,37038],{"class":4020},[3946,37078,7029],{"class":3952},[3946,37080,37081],{"class":4020},"7",[3946,37083,37084],{"class":4342}," \u002F\u002F 7 днів для refresh token\n",[3847,37086,37088],{"id":37087},"certificate-pinning-для-критичних-додатків","Certificate Pinning для критичних додатків",[3857,37090,37092],{"className":4242,"code":37091,"language":4244,"meta":3865,"style":3865},"\u002F\u002F expo-app-config.js\nmodule.exports = {\n  expo: {\n    ios: {\n      infoPlist: {\n        NSAppTransportSecurity: {\n          NSExceptionDomains: {\n            'api.myapp.com': {\n              NSIncludesSubdomains: true,\n              NSExceptionRequiresForwardSecrecy: true,\n              NSExceptionMinimumTLSVersion: 'TLSv1.2',\n            },\n          },\n        },\n      },\n    },\n    android: {\n      networkSecurityConfig: '.\u002Fnetwork_security_config.xml',\n    },\n  },\n};\n",[3782,37093,37094,37099,37111,37118,37125,37132,37139,37146,37155,37164,37173,37183,37188,37192,37196,37200,37204,37211,37221,37225,37229],{"__ignoreMap":3865},[3946,37095,37096],{"class":3948,"line":3949},[3946,37097,37098],{"class":4342},"\u002F\u002F expo-app-config.js\n",[3946,37100,37101,37104,37106,37109],{"class":3948,"line":3956},[3946,37102,37103],{"class":4403},"module",[3946,37105,4298],{"class":3952},[3946,37107,37108],{"class":4403},"exports",[3946,37110,5893],{"class":3952},[3946,37112,37113,37116],{"class":3948,"line":3973},[3946,37114,37115],{"class":4262},"  expo:",[3946,37117,4427],{"class":3952},[3946,37119,37120,37123],{"class":3948,"line":3986},[3946,37121,37122],{"class":4262},"    ios:",[3946,37124,4427],{"class":3952},[3946,37126,37127,37130],{"class":3948,"line":3999},[3946,37128,37129],{"class":4262},"      infoPlist:",[3946,37131,4427],{"class":3952},[3946,37133,37134,37137],{"class":3948,"line":4012},[3946,37135,37136],{"class":4262},"        NSAppTransportSecurity:",[3946,37138,4427],{"class":3952},[3946,37140,37141,37144],{"class":3948,"line":4026},[3946,37142,37143],{"class":4262},"          NSExceptionDomains:",[3946,37145,4427],{"class":3952},[3946,37147,37148,37151,37153],{"class":3948,"line":4037},[3946,37149,37150],{"class":3966},"            'api.myapp.com'",[3946,37152,8545],{"class":4262},[3946,37154,4427],{"class":3952},[3946,37156,37157,37160,37162],{"class":3948,"line":4487},[3946,37158,37159],{"class":4262},"              NSIncludesSubdomains:",[3946,37161,4960],{"class":4255},[3946,37163,3970],{"class":3952},[3946,37165,37166,37169,37171],{"class":3948,"line":4507},[3946,37167,37168],{"class":4262},"              NSExceptionRequiresForwardSecrecy:",[3946,37170,4960],{"class":4255},[3946,37172,3970],{"class":3952},[3946,37174,37175,37178,37181],{"class":3948,"line":4518},[3946,37176,37177],{"class":4262},"              NSExceptionMinimumTLSVersion:",[3946,37179,37180],{"class":3966}," 'TLSv1.2'",[3946,37182,3970],{"class":3952},[3946,37184,37185],{"class":3948,"line":4524},[3946,37186,37187],{"class":3952},"            },\n",[3946,37189,37190],{"class":3948,"line":4529},[3946,37191,29147],{"class":3952},[3946,37193,37194],{"class":3948,"line":4534},[3946,37195,14311],{"class":3952},[3946,37197,37198],{"class":3948,"line":4540},[3946,37199,8555],{"class":3952},[3946,37201,37202],{"class":3948,"line":4567},[3946,37203,10860],{"class":3952},[3946,37205,37206,37209],{"class":3948,"line":4574},[3946,37207,37208],{"class":4262},"    android:",[3946,37210,4427],{"class":3952},[3946,37212,37213,37216,37219],{"class":3948,"line":4600},[3946,37214,37215],{"class":4262},"      networkSecurityConfig:",[3946,37217,37218],{"class":3966}," '.\u002Fnetwork_security_config.xml'",[3946,37220,3970],{"class":3952},[3946,37222,37223],{"class":3948,"line":4610},[3946,37224,10860],{"class":3952},[3946,37226,37227],{"class":3948,"line":4623},[3946,37228,13271],{"class":3952},[3946,37230,37231],{"class":3948,"line":4643},[3946,37232,13477],{"class":3952},[3750,37234,37236],{"id":37235},"_82-обробка-чутливих-даних","8.2. Обробка Чутливих Даних",[3847,37238,37240],{"id":37239},"не-зберігайте-паролі-локально","Не зберігайте паролі локально",[3857,37242,37244],{"className":4242,"code":37243,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ НІКОЛИ ТАК НЕ РОБІТЬ\nawait SecureStore.setItemAsync('password', userPassword);\n\n\u002F\u002F ✅ ПРАВИЛЬНО — зберігайте лише токени\nawait SecureStore.setItemAsync('accessToken', token);\n",[3782,37245,37246,37251,37272,37276,37281],{"__ignoreMap":3865},[3946,37247,37248],{"class":3948,"line":3949},[3946,37249,37250],{"class":4342},"\u002F\u002F ❌ НІКОЛИ ТАК НЕ РОБІТЬ\n",[3946,37252,37253,37255,37257,37259,37261,37263,37265,37267,37270],{"class":3948,"line":3956},[3946,37254,4293],{"class":4251},[3946,37256,4263],{"class":4262},[3946,37258,4298],{"class":3952},[3946,37260,4439],{"class":4224},[3946,37262,4331],{"class":3952},[3946,37264,26630],{"class":3966},[3946,37266,4447],{"class":3952},[3946,37268,37269],{"class":4262},"userPassword",[3946,37271,4337],{"class":3952},[3946,37273,37274],{"class":3948,"line":3973},[3946,37275,4278],{"emptyLinePlaceholder":4277},[3946,37277,37278],{"class":3948,"line":3986},[3946,37279,37280],{"class":4342},"\u002F\u002F ✅ ПРАВИЛЬНО — зберігайте лише токени\n",[3946,37282,37283,37285,37287,37289,37291,37293,37295,37297,37299],{"class":3948,"line":3999},[3946,37284,4293],{"class":4251},[3946,37286,4263],{"class":4262},[3946,37288,4298],{"class":3952},[3946,37290,4439],{"class":4224},[3946,37292,4331],{"class":3952},[3946,37294,5337],{"class":3966},[3946,37296,4447],{"class":3952},[3946,37298,4398],{"class":4262},[3946,37300,4337],{"class":3952},[3847,37302,37304],{"id":37303},"очищайте-форми-після-logout","Очищайте форми після logout",[3857,37306,37308],{"className":4242,"code":37307,"language":4244,"meta":3865,"style":3865},"const logout = async () => {\n  \u002F\u002F Очищуємо токени\n  await tokenService.clearTokens();\n  \n  \u002F\u002F Очищуємо чутливі дані з пам'яті\n  setUser(null);\n  setEmail('');\n  setPassword('');\n  \n  \u002F\u002F Очищуємо navigation stack\n  navigation.reset({\n    index: 0,\n    routes: [{ name: 'Login' }],\n  });\n};\n",[3782,37309,37310,37326,37331,37343,37347,37352,37363,37374,37385,37389,37394,37405,37414,37431,37435],{"__ignoreMap":3865},[3946,37311,37312,37314,37316,37318,37320,37322,37324],{"class":3948,"line":3949},[3946,37313,4283],{"class":4255},[3946,37315,9202],{"class":4224},[3946,37317,4290],{"class":3952},[3946,37319,4387],{"class":4255},[3946,37321,11004],{"class":3952},[3946,37323,6453],{"class":4255},[3946,37325,4427],{"class":3952},[3946,37327,37328],{"class":3948,"line":3956},[3946,37329,37330],{"class":4342},"  \u002F\u002F Очищуємо токени\n",[3946,37332,37333,37335,37337,37339,37341],{"class":3948,"line":3973},[3946,37334,4935],{"class":4251},[3946,37336,8213],{"class":4262},[3946,37338,4298],{"class":3952},[3946,37340,7382],{"class":4224},[3946,37342,4304],{"class":3952},[3946,37344,37345],{"class":3948,"line":3986},[3946,37346,5795],{"class":3952},[3946,37348,37349],{"class":3948,"line":3999},[3946,37350,37351],{"class":4342},"  \u002F\u002F Очищуємо чутливі дані з пам'яті\n",[3946,37353,37354,37357,37359,37361],{"class":3948,"line":4012},[3946,37355,37356],{"class":4224},"  setUser",[3946,37358,4331],{"class":3952},[3946,37360,4562],{"class":4255},[3946,37362,4337],{"class":3952},[3946,37364,37365,37368,37370,37372],{"class":3948,"line":4026},[3946,37366,37367],{"class":4224},"  setEmail",[3946,37369,4331],{"class":3952},[3946,37371,22990],{"class":3966},[3946,37373,4337],{"class":3952},[3946,37375,37376,37379,37381,37383],{"class":3948,"line":4037},[3946,37377,37378],{"class":4224},"  setPassword",[3946,37380,4331],{"class":3952},[3946,37382,22990],{"class":3966},[3946,37384,4337],{"class":3952},[3946,37386,37387],{"class":3948,"line":4487},[3946,37388,5795],{"class":3952},[3946,37390,37391],{"class":3948,"line":4507},[3946,37392,37393],{"class":4342},"  \u002F\u002F Очищуємо navigation stack\n",[3946,37395,37396,37398,37400,37403],{"class":3948,"line":4518},[3946,37397,22904],{"class":4262},[3946,37399,4298],{"class":3952},[3946,37401,37402],{"class":4224},"reset",[3946,37404,8512],{"class":3952},[3946,37406,37407,37410,37412],{"class":3948,"line":4524},[3946,37408,37409],{"class":4262},"    index:",[3946,37411,30392],{"class":4020},[3946,37413,3970],{"class":3952},[3946,37415,37416,37419,37422,37425,37428],{"class":3948,"line":4529},[3946,37417,37418],{"class":4262},"    routes:",[3946,37420,37421],{"class":3952}," [{ ",[3946,37423,37424],{"class":4262},"name:",[3946,37426,37427],{"class":3966}," 'Login'",[3946,37429,37430],{"class":3952}," }],\n",[3946,37432,37433],{"class":3948,"line":4534},[3946,37434,4977],{"class":3952},[3946,37436,37437],{"class":3948,"line":4540},[3946,37438,13477],{"class":3952},[3847,37440,37442],{"id":37441},"використовуйте-biometric-authentication-для-додаткового-захисту","Використовуйте biometric authentication для додаткового захисту",[3857,37444,37446],{"className":4242,"code":37445,"language":4244,"meta":3865,"style":3865},"import * as LocalAuthentication from 'expo-local-authentication';\n\nasync function authenticateWithBiometrics(): Promise\u003Cboolean> {\n  const hasHardware = await LocalAuthentication.hasHardwareAsync();\n  \n  if (!hasHardware) {\n    return true; \u002F\u002F Fallback — дозволяємо доступ\n  }\n\n  const isEnrolled = await LocalAuthentication.isEnrolledAsync();\n  \n  if (!isEnrolled) {\n    return true; \u002F\u002F Немає зареєстрованих біометричних даних\n  }\n\n  const result = await LocalAuthentication.authenticateAsync({\n    promptMessage: 'Автентифікуйтесь для доступу до нотаток',\n    fallbackLabel: 'Використати пароль',\n    disableDeviceFallback: false,\n  });\n\n  return result.success;\n}\n\n\u002F\u002F Використання при вході в додаток\nuseFocusEffect(\n  useCallback(() => {\n    const authenticate = async () => {\n      const authenticated = await authenticateWithBiometrics();\n      \n      if (!authenticated) {\n        navigation.goBack();\n      }\n    };\n    \n    authenticate();\n  }, [])\n);\n",[3782,37447,37448,37466,37470,37489,37509,37513,37524,37535,37539,37543,37563,37567,37578,37589,37593,37597,37617,37627,37637,37646,37650,37654,37667,37671,37675,37680,37686,37696,37713,37728,37732,37743,37754,37758,37762,37766,37773,37778],{"__ignoreMap":3865},[3946,37449,37450,37452,37454,37456,37459,37461,37464],{"class":3948,"line":3949},[3946,37451,4252],{"class":4251},[3946,37453,4256],{"class":4255},[3946,37455,4259],{"class":4251},[3946,37457,37458],{"class":4262}," LocalAuthentication",[3946,37460,4266],{"class":4251},[3946,37462,37463],{"class":3966}," 'expo-local-authentication'",[3946,37465,4272],{"class":3952},[3946,37467,37468],{"class":3948,"line":3956},[3946,37469,4278],{"emptyLinePlaceholder":4277},[3946,37471,37472,37474,37476,37479,37481,37483,37485,37487],{"class":3948,"line":3973},[3946,37473,4387],{"class":4255},[3946,37475,4390],{"class":4255},[3946,37477,37478],{"class":4224}," authenticateWithBiometrics",[3946,37480,4550],{"class":3952},[3946,37482,4410],{"class":4403},[3946,37484,4413],{"class":3952},[3946,37486,4848],{"class":4403},[3946,37488,4419],{"class":3952},[3946,37490,37491,37493,37496,37498,37500,37502,37504,37507],{"class":3948,"line":3986},[3946,37492,5018],{"class":4255},[3946,37494,37495],{"class":4286}," hasHardware",[3946,37497,4290],{"class":3952},[3946,37499,4293],{"class":4251},[3946,37501,37458],{"class":4262},[3946,37503,4298],{"class":3952},[3946,37505,37506],{"class":4224},"hasHardwareAsync",[3946,37508,4304],{"class":3952},[3946,37510,37511],{"class":3948,"line":3999},[3946,37512,5795],{"class":3952},[3946,37514,37515,37517,37519,37522],{"class":3948,"line":4012},[3946,37516,5776],{"class":4251},[3946,37518,4312],{"class":3952},[3946,37520,37521],{"class":4262},"hasHardware",[3946,37523,4318],{"class":3952},[3946,37525,37526,37528,37530,37532],{"class":3948,"line":4026},[3946,37527,4603],{"class":4251},[3946,37529,4960],{"class":4255},[3946,37531,4851],{"class":3952},[3946,37533,37534],{"class":4342},"\u002F\u002F Fallback — дозволяємо доступ\n",[3946,37536,37537],{"class":3948,"line":4037},[3946,37538,4521],{"class":3952},[3946,37540,37541],{"class":3948,"line":4487},[3946,37542,4278],{"emptyLinePlaceholder":4277},[3946,37544,37545,37547,37550,37552,37554,37556,37558,37561],{"class":3948,"line":4507},[3946,37546,5018],{"class":4255},[3946,37548,37549],{"class":4286}," isEnrolled",[3946,37551,4290],{"class":3952},[3946,37553,4293],{"class":4251},[3946,37555,37458],{"class":4262},[3946,37557,4298],{"class":3952},[3946,37559,37560],{"class":4224},"isEnrolledAsync",[3946,37562,4304],{"class":3952},[3946,37564,37565],{"class":3948,"line":4518},[3946,37566,5795],{"class":3952},[3946,37568,37569,37571,37573,37576],{"class":3948,"line":4524},[3946,37570,5776],{"class":4251},[3946,37572,4312],{"class":3952},[3946,37574,37575],{"class":4262},"isEnrolled",[3946,37577,4318],{"class":3952},[3946,37579,37580,37582,37584,37586],{"class":3948,"line":4529},[3946,37581,4603],{"class":4251},[3946,37583,4960],{"class":4255},[3946,37585,4851],{"class":3952},[3946,37587,37588],{"class":4342},"\u002F\u002F Немає зареєстрованих біометричних даних\n",[3946,37590,37591],{"class":3948,"line":4534},[3946,37592,4521],{"class":3952},[3946,37594,37595],{"class":3948,"line":4540},[3946,37596,4278],{"emptyLinePlaceholder":4277},[3946,37598,37599,37601,37604,37606,37608,37610,37612,37615],{"class":3948,"line":4567},[3946,37600,5018],{"class":4255},[3946,37602,37603],{"class":4286}," result",[3946,37605,4290],{"class":3952},[3946,37607,4293],{"class":4251},[3946,37609,37458],{"class":4262},[3946,37611,4298],{"class":3952},[3946,37613,37614],{"class":4224},"authenticateAsync",[3946,37616,8512],{"class":3952},[3946,37618,37619,37622,37625],{"class":3948,"line":4574},[3946,37620,37621],{"class":4262},"    promptMessage:",[3946,37623,37624],{"class":3966}," 'Автентифікуйтесь для доступу до нотаток'",[3946,37626,3970],{"class":3952},[3946,37628,37629,37632,37635],{"class":3948,"line":4600},[3946,37630,37631],{"class":4262},"    fallbackLabel:",[3946,37633,37634],{"class":3966}," 'Використати пароль'",[3946,37636,3970],{"class":3952},[3946,37638,37639,37642,37644],{"class":3948,"line":4610},[3946,37640,37641],{"class":4262},"    disableDeviceFallback:",[3946,37643,7628],{"class":4255},[3946,37645,3970],{"class":3952},[3946,37647,37648],{"class":3948,"line":4623},[3946,37649,4977],{"class":3952},[3946,37651,37652],{"class":3948,"line":4643},[3946,37653,4278],{"emptyLinePlaceholder":4277},[3946,37655,37656,37658,37660,37662,37665],{"class":3948,"line":4653},[3946,37657,5062],{"class":4251},[3946,37659,37603],{"class":4262},[3946,37661,4298],{"class":3952},[3946,37663,37664],{"class":4262},"success",[3946,37666,4272],{"class":3952},[3946,37668,37669],{"class":3948,"line":4658},[3946,37670,4040],{"class":3952},[3946,37672,37673],{"class":3948,"line":4663},[3946,37674,4278],{"emptyLinePlaceholder":4277},[3946,37676,37677],{"class":3948,"line":4668},[3946,37678,37679],{"class":4342},"\u002F\u002F Використання при вході в додаток\n",[3946,37681,37682,37684],{"class":3948,"line":4674},[3946,37683,28229],{"class":4224},[3946,37685,6594],{"class":3952},[3946,37687,37688,37690,37692,37694],{"class":3948,"line":4694},[3946,37689,10279],{"class":4224},[3946,37691,10707],{"class":3952},[3946,37693,6453],{"class":4255},[3946,37695,4427],{"class":3952},[3946,37697,37698,37700,37703,37705,37707,37709,37711],{"class":3948,"line":4701},[3946,37699,4577],{"class":4255},[3946,37701,37702],{"class":4224}," authenticate",[3946,37704,4290],{"class":3952},[3946,37706,4387],{"class":4255},[3946,37708,11004],{"class":3952},[3946,37710,6453],{"class":4255},[3946,37712,4427],{"class":3952},[3946,37714,37715,37717,37720,37722,37724,37726],{"class":3948,"line":4719},[3946,37716,6984],{"class":4255},[3946,37718,37719],{"class":4286}," authenticated",[3946,37721,4290],{"class":3952},[3946,37723,4293],{"class":4251},[3946,37725,37478],{"class":4224},[3946,37727,4304],{"class":3952},[3946,37729,37730],{"class":3948,"line":4735},[3946,37731,7095],{"class":3952},[3946,37733,37734,37736,37738,37741],{"class":3948,"line":4748},[3946,37735,7246],{"class":4251},[3946,37737,4312],{"class":3952},[3946,37739,37740],{"class":4262},"authenticated",[3946,37742,4318],{"class":3952},[3946,37744,37745,37748,37750,37752],{"class":3948,"line":4768},[3946,37746,37747],{"class":4262},"        navigation",[3946,37749,4298],{"class":3952},[3946,37751,16197],{"class":4224},[3946,37753,4304],{"class":3952},[3946,37755,37756],{"class":3948,"line":4777},[3946,37757,7282],{"class":3952},[3946,37759,37760],{"class":3948,"line":4782},[3946,37761,17258],{"class":3952},[3946,37763,37764],{"class":3948,"line":6262},[3946,37765,7612],{"class":3952},[3946,37767,37768,37771],{"class":3948,"line":6273},[3946,37769,37770],{"class":4224},"    authenticate",[3946,37772,4304],{"class":3952},[3946,37774,37775],{"class":3948,"line":6284},[3946,37776,37777],{"class":3952},"  }, [])\n",[3946,37779,37780],{"class":3948,"line":6299},[3946,37781,4337],{"class":3952},[3750,37783,37785],{"id":37784},"_83-рекомендації-з-ux","8.3. Рекомендації з UX",[3847,37787,37789],{"id":37788},"показуйте-стан-завантаження","Показуйте стан завантаження",[3857,37791,37793],{"className":4242,"code":37792,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ ПОГАНО — користувач не знає, що відбувається\nconst login = async () => {\n  await authApi.login(credentials);\n};\n\n\u002F\u002F ✅ ДОБРЕ — чіткий feedback\nconst login = async () => {\n  setIsLoading(true);\n  try {\n    await authApi.login(credentials);\n    \u002F\u002F Успішний вхід\n  } catch (error) {\n    showError(error.message);\n  } finally {\n    setIsLoading(false);\n  }\n};\n",[3782,37794,37795,37800,37816,37832,37836,37840,37845,37861,37872,37878,37894,37899,37911,37926,37934,37945,37949],{"__ignoreMap":3865},[3946,37796,37797],{"class":3948,"line":3949},[3946,37798,37799],{"class":4342},"\u002F\u002F ❌ ПОГАНО — користувач не знає, що відбувається\n",[3946,37801,37802,37804,37806,37808,37810,37812,37814],{"class":3948,"line":3956},[3946,37803,4283],{"class":4255},[3946,37805,8914],{"class":4224},[3946,37807,4290],{"class":3952},[3946,37809,4387],{"class":4255},[3946,37811,11004],{"class":3952},[3946,37813,6453],{"class":4255},[3946,37815,4427],{"class":3952},[3946,37817,37818,37820,37822,37824,37826,37828,37830],{"class":3948,"line":3973},[3946,37819,4935],{"class":4251},[3946,37821,10106],{"class":4262},[3946,37823,4298],{"class":3952},[3946,37825,11402],{"class":4224},[3946,37827,4331],{"class":3952},[3946,37829,6443],{"class":4262},[3946,37831,4337],{"class":3952},[3946,37833,37834],{"class":3948,"line":3986},[3946,37835,13477],{"class":3952},[3946,37837,37838],{"class":3948,"line":3999},[3946,37839,4278],{"emptyLinePlaceholder":4277},[3946,37841,37842],{"class":3948,"line":4012},[3946,37843,37844],{"class":4342},"\u002F\u002F ✅ ДОБРЕ — чіткий feedback\n",[3946,37846,37847,37849,37851,37853,37855,37857,37859],{"class":3948,"line":4026},[3946,37848,4283],{"class":4255},[3946,37850,8914],{"class":4224},[3946,37852,4290],{"class":3952},[3946,37854,4387],{"class":4255},[3946,37856,11004],{"class":3952},[3946,37858,6453],{"class":4255},[3946,37860,4427],{"class":3952},[3946,37862,37863,37866,37868,37870],{"class":3948,"line":4037},[3946,37864,37865],{"class":4224},"  setIsLoading",[3946,37867,4331],{"class":3952},[3946,37869,17493],{"class":4255},[3946,37871,4337],{"class":3952},[3946,37873,37874,37876],{"class":3948,"line":4487},[3946,37875,4424],{"class":4251},[3946,37877,4427],{"class":3952},[3946,37879,37880,37882,37884,37886,37888,37890,37892],{"class":3948,"line":4507},[3946,37881,4432],{"class":4251},[3946,37883,10106],{"class":4262},[3946,37885,4298],{"class":3952},[3946,37887,11402],{"class":4224},[3946,37889,4331],{"class":3952},[3946,37891,6443],{"class":4262},[3946,37893,4337],{"class":3952},[3946,37895,37896],{"class":3948,"line":4518},[3946,37897,37898],{"class":4342},"    \u002F\u002F Успішний вхід\n",[3946,37900,37901,37903,37905,37907,37909],{"class":3948,"line":4524},[3946,37902,4473],{"class":3952},[3946,37904,4476],{"class":4251},[3946,37906,4479],{"class":3952},[3946,37908,4482],{"class":4262},[3946,37910,4318],{"class":3952},[3946,37912,37913,37916,37918,37920,37922,37924],{"class":3948,"line":4529},[3946,37914,37915],{"class":4224},"    showError",[3946,37917,4331],{"class":3952},[3946,37919,4482],{"class":4262},[3946,37921,4298],{"class":3952},[3946,37923,5543],{"class":4262},[3946,37925,4337],{"class":3952},[3946,37927,37928,37930,37932],{"class":3948,"line":4534},[3946,37929,4473],{"class":3952},[3946,37931,12029],{"class":4251},[3946,37933,4427],{"class":3952},[3946,37935,37936,37939,37941,37943],{"class":3948,"line":4540},[3946,37937,37938],{"class":4224},"    setIsLoading",[3946,37940,4331],{"class":3952},[3946,37942,13575],{"class":4255},[3946,37944,4337],{"class":3952},[3946,37946,37947],{"class":3948,"line":4567},[3946,37948,4521],{"class":3952},[3946,37950,37951],{"class":3948,"line":4574},[3946,37952,13477],{"class":3952},[3847,37954,37956],{"id":37955},"зрозумілі-повідомлення-про-помилки","Зрозумілі повідомлення про помилки",[3857,37958,37960],{"className":4242,"code":37959,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ ПОГАНО\nAlert.alert('Error', error.message);\n\n\u002F\u002F ✅ ДОБРЕ\nfunction handleAuthError(error: Error) {\n  let userMessage = 'Щось пішло не так. Спробуйте ще раз.';\n  \n  if (error.message.includes('401')) {\n    userMessage = 'Невірний email або пароль. Перевірте дані та спробуйте знову.';\n  } else if (error.message.includes('network')) {\n    userMessage = 'Проблема з підключенням до інтернету. Перевірте з\\'єднання.';\n  } else if (error.message.includes('timeout')) {\n    userMessage = 'Сервер не відповідає. Спробуйте пізніше.';\n  }\n  \n  Alert.alert('Помилка входу', userMessage, [\n    { text: 'OK', style: 'default' },\n    { text: 'Допомога', onPress: () => navigation.navigate('Help') },\n  ]);\n}\n",[3782,37961,37962,37967,37991,37995,38000,38017,38032,38036,38060,38072,38099,38115,38142,38153,38157,38161,38181,38198,38231,38236],{"__ignoreMap":3865},[3946,37963,37964],{"class":3948,"line":3949},[3946,37965,37966],{"class":4342},"\u002F\u002F ❌ ПОГАНО\n",[3946,37968,37969,37972,37974,37976,37978,37981,37983,37985,37987,37989],{"class":3948,"line":3956},[3946,37970,37971],{"class":4262},"Alert",[3946,37973,4298],{"class":3952},[3946,37975,23542],{"class":4224},[3946,37977,4331],{"class":3952},[3946,37979,37980],{"class":3966},"'Error'",[3946,37982,4447],{"class":3952},[3946,37984,4482],{"class":4262},[3946,37986,4298],{"class":3952},[3946,37988,5543],{"class":4262},[3946,37990,4337],{"class":3952},[3946,37992,37993],{"class":3948,"line":3973},[3946,37994,4278],{"emptyLinePlaceholder":4277},[3946,37996,37997],{"class":3948,"line":3986},[3946,37998,37999],{"class":4342},"\u002F\u002F ✅ ДОБРЕ\n",[3946,38001,38002,38004,38007,38009,38011,38013,38015],{"class":3948,"line":3999},[3946,38003,14029],{"class":4255},[3946,38005,38006],{"class":4224}," handleAuthError",[3946,38008,4331],{"class":3952},[3946,38010,4482],{"class":4262},[3946,38012,3963],{"class":3952},[3946,38014,9695],{"class":4403},[3946,38016,4318],{"class":3952},[3946,38018,38019,38022,38025,38027,38030],{"class":3948,"line":4012},[3946,38020,38021],{"class":4255},"  let",[3946,38023,38024],{"class":4262}," userMessage",[3946,38026,4290],{"class":3952},[3946,38028,38029],{"class":3966},"'Щось пішло не так. Спробуйте ще раз.'",[3946,38031,4272],{"class":3952},[3946,38033,38034],{"class":3948,"line":4026},[3946,38035,5795],{"class":3952},[3946,38037,38038,38040,38042,38044,38046,38048,38050,38053,38055,38058],{"class":3948,"line":4037},[3946,38039,5776],{"class":4251},[3946,38041,4479],{"class":3952},[3946,38043,4482],{"class":4262},[3946,38045,4298],{"class":3952},[3946,38047,5543],{"class":4262},[3946,38049,4298],{"class":3952},[3946,38051,38052],{"class":4224},"includes",[3946,38054,4331],{"class":3952},[3946,38056,38057],{"class":3966},"'401'",[3946,38059,9718],{"class":3952},[3946,38061,38062,38065,38067,38070],{"class":3948,"line":4487},[3946,38063,38064],{"class":4262},"    userMessage",[3946,38066,4290],{"class":3952},[3946,38068,38069],{"class":3966},"'Невірний email або пароль. Перевірте дані та спробуйте знову.'",[3946,38071,4272],{"class":3952},[3946,38073,38074,38076,38078,38080,38082,38084,38086,38088,38090,38092,38094,38097],{"class":3948,"line":4507},[3946,38075,4473],{"class":3952},[3946,38077,23192],{"class":4251},[3946,38079,23195],{"class":4251},[3946,38081,4479],{"class":3952},[3946,38083,4482],{"class":4262},[3946,38085,4298],{"class":3952},[3946,38087,5543],{"class":4262},[3946,38089,4298],{"class":3952},[3946,38091,38052],{"class":4224},[3946,38093,4331],{"class":3952},[3946,38095,38096],{"class":3966},"'network'",[3946,38098,9718],{"class":3952},[3946,38100,38101,38103,38105,38108,38110,38113],{"class":3948,"line":4518},[3946,38102,38064],{"class":4262},[3946,38104,4290],{"class":3952},[3946,38106,38107],{"class":3966},"'Проблема з підключенням до інтернету. Перевірте з",[3946,38109,23169],{"class":23168},[3946,38111,38112],{"class":3966},"єднання.'",[3946,38114,4272],{"class":3952},[3946,38116,38117,38119,38121,38123,38125,38127,38129,38131,38133,38135,38137,38140],{"class":3948,"line":4524},[3946,38118,4473],{"class":3952},[3946,38120,23192],{"class":4251},[3946,38122,23195],{"class":4251},[3946,38124,4479],{"class":3952},[3946,38126,4482],{"class":4262},[3946,38128,4298],{"class":3952},[3946,38130,5543],{"class":4262},[3946,38132,4298],{"class":3952},[3946,38134,38052],{"class":4224},[3946,38136,4331],{"class":3952},[3946,38138,38139],{"class":3966},"'timeout'",[3946,38141,9718],{"class":3952},[3946,38143,38144,38146,38148,38151],{"class":3948,"line":4529},[3946,38145,38064],{"class":4262},[3946,38147,4290],{"class":3952},[3946,38149,38150],{"class":3966},"'Сервер не відповідає. Спробуйте пізніше.'",[3946,38152,4272],{"class":3952},[3946,38154,38155],{"class":3948,"line":4534},[3946,38156,4521],{"class":3952},[3946,38158,38159],{"class":3948,"line":4540},[3946,38160,5795],{"class":3952},[3946,38162,38163,38165,38167,38169,38171,38174,38176,38179],{"class":3948,"line":4567},[3946,38164,22754],{"class":4262},[3946,38166,4298],{"class":3952},[3946,38168,23542],{"class":4224},[3946,38170,4331],{"class":3952},[3946,38172,38173],{"class":3966},"'Помилка входу'",[3946,38175,4447],{"class":3952},[3946,38177,38178],{"class":4262},"userMessage",[3946,38180,31550],{"class":3952},[3946,38182,38183,38185,38187,38189,38191,38193,38196],{"class":3948,"line":4574},[3946,38184,19974],{"class":3952},[3946,38186,23571],{"class":4262},[3946,38188,23574],{"class":3966},[3946,38190,4447],{"class":3952},[3946,38192,28961],{"class":4262},[3946,38194,38195],{"class":3966}," 'default'",[3946,38197,19998],{"class":3952},[3946,38199,38200,38202,38204,38207,38209,38211,38213,38215,38217,38219,38221,38223,38225,38228],{"class":3948,"line":4600},[3946,38201,19974],{"class":3952},[3946,38203,23571],{"class":4262},[3946,38205,38206],{"class":3966}," 'Допомога'",[3946,38208,4447],{"class":3952},[3946,38210,15204],{"class":4224},[3946,38212,8545],{"class":4262},[3946,38214,11004],{"class":3952},[3946,38216,6453],{"class":4255},[3946,38218,15004],{"class":4262},[3946,38220,4298],{"class":3952},[3946,38222,23635],{"class":4224},[3946,38224,4331],{"class":3952},[3946,38226,38227],{"class":3966},"'Help'",[3946,38229,38230],{"class":3952},") },\n",[3946,38232,38233],{"class":3948,"line":4610},[3946,38234,38235],{"class":3952},"  ]);\n",[3946,38237,38238],{"class":3948,"line":4623},[3946,38239,4040],{"class":3952},[3847,38241,38243],{"id":38242},"remember-me-функціональність","Remember Me функціональність",[3857,38245,38247],{"className":4242,"code":38246,"language":4244,"meta":3865,"style":3865},"const [rememberMe, setRememberMe] = useState(false);\n\nconst login = async () => {\n  const response = await authApi.login(credentials);\n  \n  if (rememberMe) {\n    \u002F\u002F Зберігаємо токени для автоматичного входу\n    await tokenService.saveTokens(\n      response.accessToken,\n      response.refreshToken,\n      response.expiresIn\n    );\n  } else {\n    \u002F\u002F Зберігаємо лише в RAM (session storage)\n    \u002F\u002F або з коротшим lifetime\n  }\n};\n",[3782,38248,38249,38273,38277,38293,38315,38319,38329,38334,38346,38357,38367,38375,38379,38387,38392,38397,38401],{"__ignoreMap":3865},[3946,38250,38251,38253,38255,38258,38260,38263,38265,38267,38269,38271],{"class":3948,"line":3949},[3946,38252,4283],{"class":4255},[3946,38254,10529],{"class":3952},[3946,38256,38257],{"class":4286},"rememberMe",[3946,38259,4447],{"class":3952},[3946,38261,38262],{"class":4286},"setRememberMe",[3946,38264,10540],{"class":3952},[3946,38266,10543],{"class":4224},[3946,38268,4331],{"class":3952},[3946,38270,13575],{"class":4255},[3946,38272,4337],{"class":3952},[3946,38274,38275],{"class":3948,"line":3956},[3946,38276,4278],{"emptyLinePlaceholder":4277},[3946,38278,38279,38281,38283,38285,38287,38289,38291],{"class":3948,"line":3973},[3946,38280,4283],{"class":4255},[3946,38282,8914],{"class":4224},[3946,38284,4290],{"class":3952},[3946,38286,4387],{"class":4255},[3946,38288,11004],{"class":3952},[3946,38290,6453],{"class":4255},[3946,38292,4427],{"class":3952},[3946,38294,38295,38297,38299,38301,38303,38305,38307,38309,38311,38313],{"class":3948,"line":3986},[3946,38296,5018],{"class":4255},[3946,38298,8776],{"class":4286},[3946,38300,4290],{"class":3952},[3946,38302,4293],{"class":4251},[3946,38304,10106],{"class":4262},[3946,38306,4298],{"class":3952},[3946,38308,11402],{"class":4224},[3946,38310,4331],{"class":3952},[3946,38312,6443],{"class":4262},[3946,38314,4337],{"class":3952},[3946,38316,38317],{"class":3948,"line":3999},[3946,38318,5795],{"class":3952},[3946,38320,38321,38323,38325,38327],{"class":3948,"line":4012},[3946,38322,5776],{"class":4251},[3946,38324,4479],{"class":3952},[3946,38326,38257],{"class":4262},[3946,38328,4318],{"class":3952},[3946,38330,38331],{"class":3948,"line":4026},[3946,38332,38333],{"class":4342},"    \u002F\u002F Зберігаємо токени для автоматичного входу\n",[3946,38335,38336,38338,38340,38342,38344],{"class":3948,"line":4037},[3946,38337,4432],{"class":4251},[3946,38339,8213],{"class":4262},[3946,38341,4298],{"class":3952},[3946,38343,7869],{"class":4224},[3946,38345,6594],{"class":3952},[3946,38347,38348,38351,38353,38355],{"class":3948,"line":4487},[3946,38349,38350],{"class":4262},"      response",[3946,38352,4298],{"class":3952},[3946,38354,7334],{"class":4262},[3946,38356,3970],{"class":3952},[3946,38358,38359,38361,38363,38365],{"class":3948,"line":4507},[3946,38360,38350],{"class":4262},[3946,38362,4298],{"class":3952},[3946,38364,5363],{"class":4262},[3946,38366,3970],{"class":3952},[3946,38368,38369,38371,38373],{"class":3948,"line":4518},[3946,38370,38350],{"class":4262},[3946,38372,4298],{"class":3952},[3946,38374,11459],{"class":4262},[3946,38376,38377],{"class":3948,"line":4524},[3946,38378,8731],{"class":3952},[3946,38380,38381,38383,38385],{"class":3948,"line":4529},[3946,38382,4473],{"class":3952},[3946,38384,23192],{"class":4251},[3946,38386,4427],{"class":3952},[3946,38388,38389],{"class":3948,"line":4534},[3946,38390,38391],{"class":4342},"    \u002F\u002F Зберігаємо лише в RAM (session storage)\n",[3946,38393,38394],{"class":3948,"line":4540},[3946,38395,38396],{"class":4342},"    \u002F\u002F або з коротшим lifetime\n",[3946,38398,38399],{"class":3948,"line":4567},[3946,38400,4521],{"class":3952},[3946,38402,38403],{"class":3948,"line":4574},[3946,38404,13477],{"class":3952},[3750,38406,38408],{"id":38407},"_84-тестування-автентифікації","8.4. Тестування Автентифікації",[3847,38410,38412],{"id":38411},"unit-tests-для-token-service","Unit Tests для Token Service",[3857,38414,38416],{"className":4242,"code":38415,"language":4244,"meta":3865,"style":3865},"\u002F\u002F tokenService.test.ts\nimport { tokenService } from '..\u002Fservices\u002FtokenService';\nimport * as SecureStore from 'expo-secure-store';\n\njest.mock('expo-secure-store');\n\ndescribe('TokenService', () => {\n  beforeEach(() => {\n    jest.clearAllMocks();\n  });\n\n  describe('saveTokens', () => {\n    it('should save tokens to SecureStore', async () => {\n      const accessToken = 'test-access-token';\n      const refreshToken = 'test-refresh-token';\n      const expiresIn = 3600;\n\n      await tokenService.saveTokens(accessToken, refreshToken, expiresIn);\n\n      expect(SecureStore.setItemAsync).toHaveBeenCalledWith(\n        '@secure-notes\u002Ftokens',\n        expect.stringContaining(accessToken)\n      );\n    });\n  });\n\n  describe('isTokenValid', () => {\n    it('should return true for valid token', async () => {\n      const futureTimestamp = Date.now() + 7200000; \u002F\u002F +2 hours\n      \n      (SecureStore.getItemAsync as jest.Mock).mockResolvedValue(\n        JSON.stringify({\n          accessToken: 'token',\n          refreshToken: 'refresh',\n          expiresAt: futureTimestamp,\n        })\n      );\n\n      const isValid = await tokenService.isTokenValid();\n      expect(isValid).toBe(true);\n    });\n\n    it('should return false for expired token', async () => {\n      const pastTimestamp = Date.now() - 3600000; \u002F\u002F -1 hour\n      \n      (SecureStore.getItemAsync as jest.Mock).mockResolvedValue(\n        JSON.stringify({\n          accessToken: 'token',\n          refreshToken: 'refresh',\n          expiresAt: pastTimestamp,\n        })\n      );\n\n      const isValid = await tokenService.isTokenValid();\n      expect(isValid).toBe(false);\n    });\n  });\n});\n",[3782,38417,38418,38423,38439,38455,38459,38476,38480,38496,38507,38519,38523,38527,38543,38563,38576,38589,38602,38606,38630,38634,38655,38662,38678,38682,38686,38690,38694,38709,38728,38753,38757,38784,38795,38805,38815,38824,38829,38833,38837,38855,38874,38878,38882,38901,38927,38931,38955,38965,38973,38981,38989,38993,38997,39001,39019,39037,39041,39045],{"__ignoreMap":3865},[3946,38419,38420],{"class":3948,"line":3949},[3946,38421,38422],{"class":4342},"\u002F\u002F tokenService.test.ts\n",[3946,38424,38425,38427,38429,38431,38433,38435,38437],{"class":3948,"line":3956},[3946,38426,4252],{"class":4251},[3946,38428,6817],{"class":3952},[3946,38430,8362],{"class":4262},[3946,38432,6823],{"class":3952},[3946,38434,6826],{"class":4251},[3946,38436,8369],{"class":3966},[3946,38438,4272],{"class":3952},[3946,38440,38441,38443,38445,38447,38449,38451,38453],{"class":3948,"line":3973},[3946,38442,4252],{"class":4251},[3946,38444,4256],{"class":4255},[3946,38446,4259],{"class":4251},[3946,38448,4263],{"class":4262},[3946,38450,4266],{"class":4251},[3946,38452,4269],{"class":3966},[3946,38454,4272],{"class":3952},[3946,38456,38457],{"class":3948,"line":3986},[3946,38458,4278],{"emptyLinePlaceholder":4277},[3946,38460,38461,38464,38466,38469,38471,38474],{"class":3948,"line":3999},[3946,38462,38463],{"class":4262},"jest",[3946,38465,4298],{"class":3952},[3946,38467,38468],{"class":4224},"mock",[3946,38470,4331],{"class":3952},[3946,38472,38473],{"class":3966},"'expo-secure-store'",[3946,38475,4337],{"class":3952},[3946,38477,38478],{"class":3948,"line":4012},[3946,38479,4278],{"emptyLinePlaceholder":4277},[3946,38481,38482,38485,38487,38490,38492,38494],{"class":3948,"line":4026},[3946,38483,38484],{"class":4224},"describe",[3946,38486,4331],{"class":3952},[3946,38488,38489],{"class":3966},"'TokenService'",[3946,38491,21200],{"class":3952},[3946,38493,6453],{"class":4255},[3946,38495,4427],{"class":3952},[3946,38497,38498,38501,38503,38505],{"class":3948,"line":4037},[3946,38499,38500],{"class":4224},"  beforeEach",[3946,38502,10707],{"class":3952},[3946,38504,6453],{"class":4255},[3946,38506,4427],{"class":3952},[3946,38508,38509,38512,38514,38517],{"class":3948,"line":4487},[3946,38510,38511],{"class":4262},"    jest",[3946,38513,4298],{"class":3952},[3946,38515,38516],{"class":4224},"clearAllMocks",[3946,38518,4304],{"class":3952},[3946,38520,38521],{"class":3948,"line":4507},[3946,38522,4977],{"class":3952},[3946,38524,38525],{"class":3948,"line":4518},[3946,38526,4278],{"emptyLinePlaceholder":4277},[3946,38528,38529,38532,38534,38537,38539,38541],{"class":3948,"line":4524},[3946,38530,38531],{"class":4224},"  describe",[3946,38533,4331],{"class":3952},[3946,38535,38536],{"class":3966},"'saveTokens'",[3946,38538,21200],{"class":3952},[3946,38540,6453],{"class":4255},[3946,38542,4427],{"class":3952},[3946,38544,38545,38548,38550,38553,38555,38557,38559,38561],{"class":3948,"line":4529},[3946,38546,38547],{"class":4224},"    it",[3946,38549,4331],{"class":3952},[3946,38551,38552],{"class":3966},"'should save tokens to SecureStore'",[3946,38554,4447],{"class":3952},[3946,38556,4387],{"class":4255},[3946,38558,11004],{"class":3952},[3946,38560,6453],{"class":4255},[3946,38562,4427],{"class":3952},[3946,38564,38565,38567,38569,38571,38574],{"class":3948,"line":4534},[3946,38566,6984],{"class":4255},[3946,38568,19957],{"class":4286},[3946,38570,4290],{"class":3952},[3946,38572,38573],{"class":3966},"'test-access-token'",[3946,38575,4272],{"class":3952},[3946,38577,38578,38580,38582,38584,38587],{"class":3948,"line":4540},[3946,38579,6984],{"class":4255},[3946,38581,9307],{"class":4286},[3946,38583,4290],{"class":3952},[3946,38585,38586],{"class":3966},"'test-refresh-token'",[3946,38588,4272],{"class":3952},[3946,38590,38591,38593,38596,38598,38600],{"class":3948,"line":4567},[3946,38592,6984],{"class":4255},[3946,38594,38595],{"class":4286}," expiresIn",[3946,38597,4290],{"class":3952},[3946,38599,37064],{"class":4020},[3946,38601,4272],{"class":3952},[3946,38603,38604],{"class":3948,"line":4574},[3946,38605,4278],{"emptyLinePlaceholder":4277},[3946,38607,38608,38610,38612,38614,38616,38618,38620,38622,38624,38626,38628],{"class":3948,"line":4600},[3946,38609,7069],{"class":4251},[3946,38611,8213],{"class":4262},[3946,38613,4298],{"class":3952},[3946,38615,7869],{"class":4224},[3946,38617,4331],{"class":3952},[3946,38619,7334],{"class":4262},[3946,38621,4447],{"class":3952},[3946,38623,5363],{"class":4262},[3946,38625,4447],{"class":3952},[3946,38627,7026],{"class":4262},[3946,38629,4337],{"class":3952},[3946,38631,38632],{"class":3948,"line":4610},[3946,38633,4278],{"emptyLinePlaceholder":4277},[3946,38635,38636,38639,38641,38644,38646,38648,38650,38653],{"class":3948,"line":4623},[3946,38637,38638],{"class":4224},"      expect",[3946,38640,4331],{"class":3952},[3946,38642,38643],{"class":4262},"SecureStore",[3946,38645,4298],{"class":3952},[3946,38647,4439],{"class":4262},[3946,38649,19644],{"class":3952},[3946,38651,38652],{"class":4224},"toHaveBeenCalledWith",[3946,38654,6594],{"class":3952},[3946,38656,38657,38660],{"class":3948,"line":4643},[3946,38658,38659],{"class":3966},"        '@secure-notes\u002Ftokens'",[3946,38661,3970],{"class":3952},[3946,38663,38664,38667,38669,38672,38674,38676],{"class":3948,"line":4653},[3946,38665,38666],{"class":4262},"        expect",[3946,38668,4298],{"class":3952},[3946,38670,38671],{"class":4224},"stringContaining",[3946,38673,4331],{"class":3952},[3946,38675,7334],{"class":4262},[3946,38677,8726],{"class":3952},[3946,38679,38680],{"class":3948,"line":4658},[3946,38681,8984],{"class":3952},[3946,38683,38684],{"class":3948,"line":4663},[3946,38685,8560],{"class":3952},[3946,38687,38688],{"class":3948,"line":4668},[3946,38689,4977],{"class":3952},[3946,38691,38692],{"class":3948,"line":4674},[3946,38693,4278],{"emptyLinePlaceholder":4277},[3946,38695,38696,38698,38700,38703,38705,38707],{"class":3948,"line":4694},[3946,38697,38531],{"class":4224},[3946,38699,4331],{"class":3952},[3946,38701,38702],{"class":3966},"'isTokenValid'",[3946,38704,21200],{"class":3952},[3946,38706,6453],{"class":4255},[3946,38708,4427],{"class":3952},[3946,38710,38711,38713,38715,38718,38720,38722,38724,38726],{"class":3948,"line":4701},[3946,38712,38547],{"class":4224},[3946,38714,4331],{"class":3952},[3946,38716,38717],{"class":3966},"'should return true for valid token'",[3946,38719,4447],{"class":3952},[3946,38721,4387],{"class":4255},[3946,38723,11004],{"class":3952},[3946,38725,6453],{"class":4255},[3946,38727,4427],{"class":3952},[3946,38729,38730,38732,38735,38737,38739,38741,38743,38745,38748,38750],{"class":3948,"line":4719},[3946,38731,6984],{"class":4255},[3946,38733,38734],{"class":4286}," futureTimestamp",[3946,38736,4290],{"class":3952},[3946,38738,7663],{"class":4262},[3946,38740,4298],{"class":3952},[3946,38742,7020],{"class":4224},[3946,38744,7023],{"class":3952},[3946,38746,38747],{"class":4020},"7200000",[3946,38749,4851],{"class":3952},[3946,38751,38752],{"class":4342},"\u002F\u002F +2 hours\n",[3946,38754,38755],{"class":3948,"line":4735},[3946,38756,7095],{"class":3952},[3946,38758,38759,38761,38763,38765,38767,38769,38772,38774,38777,38779,38782],{"class":3948,"line":4748},[3946,38760,8706],{"class":3952},[3946,38762,38643],{"class":4262},[3946,38764,4298],{"class":3952},[3946,38766,4591],{"class":4262},[3946,38768,4259],{"class":4251},[3946,38770,38771],{"class":4403}," jest",[3946,38773,4298],{"class":3952},[3946,38775,38776],{"class":4403},"Mock",[3946,38778,19644],{"class":3952},[3946,38780,38781],{"class":4224},"mockResolvedValue",[3946,38783,6594],{"class":3952},[3946,38785,38786,38789,38791,38793],{"class":3948,"line":4768},[3946,38787,38788],{"class":4286},"        JSON",[3946,38790,4298],{"class":3952},[3946,38792,5690],{"class":4224},[3946,38794,8512],{"class":3952},[3946,38796,38797,38800,38803],{"class":3948,"line":4777},[3946,38798,38799],{"class":4262},"          accessToken:",[3946,38801,38802],{"class":3966}," 'token'",[3946,38804,3970],{"class":3952},[3946,38806,38807,38810,38813],{"class":3948,"line":4782},[3946,38808,38809],{"class":4262},"          refreshToken:",[3946,38811,38812],{"class":3966}," 'refresh'",[3946,38814,3970],{"class":3952},[3946,38816,38817,38820,38822],{"class":3948,"line":6262},[3946,38818,38819],{"class":4262},"          expiresAt:",[3946,38821,38734],{"class":4262},[3946,38823,3970],{"class":3952},[3946,38825,38826],{"class":3948,"line":6273},[3946,38827,38828],{"class":3952},"        })\n",[3946,38830,38831],{"class":3948,"line":6284},[3946,38832,8984],{"class":3952},[3946,38834,38835],{"class":3948,"line":6299},[3946,38836,4278],{"emptyLinePlaceholder":4277},[3946,38838,38839,38841,38843,38845,38847,38849,38851,38853],{"class":3948,"line":6304},[3946,38840,6984],{"class":4255},[3946,38842,7649],{"class":4286},[3946,38844,4290],{"class":3952},[3946,38846,4293],{"class":4251},[3946,38848,8213],{"class":4262},[3946,38850,4298],{"class":3952},[3946,38852,11127],{"class":4224},[3946,38854,4304],{"class":3952},[3946,38856,38857,38859,38861,38863,38865,38868,38870,38872],{"class":3948,"line":6309},[3946,38858,38638],{"class":4224},[3946,38860,4331],{"class":3952},[3946,38862,7689],{"class":4262},[3946,38864,19644],{"class":3952},[3946,38866,38867],{"class":4224},"toBe",[3946,38869,4331],{"class":3952},[3946,38871,17493],{"class":4255},[3946,38873,4337],{"class":3952},[3946,38875,38876],{"class":3948,"line":6314},[3946,38877,8560],{"class":3952},[3946,38879,38880],{"class":3948,"line":6320},[3946,38881,4278],{"emptyLinePlaceholder":4277},[3946,38883,38884,38886,38888,38891,38893,38895,38897,38899],{"class":3948,"line":6325},[3946,38885,38547],{"class":4224},[3946,38887,4331],{"class":3952},[3946,38889,38890],{"class":3966},"'should return false for expired token'",[3946,38892,4447],{"class":3952},[3946,38894,4387],{"class":4255},[3946,38896,11004],{"class":3952},[3946,38898,6453],{"class":4255},[3946,38900,4427],{"class":3952},[3946,38902,38903,38905,38908,38910,38912,38914,38916,38919,38922,38924],{"class":3948,"line":6337},[3946,38904,6984],{"class":4255},[3946,38906,38907],{"class":4286}," pastTimestamp",[3946,38909,4290],{"class":3952},[3946,38911,7663],{"class":4262},[3946,38913,4298],{"class":3952},[3946,38915,7020],{"class":4224},[3946,38917,38918],{"class":3952},"() - ",[3946,38920,38921],{"class":4020},"3600000",[3946,38923,4851],{"class":3952},[3946,38925,38926],{"class":4342},"\u002F\u002F -1 hour\n",[3946,38928,38929],{"class":3948,"line":6352},[3946,38930,7095],{"class":3952},[3946,38932,38933,38935,38937,38939,38941,38943,38945,38947,38949,38951,38953],{"class":3948,"line":6364},[3946,38934,8706],{"class":3952},[3946,38936,38643],{"class":4262},[3946,38938,4298],{"class":3952},[3946,38940,4591],{"class":4262},[3946,38942,4259],{"class":4251},[3946,38944,38771],{"class":4403},[3946,38946,4298],{"class":3952},[3946,38948,38776],{"class":4403},[3946,38950,19644],{"class":3952},[3946,38952,38781],{"class":4224},[3946,38954,6594],{"class":3952},[3946,38956,38957,38959,38961,38963],{"class":3948,"line":6376},[3946,38958,38788],{"class":4286},[3946,38960,4298],{"class":3952},[3946,38962,5690],{"class":4224},[3946,38964,8512],{"class":3952},[3946,38966,38967,38969,38971],{"class":3948,"line":6392},[3946,38968,38799],{"class":4262},[3946,38970,38802],{"class":3966},[3946,38972,3970],{"class":3952},[3946,38974,38975,38977,38979],{"class":3948,"line":6397},[3946,38976,38809],{"class":4262},[3946,38978,38812],{"class":3966},[3946,38980,3970],{"class":3952},[3946,38982,38983,38985,38987],{"class":3948,"line":6402},[3946,38984,38819],{"class":4262},[3946,38986,38907],{"class":4262},[3946,38988,3970],{"class":3952},[3946,38990,38991],{"class":3948,"line":6407},[3946,38992,38828],{"class":3952},[3946,38994,38995],{"class":3948,"line":6413},[3946,38996,8984],{"class":3952},[3946,38998,38999],{"class":3948,"line":6418},[3946,39000,4278],{"emptyLinePlaceholder":4277},[3946,39002,39003,39005,39007,39009,39011,39013,39015,39017],{"class":3948,"line":6434},[3946,39004,6984],{"class":4255},[3946,39006,7649],{"class":4286},[3946,39008,4290],{"class":3952},[3946,39010,4293],{"class":4251},[3946,39012,8213],{"class":4262},[3946,39014,4298],{"class":3952},[3946,39016,11127],{"class":4224},[3946,39018,4304],{"class":3952},[3946,39020,39021,39023,39025,39027,39029,39031,39033,39035],{"class":3948,"line":6466},[3946,39022,38638],{"class":4224},[3946,39024,4331],{"class":3952},[3946,39026,7689],{"class":4262},[3946,39028,19644],{"class":3952},[3946,39030,38867],{"class":4224},[3946,39032,4331],{"class":3952},[3946,39034,13575],{"class":4255},[3946,39036,4337],{"class":3952},[3946,39038,39039],{"class":3948,"line":6493},[3946,39040,8560],{"class":3952},[3946,39042,39043],{"class":3948,"line":6512},[3946,39044,4977],{"class":3952},[3946,39046,39047],{"class":3948,"line":6530},[3946,39048,13276],{"class":3952},[3847,39050,39052],{"id":39051},"integration-tests-для-auth-flow","Integration Tests для Auth Flow",[3857,39054,39056],{"className":4242,"code":39055,"language":4244,"meta":3865,"style":3865},"\u002F\u002F authFlow.test.tsx\nimport { render, fireEvent, waitFor } from '@testing-library\u002Freact-native';\nimport { LoginScreen } from '..\u002Fscreens\u002FLoginScreen';\nimport { AuthProvider } from '..\u002Fcontext\u002FAuthContext';\n\ndescribe('Auth Flow', () => {\n  it('should login successfully with valid credentials', async () => {\n    const { getByPlaceholderText, getByText } = render(\n      \u003CAuthProvider>\n        \u003CLoginScreen \u002F>\n      \u003C\u002FAuthProvider>\n    );\n\n    const emailInput = getByPlaceholderText('example@email.com');\n    const passwordInput = getByPlaceholderText('Введіть пароль');\n    const loginButton = getByText('Увійти');\n\n    fireEvent.changeText(emailInput, 'demo@example.com');\n    fireEvent.changeText(passwordInput, 'password123');\n    fireEvent.press(loginButton);\n\n    await waitFor(() => {\n      \u002F\u002F Перевіряємо, що користувач перенаправлений\n      expect(navigation.navigate).toHaveBeenCalledWith('MainTabs');\n    });\n  });\n\n  it('should show error for invalid credentials', async () => {\n    const { getByPlaceholderText, getByText, findByText } = render(\n      \u003CAuthProvider>\n        \u003CLoginScreen \u002F>\n      \u003C\u002FAuthProvider>\n    );\n\n    const emailInput = getByPlaceholderText('example@email.com');\n    const passwordInput = getByPlaceholderText('Введіть пароль');\n    const loginButton = getByText('Увійти');\n\n    fireEvent.changeText(emailInput, 'wrong@example.com');\n    fireEvent.changeText(passwordInput, 'wrongpassword');\n    fireEvent.press(loginButton);\n\n    const errorMessage = await findByText(\u002FНевірний email або пароль\u002Fi);\n    expect(errorMessage).toBeTruthy();\n  });\n});\n",[3782,39057,39058,39063,39091,39108,39124,39128,39143,39163,39183,39191,39199,39207,39211,39215,39233,39251,39269,39273,39295,39315,39330,39334,39347,39352,39375,39379,39383,39387,39406,39429,39437,39445,39453,39457,39461,39477,39493,39509,39513,39532,39551,39565,39569,39592,39609,39613],{"__ignoreMap":3865},[3946,39059,39060],{"class":3948,"line":3949},[3946,39061,39062],{"class":4342},"\u002F\u002F authFlow.test.tsx\n",[3946,39064,39065,39067,39069,39072,39074,39077,39079,39082,39084,39086,39089],{"class":3948,"line":3956},[3946,39066,4252],{"class":4251},[3946,39068,6817],{"class":3952},[3946,39070,39071],{"class":4262},"render",[3946,39073,4447],{"class":3952},[3946,39075,39076],{"class":4262},"fireEvent",[3946,39078,4447],{"class":3952},[3946,39080,39081],{"class":4262},"waitFor",[3946,39083,6823],{"class":3952},[3946,39085,6826],{"class":4251},[3946,39087,39088],{"class":3966}," '@testing-library\u002Freact-native'",[3946,39090,4272],{"class":3952},[3946,39092,39093,39095,39097,39099,39101,39103,39106],{"class":3948,"line":3973},[3946,39094,4252],{"class":4251},[3946,39096,6817],{"class":3952},[3946,39098,13366],{"class":4262},[3946,39100,6823],{"class":3952},[3946,39102,6826],{"class":4251},[3946,39104,39105],{"class":3966}," '..\u002Fscreens\u002FLoginScreen'",[3946,39107,4272],{"class":3952},[3946,39109,39110,39112,39114,39116,39118,39120,39122],{"class":3948,"line":3986},[3946,39111,4252],{"class":4251},[3946,39113,6817],{"class":3952},[3946,39115,17317],{"class":4262},[3946,39117,6823],{"class":3952},[3946,39119,6826],{"class":4251},[3946,39121,14794],{"class":3966},[3946,39123,4272],{"class":3952},[3946,39125,39126],{"class":3948,"line":3999},[3946,39127,4278],{"emptyLinePlaceholder":4277},[3946,39129,39130,39132,39134,39137,39139,39141],{"class":3948,"line":4012},[3946,39131,38484],{"class":4224},[3946,39133,4331],{"class":3952},[3946,39135,39136],{"class":3966},"'Auth Flow'",[3946,39138,21200],{"class":3952},[3946,39140,6453],{"class":4255},[3946,39142,4427],{"class":3952},[3946,39144,39145,39148,39150,39153,39155,39157,39159,39161],{"class":3948,"line":4026},[3946,39146,39147],{"class":4224},"  it",[3946,39149,4331],{"class":3952},[3946,39151,39152],{"class":3966},"'should login successfully with valid credentials'",[3946,39154,4447],{"class":3952},[3946,39156,4387],{"class":4255},[3946,39158,11004],{"class":3952},[3946,39160,6453],{"class":4255},[3946,39162,4427],{"class":3952},[3946,39164,39165,39167,39169,39172,39174,39177,39179,39181],{"class":3948,"line":4037},[3946,39166,4577],{"class":4255},[3946,39168,6817],{"class":3952},[3946,39170,39171],{"class":4286},"getByPlaceholderText",[3946,39173,4447],{"class":3952},[3946,39175,39176],{"class":4286},"getByText",[3946,39178,13049],{"class":3952},[3946,39180,39071],{"class":4224},[3946,39182,6594],{"class":3952},[3946,39184,39185,39187,39189],{"class":3948,"line":4487},[3946,39186,13084],{"class":3952},[3946,39188,17317],{"class":4403},[3946,39190,13135],{"class":3952},[3946,39192,39193,39195,39197],{"class":3948,"line":4507},[3946,39194,13103],{"class":3952},[3946,39196,13366],{"class":4262},[3946,39198,13125],{"class":3952},[3946,39200,39201,39203,39205],{"class":3948,"line":4518},[3946,39202,13130],{"class":3952},[3946,39204,17317],{"class":4262},[3946,39206,13135],{"class":3952},[3946,39208,39209],{"class":3948,"line":4524},[3946,39210,8731],{"class":3952},[3946,39212,39213],{"class":3948,"line":4529},[3946,39214,4278],{"emptyLinePlaceholder":4277},[3946,39216,39217,39219,39222,39224,39226,39228,39231],{"class":3948,"line":4534},[3946,39218,4577],{"class":4255},[3946,39220,39221],{"class":4286}," emailInput",[3946,39223,4290],{"class":3952},[3946,39225,39171],{"class":4224},[3946,39227,4331],{"class":3952},[3946,39229,39230],{"class":3966},"'example@email.com'",[3946,39232,4337],{"class":3952},[3946,39234,39235,39237,39240,39242,39244,39246,39249],{"class":3948,"line":4540},[3946,39236,4577],{"class":4255},[3946,39238,39239],{"class":4286}," passwordInput",[3946,39241,4290],{"class":3952},[3946,39243,39171],{"class":4224},[3946,39245,4331],{"class":3952},[3946,39247,39248],{"class":3966},"'Введіть пароль'",[3946,39250,4337],{"class":3952},[3946,39252,39253,39255,39258,39260,39262,39264,39267],{"class":3948,"line":4567},[3946,39254,4577],{"class":4255},[3946,39256,39257],{"class":4286}," loginButton",[3946,39259,4290],{"class":3952},[3946,39261,39176],{"class":4224},[3946,39263,4331],{"class":3952},[3946,39265,39266],{"class":3966},"'Увійти'",[3946,39268,4337],{"class":3952},[3946,39270,39271],{"class":3948,"line":4574},[3946,39272,4278],{"emptyLinePlaceholder":4277},[3946,39274,39275,39278,39280,39283,39285,39288,39290,39293],{"class":3948,"line":4600},[3946,39276,39277],{"class":4262},"    fireEvent",[3946,39279,4298],{"class":3952},[3946,39281,39282],{"class":4224},"changeText",[3946,39284,4331],{"class":3952},[3946,39286,39287],{"class":4262},"emailInput",[3946,39289,4447],{"class":3952},[3946,39291,39292],{"class":3966},"'demo@example.com'",[3946,39294,4337],{"class":3952},[3946,39296,39297,39299,39301,39303,39305,39308,39310,39313],{"class":3948,"line":4610},[3946,39298,39277],{"class":4262},[3946,39300,4298],{"class":3952},[3946,39302,39282],{"class":4224},[3946,39304,4331],{"class":3952},[3946,39306,39307],{"class":4262},"passwordInput",[3946,39309,4447],{"class":3952},[3946,39311,39312],{"class":3966},"'password123'",[3946,39314,4337],{"class":3952},[3946,39316,39317,39319,39321,39324,39326,39328],{"class":3948,"line":4623},[3946,39318,39277],{"class":4262},[3946,39320,4298],{"class":3952},[3946,39322,39323],{"class":4224},"press",[3946,39325,4331],{"class":3952},[3946,39327,24116],{"class":4262},[3946,39329,4337],{"class":3952},[3946,39331,39332],{"class":3948,"line":4643},[3946,39333,4278],{"emptyLinePlaceholder":4277},[3946,39335,39336,39338,39341,39343,39345],{"class":3948,"line":4653},[3946,39337,4432],{"class":4251},[3946,39339,39340],{"class":4224}," waitFor",[3946,39342,10707],{"class":3952},[3946,39344,6453],{"class":4255},[3946,39346,4427],{"class":3952},[3946,39348,39349],{"class":3948,"line":4658},[3946,39350,39351],{"class":4342},"      \u002F\u002F Перевіряємо, що користувач перенаправлений\n",[3946,39353,39354,39356,39358,39360,39362,39364,39366,39368,39370,39373],{"class":3948,"line":4663},[3946,39355,38638],{"class":4224},[3946,39357,4331],{"class":3952},[3946,39359,16226],{"class":4262},[3946,39361,4298],{"class":3952},[3946,39363,23635],{"class":4262},[3946,39365,19644],{"class":3952},[3946,39367,38652],{"class":4224},[3946,39369,4331],{"class":3952},[3946,39371,39372],{"class":3966},"'MainTabs'",[3946,39374,4337],{"class":3952},[3946,39376,39377],{"class":3948,"line":4668},[3946,39378,8560],{"class":3952},[3946,39380,39381],{"class":3948,"line":4674},[3946,39382,4977],{"class":3952},[3946,39384,39385],{"class":3948,"line":4694},[3946,39386,4278],{"emptyLinePlaceholder":4277},[3946,39388,39389,39391,39393,39396,39398,39400,39402,39404],{"class":3948,"line":4701},[3946,39390,39147],{"class":4224},[3946,39392,4331],{"class":3952},[3946,39394,39395],{"class":3966},"'should show error for invalid credentials'",[3946,39397,4447],{"class":3952},[3946,39399,4387],{"class":4255},[3946,39401,11004],{"class":3952},[3946,39403,6453],{"class":4255},[3946,39405,4427],{"class":3952},[3946,39407,39408,39410,39412,39414,39416,39418,39420,39423,39425,39427],{"class":3948,"line":4719},[3946,39409,4577],{"class":4255},[3946,39411,6817],{"class":3952},[3946,39413,39171],{"class":4286},[3946,39415,4447],{"class":3952},[3946,39417,39176],{"class":4286},[3946,39419,4447],{"class":3952},[3946,39421,39422],{"class":4286},"findByText",[3946,39424,13049],{"class":3952},[3946,39426,39071],{"class":4224},[3946,39428,6594],{"class":3952},[3946,39430,39431,39433,39435],{"class":3948,"line":4735},[3946,39432,13084],{"class":3952},[3946,39434,17317],{"class":4403},[3946,39436,13135],{"class":3952},[3946,39438,39439,39441,39443],{"class":3948,"line":4748},[3946,39440,13103],{"class":3952},[3946,39442,13366],{"class":4262},[3946,39444,13125],{"class":3952},[3946,39446,39447,39449,39451],{"class":3948,"line":4768},[3946,39448,13130],{"class":3952},[3946,39450,17317],{"class":4262},[3946,39452,13135],{"class":3952},[3946,39454,39455],{"class":3948,"line":4777},[3946,39456,8731],{"class":3952},[3946,39458,39459],{"class":3948,"line":4782},[3946,39460,4278],{"emptyLinePlaceholder":4277},[3946,39462,39463,39465,39467,39469,39471,39473,39475],{"class":3948,"line":6262},[3946,39464,4577],{"class":4255},[3946,39466,39221],{"class":4286},[3946,39468,4290],{"class":3952},[3946,39470,39171],{"class":4224},[3946,39472,4331],{"class":3952},[3946,39474,39230],{"class":3966},[3946,39476,4337],{"class":3952},[3946,39478,39479,39481,39483,39485,39487,39489,39491],{"class":3948,"line":6273},[3946,39480,4577],{"class":4255},[3946,39482,39239],{"class":4286},[3946,39484,4290],{"class":3952},[3946,39486,39171],{"class":4224},[3946,39488,4331],{"class":3952},[3946,39490,39248],{"class":3966},[3946,39492,4337],{"class":3952},[3946,39494,39495,39497,39499,39501,39503,39505,39507],{"class":3948,"line":6284},[3946,39496,4577],{"class":4255},[3946,39498,39257],{"class":4286},[3946,39500,4290],{"class":3952},[3946,39502,39176],{"class":4224},[3946,39504,4331],{"class":3952},[3946,39506,39266],{"class":3966},[3946,39508,4337],{"class":3952},[3946,39510,39511],{"class":3948,"line":6299},[3946,39512,4278],{"emptyLinePlaceholder":4277},[3946,39514,39515,39517,39519,39521,39523,39525,39527,39530],{"class":3948,"line":6304},[3946,39516,39277],{"class":4262},[3946,39518,4298],{"class":3952},[3946,39520,39282],{"class":4224},[3946,39522,4331],{"class":3952},[3946,39524,39287],{"class":4262},[3946,39526,4447],{"class":3952},[3946,39528,39529],{"class":3966},"'wrong@example.com'",[3946,39531,4337],{"class":3952},[3946,39533,39534,39536,39538,39540,39542,39544,39546,39549],{"class":3948,"line":6309},[3946,39535,39277],{"class":4262},[3946,39537,4298],{"class":3952},[3946,39539,39282],{"class":4224},[3946,39541,4331],{"class":3952},[3946,39543,39307],{"class":4262},[3946,39545,4447],{"class":3952},[3946,39547,39548],{"class":3966},"'wrongpassword'",[3946,39550,4337],{"class":3952},[3946,39552,39553,39555,39557,39559,39561,39563],{"class":3948,"line":6314},[3946,39554,39277],{"class":4262},[3946,39556,4298],{"class":3952},[3946,39558,39323],{"class":4224},[3946,39560,4331],{"class":3952},[3946,39562,24116],{"class":4262},[3946,39564,4337],{"class":3952},[3946,39566,39567],{"class":3948,"line":6320},[3946,39568,4278],{"emptyLinePlaceholder":4277},[3946,39570,39571,39573,39575,39577,39579,39582,39584,39587,39590],{"class":3948,"line":6325},[3946,39572,4577],{"class":4255},[3946,39574,11508],{"class":4286},[3946,39576,4290],{"class":3952},[3946,39578,4293],{"class":4251},[3946,39580,39581],{"class":4224}," findByText",[3946,39583,4331],{"class":3952},[3946,39585,39586],{"class":16996},"\u002FНевірний email або пароль\u002F",[3946,39588,39589],{"class":4255},"i",[3946,39591,4337],{"class":3952},[3946,39593,39594,39597,39599,39602,39604,39607],{"class":3948,"line":6337},[3946,39595,39596],{"class":4224},"    expect",[3946,39598,4331],{"class":3952},[3946,39600,39601],{"class":4262},"errorMessage",[3946,39603,19644],{"class":3952},[3946,39605,39606],{"class":4224},"toBeTruthy",[3946,39608,4304],{"class":3952},[3946,39610,39611],{"class":3948,"line":6352},[3946,39612,4977],{"class":3952},[3946,39614,39615],{"class":3948,"line":6364},[3946,39616,13276],{"class":3952},[3750,39618,39620],{"id":39619},"_85-performance-optimization","8.5. Performance Optimization",[3847,39622,39624],{"id":39623},"lazy-loading-для-auth-screens","Lazy Loading для Auth Screens",[3857,39626,39628],{"className":4242,"code":39627,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Замість\nimport { LoginScreen } from '.\u002Fscreens\u002FLoginScreen';\n\n\u002F\u002F Використовуємо\nconst LoginScreen = React.lazy(() => import('.\u002Fscreens\u002FLoginScreen'));\n",[3782,39629,39630,39635,39652,39656,39661],{"__ignoreMap":3865},[3946,39631,39632],{"class":3948,"line":3949},[3946,39633,39634],{"class":4342},"\u002F\u002F Замість\n",[3946,39636,39637,39639,39641,39643,39645,39647,39650],{"class":3948,"line":3956},[3946,39638,4252],{"class":4251},[3946,39640,6817],{"class":3952},[3946,39642,13366],{"class":4262},[3946,39644,6823],{"class":3952},[3946,39646,6826],{"class":4251},[3946,39648,39649],{"class":3966}," '.\u002Fscreens\u002FLoginScreen'",[3946,39651,4272],{"class":3952},[3946,39653,39654],{"class":3948,"line":3973},[3946,39655,4278],{"emptyLinePlaceholder":4277},[3946,39657,39658],{"class":3948,"line":3986},[3946,39659,39660],{"class":4342},"\u002F\u002F Використовуємо\n",[3946,39662,39663,39665,39667,39669,39671,39673,39676,39678,39680,39683,39685,39688],{"class":3948,"line":3999},[3946,39664,4283],{"class":4255},[3946,39666,22928],{"class":4286},[3946,39668,4290],{"class":3952},[3946,39670,2021],{"class":4262},[3946,39672,4298],{"class":3952},[3946,39674,39675],{"class":4224},"lazy",[3946,39677,10707],{"class":3952},[3946,39679,6453],{"class":4255},[3946,39681,39682],{"class":4255}," import",[3946,39684,4331],{"class":3952},[3946,39686,39687],{"class":3966},"'.\u002Fscreens\u002FLoginScreen'",[3946,39689,29083],{"class":3952},[3847,39691,39693],{"id":39692},"мемоїзація-context-value","Мемоїзація Context Value",[3857,39695,39697],{"className":4242,"code":39696,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Вже реалізовано в AuthContext\nconst value = useMemo\u003CAuthContextValue>(\n  () => ({\n    ...state,\n    login,\n    logout,\n    \u002F\u002F ...\n  }),\n  [state, login, logout] \u002F\u002F Лише ці залежності\n);\n",[3782,39698,39699,39704,39720,39729,39738,39745,39752,39757,39762,39783],{"__ignoreMap":3865},[3946,39700,39701],{"class":3948,"line":3949},[3946,39702,39703],{"class":4342},"\u002F\u002F Вже реалізовано в AuthContext\n",[3946,39705,39706,39708,39710,39712,39714,39716,39718],{"class":3948,"line":3956},[3946,39707,4283],{"class":4255},[3946,39709,12462],{"class":4286},[3946,39711,4290],{"class":3952},[3946,39713,12467],{"class":4224},[3946,39715,4413],{"class":3952},[3946,39717,10424],{"class":4403},[3946,39719,8967],{"class":3952},[3946,39721,39722,39725,39727],{"class":3948,"line":3973},[3946,39723,39724],{"class":3952},"  () ",[3946,39726,6453],{"class":4255},[3946,39728,12484],{"class":3952},[3946,39730,39731,39734,39736],{"class":3948,"line":3986},[3946,39732,39733],{"class":3952},"    ...",[3946,39735,10532],{"class":4262},[3946,39737,3970],{"class":3952},[3946,39739,39740,39743],{"class":3948,"line":3999},[3946,39741,39742],{"class":4262},"    login",[3946,39744,3970],{"class":3952},[3946,39746,39747,39750],{"class":3948,"line":4012},[3946,39748,39749],{"class":4262},"    logout",[3946,39751,3970],{"class":3952},[3946,39753,39754],{"class":3948,"line":4026},[3946,39755,39756],{"class":4342},"    \u002F\u002F ...\n",[3946,39758,39759],{"class":3948,"line":4037},[3946,39760,39761],{"class":3952},"  }),\n",[3946,39763,39764,39767,39769,39771,39773,39775,39777,39780],{"class":3948,"line":4487},[3946,39765,39766],{"class":3952},"  [",[3946,39768,10532],{"class":4262},[3946,39770,4447],{"class":3952},[3946,39772,11402],{"class":4262},[3946,39774,4447],{"class":3952},[3946,39776,11981],{"class":4262},[3946,39778,39779],{"class":3952},"] ",[3946,39781,39782],{"class":4342},"\u002F\u002F Лише ці залежності\n",[3946,39784,39785],{"class":3948,"line":4507},[3946,39786,4337],{"class":3952},[3847,39788,39790],{"id":39789},"debounce-для-валідації","Debounce для валідації",[3857,39792,39794],{"className":4242,"code":39793,"language":4244,"meta":3865,"style":3865},"import { useDebounce } from 'use-debounce';\n\nconst [email, setEmail] = useState('');\nconst [debouncedEmail] = useDebounce(email, 500);\n\nuseEffect(() => {\n  if (debouncedEmail) {\n    validateEmail(debouncedEmail);\n  }\n}, [debouncedEmail]);\n",[3782,39795,39796,39814,39818,39840,39864,39868,39878,39888,39899,39903],{"__ignoreMap":3865},[3946,39797,39798,39800,39802,39805,39807,39809,39812],{"class":3948,"line":3949},[3946,39799,4252],{"class":4251},[3946,39801,6817],{"class":3952},[3946,39803,39804],{"class":4262},"useDebounce",[3946,39806,6823],{"class":3952},[3946,39808,6826],{"class":4251},[3946,39810,39811],{"class":3966}," 'use-debounce'",[3946,39813,4272],{"class":3952},[3946,39815,39816],{"class":3948,"line":3956},[3946,39817,4278],{"emptyLinePlaceholder":4277},[3946,39819,39820,39822,39824,39826,39828,39830,39832,39834,39836,39838],{"class":3948,"line":3973},[3946,39821,4283],{"class":4255},[3946,39823,10529],{"class":3952},[3946,39825,10853],{"class":4286},[3946,39827,4447],{"class":3952},[3946,39829,22981],{"class":4286},[3946,39831,10540],{"class":3952},[3946,39833,10543],{"class":4224},[3946,39835,4331],{"class":3952},[3946,39837,22990],{"class":3966},[3946,39839,4337],{"class":3952},[3946,39841,39842,39844,39846,39849,39851,39853,39855,39857,39859,39862],{"class":3948,"line":3986},[3946,39843,4283],{"class":4255},[3946,39845,10529],{"class":3952},[3946,39847,39848],{"class":4286},"debouncedEmail",[3946,39850,10540],{"class":3952},[3946,39852,39804],{"class":4224},[3946,39854,4331],{"class":3952},[3946,39856,10853],{"class":4262},[3946,39858,4447],{"class":3952},[3946,39860,39861],{"class":4020},"500",[3946,39863,4337],{"class":3952},[3946,39865,39866],{"class":3948,"line":3999},[3946,39867,4278],{"emptyLinePlaceholder":4277},[3946,39869,39870,39872,39874,39876],{"class":3948,"line":4012},[3946,39871,15953],{"class":4224},[3946,39873,10707],{"class":3952},[3946,39875,6453],{"class":4255},[3946,39877,4427],{"class":3952},[3946,39879,39880,39882,39884,39886],{"class":3948,"line":4026},[3946,39881,5776],{"class":4251},[3946,39883,4479],{"class":3952},[3946,39885,39848],{"class":4262},[3946,39887,4318],{"class":3952},[3946,39889,39890,39893,39895,39897],{"class":3948,"line":4037},[3946,39891,39892],{"class":4224},"    validateEmail",[3946,39894,4331],{"class":3952},[3946,39896,39848],{"class":4262},[3946,39898,4337],{"class":3952},[3946,39900,39901],{"class":3948,"line":4487},[3946,39902,4521],{"class":3952},[3946,39904,39905,39908,39910],{"class":3948,"line":4507},[3946,39906,39907],{"class":3952},"}, [",[3946,39909,39848],{"class":4262},[3946,39911,10737],{"class":3952},[3811,39913],{},[3738,39915,39917],{"id":39916},"розділ-9-deployment-та-production-готовність","Розділ 9: Deployment та Production Готовність",[3750,39919,39921],{"id":39920},"_91-environment-variables","9.1. Environment Variables",[3857,39923,39925],{"className":4242,"code":39924,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app.config.ts\nexport default {\n  expo: {\n    name: 'SecureNotes',\n    slug: 'secure-notes',\n    version: '1.0.0',\n    extra: {\n      apiUrl: process.env.API_URL || 'https:\u002F\u002Fapi.securenotes.com',\n      environment: process.env.APP_ENV || 'production',\n    },\n  },\n};\n\n\u002F\u002F Використання\nimport Constants from 'expo-constants';\n\nconst API_URL = Constants.expoConfig?.extra?.apiUrl;\n",[3782,39926,39927,39932,39941,39947,39956,39966,39976,39983,40006,40029,40033,40037,40041,40045,40049,40063,40067],{"__ignoreMap":3865},[3946,39928,39929],{"class":3948,"line":3949},[3946,39930,39931],{"class":4342},"\u002F\u002F app.config.ts\n",[3946,39933,39934,39936,39939],{"class":3948,"line":3956},[3946,39935,6030],{"class":4251},[3946,39937,39938],{"class":4251}," default",[3946,39940,4427],{"class":3952},[3946,39942,39943,39945],{"class":3948,"line":3973},[3946,39944,37115],{"class":4262},[3946,39946,4427],{"class":3952},[3946,39948,39949,39951,39954],{"class":3948,"line":3986},[3946,39950,19392],{"class":4262},[3946,39952,39953],{"class":3966}," 'SecureNotes'",[3946,39955,3970],{"class":3952},[3946,39957,39958,39961,39964],{"class":3948,"line":3999},[3946,39959,39960],{"class":4262},"    slug:",[3946,39962,39963],{"class":3966}," 'secure-notes'",[3946,39965,3970],{"class":3952},[3946,39967,39968,39971,39974],{"class":3948,"line":4012},[3946,39969,39970],{"class":4262},"    version:",[3946,39972,39973],{"class":3966}," '1.0.0'",[3946,39975,3970],{"class":3952},[3946,39977,39978,39981],{"class":3948,"line":4026},[3946,39979,39980],{"class":4262},"    extra:",[3946,39982,4427],{"class":3952},[3946,39984,39985,39988,39991,39993,39996,39998,40000,40002,40004],{"class":3948,"line":4037},[3946,39986,39987],{"class":4262},"      apiUrl:",[3946,39989,39990],{"class":4262}," process",[3946,39992,4298],{"class":3952},[3946,39994,39995],{"class":4262},"env",[3946,39997,4298],{"class":3952},[3946,39999,36984],{"class":4286},[3946,40001,9745],{"class":3952},[3946,40003,8416],{"class":3966},[3946,40005,3970],{"class":3952},[3946,40007,40008,40011,40013,40015,40017,40019,40022,40024,40027],{"class":3948,"line":4487},[3946,40009,40010],{"class":4262},"      environment:",[3946,40012,39990],{"class":4262},[3946,40014,4298],{"class":3952},[3946,40016,39995],{"class":4262},[3946,40018,4298],{"class":3952},[3946,40020,40021],{"class":4286},"APP_ENV",[3946,40023,9745],{"class":3952},[3946,40025,40026],{"class":3966},"'production'",[3946,40028,3970],{"class":3952},[3946,40030,40031],{"class":3948,"line":4507},[3946,40032,10860],{"class":3952},[3946,40034,40035],{"class":3948,"line":4518},[3946,40036,13271],{"class":3952},[3946,40038,40039],{"class":3948,"line":4524},[3946,40040,13477],{"class":3952},[3946,40042,40043],{"class":3948,"line":4529},[3946,40044,4278],{"emptyLinePlaceholder":4277},[3946,40046,40047],{"class":3948,"line":4534},[3946,40048,5944],{"class":4342},[3946,40050,40051,40053,40056,40058,40061],{"class":3948,"line":4540},[3946,40052,4252],{"class":4251},[3946,40054,40055],{"class":4262}," Constants",[3946,40057,4266],{"class":4251},[3946,40059,40060],{"class":3966}," 'expo-constants'",[3946,40062,4272],{"class":3952},[3946,40064,40065],{"class":3948,"line":4567},[3946,40066,4278],{"emptyLinePlaceholder":4277},[3946,40068,40069,40071,40073,40075,40078,40080,40083,40085,40088,40090,40093],{"class":3948,"line":4574},[3946,40070,4283],{"class":4255},[3946,40072,36904],{"class":4286},[3946,40074,4290],{"class":3952},[3946,40076,40077],{"class":4262},"Constants",[3946,40079,4298],{"class":3952},[3946,40081,40082],{"class":4262},"expoConfig",[3946,40084,7539],{"class":3952},[3946,40086,40087],{"class":4262},"extra",[3946,40089,7539],{"class":3952},[3946,40091,40092],{"class":4262},"apiUrl",[3946,40094,4272],{"class":3952},[3750,40096,40098],{"id":40097},"_92-error-monitoring","9.2. Error Monitoring",[3857,40100,40102],{"className":4242,"code":40101,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Sentry integration\nimport * as Sentry from 'sentry-expo';\n\nSentry.init({\n  dsn: 'YOUR_SENTRY_DSN',\n  enableInExpoDevelopment: false,\n  debug: __DEV__,\n});\n\n\u002F\u002F Використання в AuthContext\ntry {\n  await login(credentials);\n} catch (error) {\n  Sentry.captureException(error, {\n    tags: {\n      feature: 'authentication',\n      action: 'login',\n    },\n    user: {\n      email: credentials.email,\n    },\n  });\n  throw error;\n}\n",[3782,40103,40104,40109,40127,40131,40143,40153,40162,40172,40176,40180,40185,40192,40204,40216,40232,40239,40249,40259,40263,40269,40282,40286,40290,40299],{"__ignoreMap":3865},[3946,40105,40106],{"class":3948,"line":3949},[3946,40107,40108],{"class":4342},"\u002F\u002F Sentry integration\n",[3946,40110,40111,40113,40115,40117,40120,40122,40125],{"class":3948,"line":3956},[3946,40112,4252],{"class":4251},[3946,40114,4256],{"class":4255},[3946,40116,4259],{"class":4251},[3946,40118,40119],{"class":4262}," Sentry",[3946,40121,4266],{"class":4251},[3946,40123,40124],{"class":3966}," 'sentry-expo'",[3946,40126,4272],{"class":3952},[3946,40128,40129],{"class":3948,"line":3973},[3946,40130,4278],{"emptyLinePlaceholder":4277},[3946,40132,40133,40136,40138,40141],{"class":3948,"line":3986},[3946,40134,40135],{"class":4262},"Sentry",[3946,40137,4298],{"class":3952},[3946,40139,40140],{"class":4224},"init",[3946,40142,8512],{"class":3952},[3946,40144,40145,40148,40151],{"class":3948,"line":3999},[3946,40146,40147],{"class":4262},"  dsn:",[3946,40149,40150],{"class":3966}," 'YOUR_SENTRY_DSN'",[3946,40152,3970],{"class":3952},[3946,40154,40155,40158,40160],{"class":3948,"line":4012},[3946,40156,40157],{"class":4262},"  enableInExpoDevelopment:",[3946,40159,7628],{"class":4255},[3946,40161,3970],{"class":3952},[3946,40163,40164,40167,40170],{"class":3948,"line":4026},[3946,40165,40166],{"class":4262},"  debug:",[3946,40168,40169],{"class":4262}," __DEV__",[3946,40171,3970],{"class":3952},[3946,40173,40174],{"class":3948,"line":4037},[3946,40175,13276],{"class":3952},[3946,40177,40178],{"class":3948,"line":4487},[3946,40179,4278],{"emptyLinePlaceholder":4277},[3946,40181,40182],{"class":3948,"line":4507},[3946,40183,40184],{"class":4342},"\u002F\u002F Використання в AuthContext\n",[3946,40186,40187,40190],{"class":3948,"line":4518},[3946,40188,40189],{"class":4251},"try",[3946,40191,4427],{"class":3952},[3946,40193,40194,40196,40198,40200,40202],{"class":3948,"line":4524},[3946,40195,4935],{"class":4251},[3946,40197,8914],{"class":4224},[3946,40199,4331],{"class":3952},[3946,40201,6443],{"class":4262},[3946,40203,4337],{"class":3952},[3946,40205,40206,40208,40210,40212,40214],{"class":3948,"line":4529},[3946,40207,5928],{"class":3952},[3946,40209,4476],{"class":4251},[3946,40211,4479],{"class":3952},[3946,40213,4482],{"class":4262},[3946,40215,4318],{"class":3952},[3946,40217,40218,40221,40223,40226,40228,40230],{"class":3948,"line":4534},[3946,40219,40220],{"class":4262},"  Sentry",[3946,40222,4298],{"class":3952},[3946,40224,40225],{"class":4224},"captureException",[3946,40227,4331],{"class":3952},[3946,40229,4482],{"class":4262},[3946,40231,4952],{"class":3952},[3946,40233,40234,40237],{"class":3948,"line":4540},[3946,40235,40236],{"class":4262},"    tags:",[3946,40238,4427],{"class":3952},[3946,40240,40241,40244,40247],{"class":3948,"line":4567},[3946,40242,40243],{"class":4262},"      feature:",[3946,40245,40246],{"class":3966}," 'authentication'",[3946,40248,3970],{"class":3952},[3946,40250,40251,40254,40257],{"class":3948,"line":4574},[3946,40252,40253],{"class":4262},"      action:",[3946,40255,40256],{"class":3966}," 'login'",[3946,40258,3970],{"class":3952},[3946,40260,40261],{"class":3948,"line":4600},[3946,40262,10860],{"class":3952},[3946,40264,40265,40267],{"class":3948,"line":4610},[3946,40266,10556],{"class":4262},[3946,40268,4427],{"class":3952},[3946,40270,40271,40273,40276,40278,40280],{"class":3948,"line":4623},[3946,40272,20125],{"class":4262},[3946,40274,40275],{"class":4262}," credentials",[3946,40277,4298],{"class":3952},[3946,40279,10853],{"class":4262},[3946,40281,3970],{"class":3952},[3946,40283,40284],{"class":3948,"line":4643},[3946,40285,10860],{"class":3952},[3946,40287,40288],{"class":3948,"line":4653},[3946,40289,4977],{"class":3952},[3946,40291,40292,40295,40297],{"class":3948,"line":4658},[3946,40293,40294],{"class":4251},"  throw",[3946,40296,4513],{"class":4262},[3946,40298,4272],{"class":3952},[3946,40300,40301],{"class":3948,"line":4663},[3946,40302,4040],{"class":3952},[3750,40304,40306],{"id":40305},"_93-analytics","9.3. Analytics",[3857,40308,40310],{"className":4242,"code":40309,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Firebase Analytics\nimport analytics from '@react-native-firebase\u002Fanalytics';\n\n\u002F\u002F Track login\nawait analytics().logLogin({\n  method: 'email',\n});\n\n\u002F\u002F Track screen views\nuseFocusEffect(\n  useCallback(() => {\n    analytics().logScreenView({\n      screen_name: 'NotesListScreen',\n      screen_class: 'NotesListScreen',\n    });\n  }, [])\n);\n",[3782,40311,40312,40317,40331,40335,40340,40353,40363,40367,40371,40376,40382,40392,40404,40414,40423,40427,40431],{"__ignoreMap":3865},[3946,40313,40314],{"class":3948,"line":3949},[3946,40315,40316],{"class":4342},"\u002F\u002F Firebase Analytics\n",[3946,40318,40319,40321,40324,40326,40329],{"class":3948,"line":3956},[3946,40320,4252],{"class":4251},[3946,40322,40323],{"class":4262}," analytics",[3946,40325,4266],{"class":4251},[3946,40327,40328],{"class":3966}," '@react-native-firebase\u002Fanalytics'",[3946,40330,4272],{"class":3952},[3946,40332,40333],{"class":3948,"line":3973},[3946,40334,4278],{"emptyLinePlaceholder":4277},[3946,40336,40337],{"class":3948,"line":3986},[3946,40338,40339],{"class":4342},"\u002F\u002F Track login\n",[3946,40341,40342,40344,40346,40348,40351],{"class":3948,"line":3999},[3946,40343,4293],{"class":4251},[3946,40345,40323],{"class":4224},[3946,40347,19482],{"class":3952},[3946,40349,40350],{"class":4224},"logLogin",[3946,40352,8512],{"class":3952},[3946,40354,40355,40358,40361],{"class":3948,"line":4012},[3946,40356,40357],{"class":4262},"  method:",[3946,40359,40360],{"class":3966}," 'email'",[3946,40362,3970],{"class":3952},[3946,40364,40365],{"class":3948,"line":4026},[3946,40366,13276],{"class":3952},[3946,40368,40369],{"class":3948,"line":4037},[3946,40370,4278],{"emptyLinePlaceholder":4277},[3946,40372,40373],{"class":3948,"line":4487},[3946,40374,40375],{"class":4342},"\u002F\u002F Track screen views\n",[3946,40377,40378,40380],{"class":3948,"line":4507},[3946,40379,28229],{"class":4224},[3946,40381,6594],{"class":3952},[3946,40383,40384,40386,40388,40390],{"class":3948,"line":4518},[3946,40385,10279],{"class":4224},[3946,40387,10707],{"class":3952},[3946,40389,6453],{"class":4255},[3946,40391,4427],{"class":3952},[3946,40393,40394,40397,40399,40402],{"class":3948,"line":4524},[3946,40395,40396],{"class":4224},"    analytics",[3946,40398,19482],{"class":3952},[3946,40400,40401],{"class":4224},"logScreenView",[3946,40403,8512],{"class":3952},[3946,40405,40406,40409,40412],{"class":3948,"line":4529},[3946,40407,40408],{"class":4262},"      screen_name:",[3946,40410,40411],{"class":3966}," 'NotesListScreen'",[3946,40413,3970],{"class":3952},[3946,40415,40416,40419,40421],{"class":3948,"line":4534},[3946,40417,40418],{"class":4262},"      screen_class:",[3946,40420,40411],{"class":3966},[3946,40422,3970],{"class":3952},[3946,40424,40425],{"class":3948,"line":4540},[3946,40426,8560],{"class":3952},[3946,40428,40429],{"class":3948,"line":4567},[3946,40430,37777],{"class":3952},[3946,40432,40433],{"class":3948,"line":4574},[3946,40434,4337],{"class":3952},[3811,40436],{},[3738,40438,40440],{"id":40439},"розділ-10-висновки-та-подальші-кроки","Розділ 10: Висновки та Подальші Кроки",[3750,40442,40444],{"id":40443},"_101-що-ми-вивчили","10.1. Що Ми Вивчили",[3743,40446,40447],{},"У цьому розділі ми детально розглянули:",[3743,40449,40450,40451,40454],{},"✅ ",[3771,40452,40453],{},"Теоретичні основи"," — різниця між автентифікацією та авторизацією, патерни (JWT, OAuth, Session-based)",[3743,40456,40450,40457,40459],{},[3771,40458,38643],{}," — криптографічно захищене зберігання токенів з використанням Keychain (iOS) та EncryptedSharedPreferences (Android)",[3743,40461,40450,40462,40465],{},[3771,40463,40464],{},"Архітектура"," — створення масштабованої системи з Token Service, API Client, Auth Context",[3743,40467,40450,40468,40471],{},[3771,40469,40470],{},"Navigation Guards"," — захист маршрутів, автоматичні редіректи, HOC та hooks для авторизації",[3743,40473,40450,40474,40476],{},[3771,40475,3802],{}," — правильна реакція на 401\u002F403, автоматичний refresh токенів, graceful degradation",[3743,40478,40450,40479,40482],{},[3771,40480,40481],{},"Міні-проєкт"," — повнофункціональний додаток \"Секретні Нотатки\" з усіма best practices",[3743,40484,40450,40485,40487],{},[3771,40486,35385],{}," — захист токенів, HTTPS, certificate pinning, біометрична автентифікація",[3743,40489,40450,40490,40492],{},[3771,40491,2269],{}," — unit та integration тести для критичних компонентів",[3750,40494,40496],{"id":40495},"_102-подальші-покращення","10.2. Подальші Покращення",[3743,40498,40499],{},"Додаток можна розширити:",[3743,40501,40502,40503,40506,40507,40510,40511,40514,40515,40518,40519,40522,40523,40526,40527,40530,40531,40534],{},"🔹 ",[3771,40504,40505],{},"OAuth інтеграція"," — вхід через Google, Apple, Facebook\n🔹 ",[3771,40508,40509],{},"Biometric login"," — Face ID\u002FTouch ID замість паролю\n🔹 ",[3771,40512,40513],{},"Offline-first"," — синхронізація нотаток з локальною БД (SQLite, Realm)\n🔹 ",[3771,40516,40517],{},"End-to-end encryption"," — шифрування вмісту нотаток на клієнті\n🔹 ",[3771,40520,40521],{},"Multi-factor authentication"," — SMS або authenticator app\n🔹 ",[3771,40524,40525],{},"Session management"," — перегляд активних сесій, logout з інших пристроїв\n🔹 ",[3771,40528,40529],{},"Password recovery"," — відновлення паролю через email\n🔹 ",[3771,40532,40533],{},"Account deletion"," — GDPR-compliant видалення акаунту",[3750,40536,40538],{"id":40537},"_103-ключові-takeaways","10.3. Ключові Takeaways",[3765,40540,40541,40547,40553,40558,40563],{},[3768,40542,40543,40546],{},[3771,40544,40545],{},"Безпека — не опція"," — використовуйте SecureStore для токенів, HTTPS для всіх запитів, короткий lifetime для access tokens",[3768,40548,40549,40552],{},[3771,40550,40551],{},"User Experience"," — прозорий стан завантаження, зрозумілі помилки, автоматичне відновлення сесії",[3768,40554,40555,40557],{},[3771,40556,40464],{}," — розділяйте відповідальності (API, Storage, Context), використовуйте TypeScript для type safety",[3768,40559,40560,40562],{},[3771,40561,968],{}," — критичні flow (login, logout, token refresh) мають бути покриті тестами",[3768,40564,40565,40567],{},[3771,40566,1347],{}," — інтегруйте error tracking та analytics для production",[3750,40569,40571],{"id":40570},"_104-nomad-commit","10.4. Nomad Commit",[3743,40573,40574],{},"Згідно з найкращими практиками git-комітів у стилі nomadic development:",[3857,40576,40578],{"className":4215,"code":40577,"language":4217,"meta":3865,"style":3865},"# Stage files\ngit add .\n\n# Commit з описовим повідомленням\ngit commit -m \"feat: secure session and protected routes\n\nImplemented comprehensive authentication system:\n- JWT-based authentication with SecureStore\n- Auth context with login\u002Fregister\u002Flogout\n- Protected routes with navigation guards\n- Token refresh mechanism\n- Secure Notes mini-project\n\nSecurity features:\n- Encrypted token storage (iOS Keychain \u002F Android Keystore)\n- Automatic session restoration\n- 401\u002F403 error handling\n- Token expiry validation\n\nTech stack:\n- expo-secure-store for crypto storage\n- Axios with interceptors\n- React Navigation 6 with auth flow\n- TypeScript for type safety\"\n",[3782,40579,40580,40585,40596,40600,40605,40618,40622,40627,40632,40637,40642,40647,40652,40656,40661,40666,40671,40676,40681,40685,40690,40695,40700,40705],{"__ignoreMap":3865},[3946,40581,40582],{"class":3948,"line":3949},[3946,40583,40584],{"class":4342},"# Stage files\n",[3946,40586,40587,40590,40593],{"class":3948,"line":3956},[3946,40588,40589],{"class":4224},"git",[3946,40591,40592],{"class":3966}," add",[3946,40594,40595],{"class":3966}," .\n",[3946,40597,40598],{"class":3948,"line":3973},[3946,40599,4278],{"emptyLinePlaceholder":4277},[3946,40601,40602],{"class":3948,"line":3986},[3946,40603,40604],{"class":4342},"# Commit з описовим повідомленням\n",[3946,40606,40607,40609,40612,40615],{"class":3948,"line":3999},[3946,40608,40589],{"class":4224},[3946,40610,40611],{"class":3966}," commit",[3946,40613,40614],{"class":4255}," -m",[3946,40616,40617],{"class":3966}," \"feat: secure session and protected routes\n",[3946,40619,40620],{"class":3948,"line":4012},[3946,40621,4278],{"emptyLinePlaceholder":4277},[3946,40623,40624],{"class":3948,"line":4026},[3946,40625,40626],{"class":3966},"Implemented comprehensive authentication system:\n",[3946,40628,40629],{"class":3948,"line":4037},[3946,40630,40631],{"class":3966},"- JWT-based authentication with SecureStore\n",[3946,40633,40634],{"class":3948,"line":4487},[3946,40635,40636],{"class":3966},"- Auth context with login\u002Fregister\u002Flogout\n",[3946,40638,40639],{"class":3948,"line":4507},[3946,40640,40641],{"class":3966},"- Protected routes with navigation guards\n",[3946,40643,40644],{"class":3948,"line":4518},[3946,40645,40646],{"class":3966},"- Token refresh mechanism\n",[3946,40648,40649],{"class":3948,"line":4524},[3946,40650,40651],{"class":3966},"- Secure Notes mini-project\n",[3946,40653,40654],{"class":3948,"line":4529},[3946,40655,4278],{"emptyLinePlaceholder":4277},[3946,40657,40658],{"class":3948,"line":4534},[3946,40659,40660],{"class":3966},"Security features:\n",[3946,40662,40663],{"class":3948,"line":4540},[3946,40664,40665],{"class":3966},"- Encrypted token storage (iOS Keychain \u002F Android Keystore)\n",[3946,40667,40668],{"class":3948,"line":4567},[3946,40669,40670],{"class":3966},"- Automatic session restoration\n",[3946,40672,40673],{"class":3948,"line":4574},[3946,40674,40675],{"class":3966},"- 401\u002F403 error handling\n",[3946,40677,40678],{"class":3948,"line":4600},[3946,40679,40680],{"class":3966},"- Token expiry validation\n",[3946,40682,40683],{"class":3948,"line":4610},[3946,40684,4278],{"emptyLinePlaceholder":4277},[3946,40686,40687],{"class":3948,"line":4623},[3946,40688,40689],{"class":3966},"Tech stack:\n",[3946,40691,40692],{"class":3948,"line":4643},[3946,40693,40694],{"class":3966},"- expo-secure-store for crypto storage\n",[3946,40696,40697],{"class":3948,"line":4653},[3946,40698,40699],{"class":3966},"- Axios with interceptors\n",[3946,40701,40702],{"class":3948,"line":4658},[3946,40703,40704],{"class":3966},"- React Navigation 6 with auth flow\n",[3946,40706,40707],{"class":3948,"line":4663},[3946,40708,40709],{"class":3966},"- TypeScript for type safety\"\n",[3811,40711],{},[3738,40713,40715],{"id":40714},"додаток-a-корисні-ресурси","Додаток A: Корисні Ресурси",[3750,40717,40719],{"id":40718},"документація","Документація",[3878,40721,40722,40731,40738,40746],{},[3768,40723,40724],{},[40725,40726,40730],"a",{"href":40727,"rel":40728},"https:\u002F\u002Fdocs.expo.dev\u002Fversions\u002Flatest\u002Fsdk\u002Fsecurestore\u002F",[40729],"nofollow","Expo SecureStore",[3768,40732,40733],{},[40725,40734,40737],{"href":40735,"rel":40736},"https:\u002F\u002Freactnavigation.org\u002Fdocs\u002Fauth-flow\u002F",[40729],"React Navigation Authentication Flow",[3768,40739,40740,40745],{},[40725,40741,40744],{"href":40742,"rel":40743},"https:\u002F\u002Fjwt.io\u002F",[40729],"JWT.io"," — JWT debugger",[3768,40747,40748],{},[40725,40749,40752],{"href":40750,"rel":40751},"https:\u002F\u002Fowasp.org\u002Fwww-project-mobile-top-10\u002F",[40729],"OWASP Mobile Security",[3750,40754,40756],{"id":40755},"бібліотеки","Бібліотеки",[3878,40758,40759,40764,40770,40775,40781,40787],{},[3768,40760,40761,40763],{},[3782,40762,3784],{}," — безпечне зберігання",[3768,40765,40766,40769],{},[3782,40767,40768],{},"expo-local-authentication"," — біометрична автентифікація",[3768,40771,40772,40774],{},[3782,40773,8504],{}," — HTTP клієнт",[3768,40776,40777,40780],{},[3782,40778,40779],{},"@react-navigation\u002Fnative"," — навігація",[3768,40782,40783,40786],{},[3782,40784,40785],{},"sentry-expo"," — error tracking",[3768,40788,40789,40792],{},[3782,40790,40791],{},"@react-native-firebase\u002Fanalytics"," — аналітика",[3750,40794,40796],{"id":40795},"статті-та-туторіали","Статті та Туторіали",[3878,40798,40799,40806,40813],{},[3768,40800,40801],{},[40725,40802,40805],{"href":40803,"rel":40804},"https:\u002F\u002Fwww.oauth.com\u002F",[40729],"OAuth 2.0 Explained",[3768,40807,40808],{},[40725,40809,40812],{"href":40810,"rel":40811},"https:\u002F\u002Fcurity.io\u002Fresources\u002Flearn\u002Fjwt-best-practices\u002F",[40729],"JWT Best Practices",[3768,40814,40815],{},[40725,40816,40819],{"href":40817,"rel":40818},"https:\u002F\u002Freactnative.dev\u002Fdocs\u002Fsecurity",[40729],"React Native Security Best Practices",[3811,40821],{},[3738,40823,40825],{"id":40824},"додаток-b-глосарій","Додаток B: Глосарій",[3743,40827,40828,40831],{},[3771,40829,40830],{},"Authentication (Автентифікація)"," — процес підтвердження ідентичності користувача",[3743,40833,40834,40837],{},[3771,40835,40836],{},"Authorization (Авторизація)"," — процес визначення прав доступу",[3743,40839,40840,40843],{},[3771,40841,40842],{},"JWT (JSON Web Token)"," — компактний, URL-safe токен для передачі інформації між сторонами",[3743,40845,40846,40849],{},[3771,40847,40848],{},"Refresh Token"," — довгоживучий токен для отримання нового access token",[3743,40851,40852,40855],{},[3771,40853,40854],{},"Access Token"," — короткоживучий токен для доступу до ресурсів API",[3743,40857,40858,40861],{},[3771,40859,40860],{},"Secure Store"," — криптографічно захищене сховище на пристрої",[3743,40863,40864,40867],{},[3771,40865,40866],{},"Keychain (iOS)"," — системне сховище для паролів та секретів",[3743,40869,40870,40873],{},[3771,40871,40872],{},"Keystore (Android)"," — система для зберігання криптографічних ключів",[3743,40875,40876,40879],{},[3771,40877,40878],{},"HTTPS"," — захищений протокол HTTP з TLS\u002FSSL шифруванням",[3743,40881,40882,40885],{},[3771,40883,40884],{},"Certificate Pinning"," — техніка для запобігання MITM атакам",[3743,40887,40888,40891],{},[3771,40889,40890],{},"Biometric Authentication"," — автентифікація за біометричними даними (Face ID, Touch ID)",[3743,40893,40894,40897],{},[3771,40895,40896],{},"Navigation Guard"," — механізм захисту маршрутів від несанкціонованого доступу",[3743,40899,40900,40902],{},[3771,40901,16468],{}," — HTTP статус \"не автентифікований\"",[3743,40904,40905,40907],{},[3771,40906,16498],{}," — HTTP статус \"автентифікований, але немає доступу\"",[3811,40909],{},[3743,40911,40912,40915],{},[3771,40913,40914],{},"Вітаємо!"," 🎉 Ви завершили всебічний розділ про автентифікацію та безпечне зберігання в React Native. Тепер ви володієте знаннями для створення безпечних, масштабованих мобільних додатків з професійною системою автентифікації.",[3743,40917,40918,13298,40921],{},[3771,40919,40920],{},"Nomad:",[3782,40922,40923],{},"feat: secure session and protected routes",[3811,40925],{},[3738,40927,40929],{"id":40928},"розділ-11-практична-реалізація-в-проєкті-nomad","Розділ 11: Практична Реалізація в Проєкті Nomad",[3743,40931,40932,40933,40936],{},"У цьому розділі ми крок за кроком реалізуємо повноцінну систему автентифікації в реальному проєкті ",[3771,40934,40935],{},"Nomad"," — додатку для планування подорожей. Ми інтегруємо всі концепції, які вивчили раніше, та побачимо, як вони працюють разом у production-ready застосунку.",[3750,40938,40940],{"id":40939},"_111-підготовка-проєкту","11.1. Підготовка Проєкту",[3847,40942,40944],{"id":40943},"крок-1-встановлення-залежностей","Крок 1: Встановлення залежностей",[3743,40946,40947,40948,8545],{},"Перше, що потрібно зробити — встановити ",[3782,40949,3784],{},[3857,40951,40953],{"className":4215,"code":40952,"language":4217,"meta":3865,"style":3865},"cd \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\nnpm install expo-secure-store --legacy-peer-deps\n",[3782,40954,40955,40963],{"__ignoreMap":3865},[3946,40956,40957,40960],{"class":3948,"line":3949},[3946,40958,40959],{"class":4224},"cd",[3946,40961,40962],{"class":3966}," \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\n",[3946,40964,40965,40967,40969,40972],{"class":3948,"line":3956},[3946,40966,18852],{"class":4224},[3946,40968,4231],{"class":3966},[3946,40970,40971],{"class":3966}," expo-secure-store",[3946,40973,40974],{"class":4255}," --legacy-peer-deps\n",[3743,40976,40977,40980,40981,40984],{},[3771,40978,40979],{},"Примітка:"," Використовуємо ",[3782,40982,40983],{},"--legacy-peer-deps"," через конфлікти peer dependencies у React 19. Це безпечно для нашого use case.",[3743,40986,40987],{},[3771,40988,40989],{},"Перевірка встановлення:",[3857,40991,40993],{"className":4215,"code":40992,"language":4217,"meta":3865,"style":3865},"# Перевіримо, що пакет доданий\ncat package.json | grep \"expo-secure-store\"\n",[3782,40994,40995,41000],{"__ignoreMap":3865},[3946,40996,40997],{"class":3948,"line":3949},[3946,40998,40999],{"class":4342},"# Перевіримо, що пакет доданий\n",[3946,41001,41002,41005,41008,41010,41013],{"class":3948,"line":3956},[3946,41003,41004],{"class":4224},"cat",[3946,41006,41007],{"class":3966}," package.json",[3946,41009,4559],{"class":3952},[3946,41011,41012],{"class":4224},"grep",[3946,41014,41015],{"class":3966}," \"expo-secure-store\"\n",[3743,41017,41018],{},"Очікуваний результат:",[3857,41020,41022],{"className":3940,"code":41021,"language":3942,"meta":3865,"style":3865},"\"expo-secure-store\": \"~14.0.0\"\n",[3782,41023,41024],{"__ignoreMap":3865},[3946,41025,41026,41029,41031],{"class":3948,"line":3949},[3946,41027,41028],{"class":3966},"\"expo-secure-store\"",[3946,41030,3963],{"class":3952},[3946,41032,41033],{"class":3966},"\"~14.0.0\"\n",[3847,41035,41037],{"id":41036},"крок-2-оновлення-конфігурації-expo","Крок 2: Оновлення конфігурації Expo",[3743,41039,41040],{},"Оскільки ми використовуємо біометричну автентифікацію та SecureStore, потрібно додати відповідні дозволи:",[3857,41042,41044],{"className":3940,"code":41043,"language":3942,"meta":3865,"style":3865},"\u002F\u002F app.json\n{\n  \"expo\": {\n    \"name\": \"Nomad\",\n    \u002F\u002F ... існуючі налаштування\n    \"ios\": {\n      \"supportsTablet\": true,\n      \"infoPlist\": {\n        \"NSFaceIDUsageDescription\": \"Nomad використовує Face ID для безпечного входу в додаток\"\n      }\n    },\n    \"android\": {\n      \u002F\u002F ... існуючі налаштування\n      \"permissions\": [\n        \"USE_BIOMETRIC\",\n        \"USE_FINGERPRINT\"\n      ]\n    },\n    \"plugins\": [\n      \"expo-router\",\n      \"@react-native-community\u002Fdatetimepicker\",\n      [\n        \"expo-secure-store\",\n        {\n          \"faceIDPermission\": \"Дозвольте $(PRODUCT_NAME) використовувати Face ID для автентифікації\"\n        }\n      ]\n    ]\n  }\n}\n",[3782,41045,41046,41051,41055,41063,41075,41080,41087,41098,41105,41115,41119,41123,41130,41135,41142,41149,41154,41158,41162,41169,41176,41183,41187,41194,41198,41208,41212,41216,41221,41225],{"__ignoreMap":3865},[3946,41047,41048],{"class":3948,"line":3949},[3946,41049,41050],{"class":4342},"\u002F\u002F app.json\n",[3946,41052,41053],{"class":3948,"line":3956},[3946,41054,3953],{"class":3952},[3946,41056,41057,41060],{"class":3948,"line":3973},[3946,41058,41059],{"class":3959},"  \"expo\"",[3946,41061,41062],{"class":3952},": {\n",[3946,41064,41065,41068,41070,41073],{"class":3948,"line":3986},[3946,41066,41067],{"class":3959},"    \"name\"",[3946,41069,3963],{"class":3952},[3946,41071,41072],{"class":3966},"\"Nomad\"",[3946,41074,3970],{"class":3952},[3946,41076,41077],{"class":3948,"line":3999},[3946,41078,41079],{"class":4342},"    \u002F\u002F ... існуючі налаштування\n",[3946,41081,41082,41085],{"class":3948,"line":4012},[3946,41083,41084],{"class":3959},"    \"ios\"",[3946,41086,41062],{"class":3952},[3946,41088,41089,41092,41094,41096],{"class":3948,"line":4026},[3946,41090,41091],{"class":3959},"      \"supportsTablet\"",[3946,41093,3963],{"class":3952},[3946,41095,17493],{"class":4255},[3946,41097,3970],{"class":3952},[3946,41099,41100,41103],{"class":3948,"line":4037},[3946,41101,41102],{"class":3959},"      \"infoPlist\"",[3946,41104,41062],{"class":3952},[3946,41106,41107,41110,41112],{"class":3948,"line":4487},[3946,41108,41109],{"class":3959},"        \"NSFaceIDUsageDescription\"",[3946,41111,3963],{"class":3952},[3946,41113,41114],{"class":3966},"\"Nomad використовує Face ID для безпечного входу в додаток\"\n",[3946,41116,41117],{"class":3948,"line":4507},[3946,41118,7282],{"class":3952},[3946,41120,41121],{"class":3948,"line":4518},[3946,41122,10860],{"class":3952},[3946,41124,41125,41128],{"class":3948,"line":4524},[3946,41126,41127],{"class":3959},"    \"android\"",[3946,41129,41062],{"class":3952},[3946,41131,41132],{"class":3948,"line":4529},[3946,41133,41134],{"class":4342},"      \u002F\u002F ... існуючі налаштування\n",[3946,41136,41137,41140],{"class":3948,"line":4534},[3946,41138,41139],{"class":3959},"      \"permissions\"",[3946,41141,18897],{"class":3952},[3946,41143,41144,41147],{"class":3948,"line":4540},[3946,41145,41146],{"class":3966},"        \"USE_BIOMETRIC\"",[3946,41148,3970],{"class":3952},[3946,41150,41151],{"class":3948,"line":4567},[3946,41152,41153],{"class":3966},"        \"USE_FINGERPRINT\"\n",[3946,41155,41156],{"class":3948,"line":4574},[3946,41157,29156],{"class":3952},[3946,41159,41160],{"class":3948,"line":4600},[3946,41161,10860],{"class":3952},[3946,41163,41164,41167],{"class":3948,"line":4610},[3946,41165,41166],{"class":3959},"    \"plugins\"",[3946,41168,18897],{"class":3952},[3946,41170,41171,41174],{"class":3948,"line":4623},[3946,41172,41173],{"class":3966},"      \"expo-router\"",[3946,41175,3970],{"class":3952},[3946,41177,41178,41181],{"class":3948,"line":4643},[3946,41179,41180],{"class":3966},"      \"@react-native-community\u002Fdatetimepicker\"",[3946,41182,3970],{"class":3952},[3946,41184,41185],{"class":3948,"line":4653},[3946,41186,28947],{"class":3952},[3946,41188,41189,41192],{"class":3948,"line":4658},[3946,41190,41191],{"class":3966},"        \"expo-secure-store\"",[3946,41193,3970],{"class":3952},[3946,41195,41196],{"class":3948,"line":4663},[3946,41197,28971],{"class":3952},[3946,41199,41200,41203,41205],{"class":3948,"line":4668},[3946,41201,41202],{"class":3959},"          \"faceIDPermission\"",[3946,41204,3963],{"class":3952},[3946,41206,41207],{"class":3966},"\"Дозвольте $(PRODUCT_NAME) використовувати Face ID для автентифікації\"\n",[3946,41209,41210],{"class":3948,"line":4674},[3946,41211,8684],{"class":3952},[3946,41213,41214],{"class":3948,"line":4694},[3946,41215,29156],{"class":3952},[3946,41217,41218],{"class":3948,"line":4701},[3946,41219,41220],{"class":3952},"    ]\n",[3946,41222,41223],{"class":3948,"line":4719},[3946,41224,4521],{"class":3952},[3946,41226,41227],{"class":3948,"line":4735},[3946,41228,4040],{"class":3952},[3750,41230,41232],{"id":41231},"_112-створення-структури-auth-feature","11.2. Створення Структури Auth Feature",[3847,41234,41236],{"id":41235},"крок-3-створення-директорій","Крок 3: Створення директорій",[3743,41238,41239],{},"Створимо повну структуру для auth feature:",[3857,41241,41243],{"className":4215,"code":41242,"language":4217,"meta":3865,"style":3865},"cd \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\nmkdir -p auth\u002F{api,components,context,hooks,screens,services,types,utils}\n",[3782,41244,41245,41252],{"__ignoreMap":3865},[3946,41246,41247,41249],{"class":3948,"line":3949},[3946,41248,40959],{"class":4224},[3946,41250,41251],{"class":3966}," \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\n",[3946,41253,41254,41257,41260],{"class":3948,"line":3956},[3946,41255,41256],{"class":4224},"mkdir",[3946,41258,41259],{"class":4255}," -p",[3946,41261,41262],{"class":3966}," auth\u002F{api,components,context,hooks,screens,services,types,utils}\n",[3743,41264,41265],{},[3771,41266,41267],{},"Візуалізація структури:",[3857,41269,41272],{"className":41270,"code":41271,"language":3862},[3860],"src\u002Ffeatures\u002Fauth\u002F\n├── api\u002F\n│   └── authApi.ts          # HTTP запити до API\n├── components\u002F\n│   ├── AuthInput.tsx       # Кастомний input для auth форм\n│   └── AuthButton.tsx      # Кастомна кнопка\n├── context\u002F\n│   └── AuthContext.tsx     # Глобальний стан\n├── hooks\u002F\n│   ├── useAuth.ts          # Hook для доступу до контексту\n│   └── useTokenRefresh.ts  # Автоматичний refresh\n├── screens\u002F\n│   ├── LoginScreen.tsx     # Екран входу\n│   └── RegisterScreen.tsx  # Екран реєстрації\n├── services\u002F\n│   └── tokenService.ts     # Робота з SecureStore\n├── types\u002F\n│   └── auth.types.ts       # TypeScript типи\n└── utils\u002F\n    └── validators.ts       # Валідація форм\n",[3782,41273,41271],{"__ignoreMap":3865},[3750,41275,41277],{"id":41276},"_113-реалізація-core-files","11.3. Реалізація Core Files",[3847,41279,41281],{"id":41280},"крок-4-створення-файлів","Крок 4: Створення файлів",[3743,41283,41284],{},"Створимо всі необхідні файли в правильному порядку:",[3743,41286,41287,41290],{},[3771,41288,41289],{},"1. Types (auth.types.ts)"," — Foundation для type safety",[3857,41292,41294],{"className":4242,"code":41293,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Ftypes\u002Fauth.types.ts\nexport interface User {\n  id: string;\n  email: string;\n  name: string;\n  avatar?: string;\n  role: 'user' | 'admin';\n}\n\nexport interface LoginCredentials {\n  email: string;\n  password: string;\n}\n\n\u002F\u002F ... (решта типів як у прикладі вище)\n",[3782,41295,41296,41300,41310,41320,41330,41340,41350,41364,41368,41372,41382,41392,41402,41406,41410],{"__ignoreMap":3865},[3946,41297,41298],{"class":3948,"line":3949},[3946,41299,6006],{"class":4342},[3946,41301,41302,41304,41306,41308],{"class":3948,"line":3956},[3946,41303,6030],{"class":4251},[3946,41305,6033],{"class":4255},[3946,41307,6036],{"class":4403},[3946,41309,4427],{"class":3952},[3946,41311,41312,41314,41316,41318],{"class":3948,"line":3973},[3946,41313,6043],{"class":4262},[3946,41315,3963],{"class":3952},[3946,41317,4404],{"class":4403},[3946,41319,4272],{"class":3952},[3946,41321,41322,41324,41326,41328],{"class":3948,"line":3986},[3946,41323,6054],{"class":4262},[3946,41325,3963],{"class":3952},[3946,41327,4404],{"class":4403},[3946,41329,4272],{"class":3952},[3946,41331,41332,41334,41336,41338],{"class":3948,"line":3999},[3946,41333,6065],{"class":4262},[3946,41335,3963],{"class":3952},[3946,41337,4404],{"class":4403},[3946,41339,4272],{"class":3952},[3946,41341,41342,41344,41346,41348],{"class":3948,"line":4012},[3946,41343,6076],{"class":4262},[3946,41345,4814],{"class":3952},[3946,41347,4404],{"class":4403},[3946,41349,4272],{"class":3952},[3946,41351,41352,41354,41356,41358,41360,41362],{"class":3948,"line":4026},[3946,41353,6087],{"class":4262},[3946,41355,3963],{"class":3952},[3946,41357,6092],{"class":3966},[3946,41359,4559],{"class":3952},[3946,41361,6097],{"class":3966},[3946,41363,4272],{"class":3952},[3946,41365,41366],{"class":3948,"line":4037},[3946,41367,4040],{"class":3952},[3946,41369,41370],{"class":3948,"line":4487},[3946,41371,4278],{"emptyLinePlaceholder":4277},[3946,41373,41374,41376,41378,41380],{"class":3948,"line":4507},[3946,41375,6030],{"class":4251},[3946,41377,6033],{"class":4255},[3946,41379,6134],{"class":4403},[3946,41381,4427],{"class":3952},[3946,41383,41384,41386,41388,41390],{"class":3948,"line":4518},[3946,41385,6054],{"class":4262},[3946,41387,3963],{"class":3952},[3946,41389,4404],{"class":4403},[3946,41391,4272],{"class":3952},[3946,41393,41394,41396,41398,41400],{"class":3948,"line":4524},[3946,41395,6151],{"class":4262},[3946,41397,3963],{"class":3952},[3946,41399,4404],{"class":4403},[3946,41401,4272],{"class":3952},[3946,41403,41404],{"class":3948,"line":4529},[3946,41405,4040],{"class":3952},[3946,41407,41408],{"class":3948,"line":4534},[3946,41409,4278],{"emptyLinePlaceholder":4277},[3946,41411,41412],{"class":3948,"line":4540},[3946,41413,41414],{"class":4342},"\u002F\u002F ... (решта типів як у прикладі вище)\n",[3743,41416,40450,41417,13298,41420],{},[3771,41418,41419],{},"Створено:",[3782,41421,41422],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Ftypes\u002Fauth.types.ts",[3743,41424,41425,41428],{},[3771,41426,41427],{},"2. Token Service (tokenService.ts)"," — Робота з SecureStore",[3857,41430,41432],{"className":4242,"code":41431,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService.ts\nimport * as SecureStore from 'expo-secure-store';\n\nclass TokenService {\n  async saveTokens(accessToken, refreshToken, expiresIn) {\n    const tokens = {\n      accessToken,\n      refreshToken,\n      expiresAt: Date.now() + expiresIn * 1000,\n    };\n    await SecureStore.setItemAsync('nomad.auth.tokens', JSON.stringify(tokens));\n  }\n  \n  \u002F\u002F ... (решта методів)\n}\n\nexport const tokenService = new TokenService();\n",[3782,41433,41434,41438,41454,41458,41466,41486,41494,41501,41508,41529,41533,41561,41565,41569,41574,41578,41582],{"__ignoreMap":3865},[3946,41435,41436],{"class":3948,"line":3949},[3946,41437,6787],{"class":4342},[3946,41439,41440,41442,41444,41446,41448,41450,41452],{"class":3948,"line":3956},[3946,41441,4252],{"class":4251},[3946,41443,4256],{"class":4255},[3946,41445,4259],{"class":4251},[3946,41447,4263],{"class":4262},[3946,41449,4266],{"class":4251},[3946,41451,4269],{"class":3966},[3946,41453,4272],{"class":3952},[3946,41455,41456],{"class":3948,"line":3973},[3946,41457,4278],{"emptyLinePlaceholder":4277},[3946,41459,41460,41462,41464],{"class":3948,"line":3986},[3946,41461,6898],{"class":4255},[3946,41463,6901],{"class":4403},[3946,41465,4427],{"class":3952},[3946,41467,41468,41470,41472,41474,41476,41478,41480,41482,41484],{"class":3948,"line":3999},[3946,41469,6923],{"class":4255},[3946,41471,6926],{"class":4224},[3946,41473,4331],{"class":3952},[3946,41475,7334],{"class":4262},[3946,41477,4447],{"class":3952},[3946,41479,5363],{"class":4262},[3946,41481,4447],{"class":3952},[3946,41483,7026],{"class":4262},[3946,41485,4318],{"class":3952},[3946,41487,41488,41490,41492],{"class":3948,"line":4012},[3946,41489,4577],{"class":4255},[3946,41491,6987],{"class":4286},[3946,41493,5893],{"class":3952},[3946,41495,41496,41499],{"class":3948,"line":4026},[3946,41497,41498],{"class":4262},"      accessToken",[3946,41500,3970],{"class":3952},[3946,41502,41503,41506],{"class":3948,"line":4037},[3946,41504,41505],{"class":4262},"      refreshToken",[3946,41507,3970],{"class":3952},[3946,41509,41510,41513,41515,41517,41519,41521,41523,41525,41527],{"class":3948,"line":4487},[3946,41511,41512],{"class":4262},"      expiresAt:",[3946,41514,7015],{"class":4262},[3946,41516,4298],{"class":3952},[3946,41518,7020],{"class":4224},[3946,41520,7023],{"class":3952},[3946,41522,7026],{"class":4262},[3946,41524,7029],{"class":3952},[3946,41526,7032],{"class":4020},[3946,41528,3970],{"class":3952},[3946,41530,41531],{"class":3948,"line":4507},[3946,41532,17258],{"class":3952},[3946,41534,41535,41537,41539,41541,41543,41545,41547,41549,41551,41553,41555,41557,41559],{"class":3948,"line":4518},[3946,41536,4432],{"class":4251},[3946,41538,4263],{"class":4262},[3946,41540,4298],{"class":3952},[3946,41542,4439],{"class":4224},[3946,41544,4331],{"class":3952},[3946,41546,5173],{"class":3966},[3946,41548,4447],{"class":3952},[3946,41550,5685],{"class":4286},[3946,41552,4298],{"class":3952},[3946,41554,5690],{"class":4224},[3946,41556,4331],{"class":3952},[3946,41558,7062],{"class":4262},[3946,41560,29083],{"class":3952},[3946,41562,41563],{"class":3948,"line":4524},[3946,41564,4521],{"class":3952},[3946,41566,41567],{"class":3948,"line":4529},[3946,41568,5795],{"class":3952},[3946,41570,41571],{"class":3948,"line":4534},[3946,41572,41573],{"class":4342},"  \u002F\u002F ... (решта методів)\n",[3946,41575,41576],{"class":3948,"line":4540},[3946,41577,4040],{"class":3952},[3946,41579,41580],{"class":3948,"line":4567},[3946,41581,4278],{"emptyLinePlaceholder":4277},[3946,41583,41584,41586,41588,41590,41592,41594,41596],{"class":3948,"line":4574},[3946,41585,6030],{"class":4251},[3946,41587,5933],{"class":4255},[3946,41589,8213],{"class":4286},[3946,41591,4290],{"class":3952},[3946,41593,8218],{"class":4255},[3946,41595,6901],{"class":4224},[3946,41597,4304],{"class":3952},[3743,41599,40450,41600,13298,41602],{},[3771,41601,41419],{},[3782,41603,41604],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService.ts",[3743,41606,41607],{},[3771,41608,41609],{},"Ключові особливості:",[3878,41611,41612,41615,41618,41621],{},[3768,41613,41614],{},"✨ Singleton pattern — один екземпляр на весь додаток",[3768,41616,41617],{},"🔒 Криптографічне зберігання через SecureStore",[3768,41619,41620],{},"⏰ Автоматична перевірка expiry з 60-секундним буфером",[3768,41622,41623],{},"🛡️ Graceful error handling з автоочищенням corrupted data",[3743,41625,41626,40774],{},[3771,41627,41628],{},"3. Auth API (authApi.ts)",[3857,41630,41632],{"className":4242,"code":41631,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fapi\u002FauthApi.ts\nimport axios from 'axios';\n\nclass AuthApi {\n  private client: AxiosInstance;\n\n  constructor() {\n    this.client = axios.create({\n      baseURL: 'http:\u002F\u002Flocalhost:3000',\n      timeout: 10000,\n    });\n\n    \u002F\u002F Interceptor: додавання токену\n    this.client.interceptors.request.use(async (config) => {\n      const token = await tokenService.getAccessToken();\n      if (token) {\n        config.headers.Authorization = `Bearer ${token}`;\n      }\n      return config;\n    });\n\n    \u002F\u002F Interceptor: обробка 401\n    this.client.interceptors.response.use(\n      (response) => response,\n      async (error) => {\n        if (error.response?.status === 401) {\n          await tokenService.clearTokens();\n        }\n        return Promise.reject(error);\n      }\n    );\n  }\n\n  \u002F\u002F ... (методи login, register, logout, getCurrentUser)\n}\n",[3782,41633,41634,41638,41650,41654,41662,41674,41678,41684,41702,41711,41719,41723,41727,41732,41766,41784,41794,41820,41824,41832,41836,41840,41845,41867,41881,41895,41917,41929,41933,41949,41953,41957,41961,41965,41970],{"__ignoreMap":3865},[3946,41635,41636],{"class":3948,"line":3949},[3946,41637,8276],{"class":4342},[3946,41639,41640,41642,41644,41646,41648],{"class":3948,"line":3956},[3946,41641,4252],{"class":4251},[3946,41643,8287],{"class":4262},[3946,41645,4266],{"class":4251},[3946,41647,8305],{"class":3966},[3946,41649,4272],{"class":3952},[3946,41651,41652],{"class":3948,"line":3973},[3946,41653,4278],{"emptyLinePlaceholder":4277},[3946,41655,41656,41658,41660],{"class":3948,"line":3986},[3946,41657,6898],{"class":4255},[3946,41659,8463],{"class":4403},[3946,41661,4427],{"class":3952},[3946,41663,41664,41666,41668,41670,41672],{"class":3948,"line":3999},[3946,41665,8470],{"class":4255},[3946,41667,8473],{"class":4262},[3946,41669,3963],{"class":3952},[3946,41671,8298],{"class":4403},[3946,41673,4272],{"class":3952},[3946,41675,41676],{"class":3948,"line":4012},[3946,41677,4278],{"emptyLinePlaceholder":4277},[3946,41679,41680,41682],{"class":3948,"line":4026},[3946,41681,6591],{"class":4255},[3946,41683,8490],{"class":3952},[3946,41685,41686,41688,41690,41692,41694,41696,41698,41700],{"class":3948,"line":4037},[3946,41687,6674],{"class":4255},[3946,41689,4298],{"class":3952},[3946,41691,8499],{"class":4262},[3946,41693,4290],{"class":3952},[3946,41695,8504],{"class":4262},[3946,41697,4298],{"class":3952},[3946,41699,8509],{"class":4224},[3946,41701,8512],{"class":3952},[3946,41703,41704,41706,41709],{"class":3948,"line":4487},[3946,41705,8517],{"class":4262},[3946,41707,41708],{"class":3966}," 'http:\u002F\u002Flocalhost:3000'",[3946,41710,3970],{"class":3952},[3946,41712,41713,41715,41717],{"class":3948,"line":4507},[3946,41714,8526],{"class":4262},[3946,41716,27320],{"class":4020},[3946,41718,3970],{"class":3952},[3946,41720,41721],{"class":3948,"line":4518},[3946,41722,8560],{"class":3952},[3946,41724,41725],{"class":3948,"line":4524},[3946,41726,4278],{"emptyLinePlaceholder":4277},[3946,41728,41729],{"class":3948,"line":4529},[3946,41730,41731],{"class":4342},"    \u002F\u002F Interceptor: додавання токену\n",[3946,41733,41734,41736,41738,41740,41742,41744,41746,41748,41750,41752,41754,41756,41758,41760,41762,41764],{"class":3948,"line":4534},[3946,41735,6674],{"class":4255},[3946,41737,4298],{"class":3952},[3946,41739,8499],{"class":4262},[3946,41741,4298],{"class":3952},[3946,41743,8582],{"class":4262},[3946,41745,4298],{"class":3952},[3946,41747,8587],{"class":4262},[3946,41749,4298],{"class":3952},[3946,41751,8592],{"class":4224},[3946,41753,4331],{"class":3952},[3946,41755,4387],{"class":4255},[3946,41757,4479],{"class":3952},[3946,41759,8604],{"class":4262},[3946,41761,5783],{"class":3952},[3946,41763,6453],{"class":4255},[3946,41765,4427],{"class":3952},[3946,41767,41768,41770,41772,41774,41776,41778,41780,41782],{"class":3948,"line":4540},[3946,41769,6984],{"class":4255},[3946,41771,4580],{"class":4286},[3946,41773,4290],{"class":3952},[3946,41775,4293],{"class":4251},[3946,41777,8213],{"class":4262},[3946,41779,4298],{"class":3952},[3946,41781,8628],{"class":4224},[3946,41783,4304],{"class":3952},[3946,41785,41786,41788,41790,41792],{"class":3948,"line":4567},[3946,41787,7246],{"class":4251},[3946,41789,4479],{"class":3952},[3946,41791,4398],{"class":4262},[3946,41793,4318],{"class":3952},[3946,41795,41796,41798,41800,41802,41804,41806,41808,41810,41812,41814,41816,41818],{"class":3948,"line":4574},[3946,41797,27422],{"class":4262},[3946,41799,4298],{"class":3952},[3946,41801,8656],{"class":4262},[3946,41803,4298],{"class":3952},[3946,41805,8661],{"class":4262},[3946,41807,4290],{"class":3952},[3946,41809,8666],{"class":3966},[3946,41811,8669],{"class":4255},[3946,41813,4398],{"class":4262},[3946,41815,8674],{"class":4255},[3946,41817,8677],{"class":3966},[3946,41819,4272],{"class":3952},[3946,41821,41822],{"class":3948,"line":4600},[3946,41823,7282],{"class":3952},[3946,41825,41826,41828,41830],{"class":3948,"line":4610},[3946,41827,7405],{"class":4251},[3946,41829,8695],{"class":4262},[3946,41831,4272],{"class":3952},[3946,41833,41834],{"class":3948,"line":4623},[3946,41835,8560],{"class":3952},[3946,41837,41838],{"class":3948,"line":4643},[3946,41839,4278],{"emptyLinePlaceholder":4277},[3946,41841,41842],{"class":3948,"line":4653},[3946,41843,41844],{"class":4342},"    \u002F\u002F Interceptor: обробка 401\n",[3946,41846,41847,41849,41851,41853,41855,41857,41859,41861,41863,41865],{"class":3948,"line":4658},[3946,41848,6674],{"class":4255},[3946,41850,4298],{"class":3952},[3946,41852,8499],{"class":4262},[3946,41854,4298],{"class":3952},[3946,41856,8582],{"class":4262},[3946,41858,4298],{"class":3952},[3946,41860,8757],{"class":4262},[3946,41862,4298],{"class":3952},[3946,41864,8592],{"class":4224},[3946,41866,6594],{"class":3952},[3946,41868,41869,41871,41873,41875,41877,41879],{"class":3948,"line":4663},[3946,41870,8706],{"class":3952},[3946,41872,8757],{"class":4262},[3946,41874,5783],{"class":3952},[3946,41876,6453],{"class":4255},[3946,41878,8776],{"class":4262},[3946,41880,3970],{"class":3952},[3946,41882,41883,41885,41887,41889,41891,41893],{"class":3948,"line":4668},[3946,41884,8599],{"class":4255},[3946,41886,4479],{"class":3952},[3946,41888,4482],{"class":4262},[3946,41890,5783],{"class":3952},[3946,41892,6453],{"class":4255},[3946,41894,4427],{"class":3952},[3946,41896,41897,41899,41901,41903,41905,41907,41909,41911,41913,41915],{"class":3948,"line":4674},[3946,41898,8640],{"class":4251},[3946,41900,4479],{"class":3952},[3946,41902,4482],{"class":4262},[3946,41904,4298],{"class":3952},[3946,41906,8757],{"class":4262},[3946,41908,7539],{"class":3952},[3946,41910,8813],{"class":4262},[3946,41912,8816],{"class":3952},[3946,41914,8819],{"class":4020},[3946,41916,4318],{"class":3952},[3946,41918,41919,41921,41923,41925,41927],{"class":3948,"line":4694},[3946,41920,8831],{"class":4251},[3946,41922,8213],{"class":4262},[3946,41924,4298],{"class":3952},[3946,41926,7382],{"class":4224},[3946,41928,4304],{"class":3952},[3946,41930,41931],{"class":3948,"line":4701},[3946,41932,8684],{"class":3952},[3946,41934,41935,41937,41939,41941,41943,41945,41947],{"class":3948,"line":4719},[3946,41936,7273],{"class":4251},[3946,41938,6456],{"class":4403},[3946,41940,4298],{"class":3952},[3946,41942,8719],{"class":4224},[3946,41944,4331],{"class":3952},[3946,41946,4482],{"class":4262},[3946,41948,4337],{"class":3952},[3946,41950,41951],{"class":3948,"line":4735},[3946,41952,7282],{"class":3952},[3946,41954,41955],{"class":3948,"line":4748},[3946,41956,8731],{"class":3952},[3946,41958,41959],{"class":3948,"line":4768},[3946,41960,4521],{"class":3952},[3946,41962,41963],{"class":3948,"line":4777},[3946,41964,4278],{"emptyLinePlaceholder":4277},[3946,41966,41967],{"class":3948,"line":4782},[3946,41968,41969],{"class":4342},"  \u002F\u002F ... (методи login, register, logout, getCurrentUser)\n",[3946,41971,41972],{"class":3948,"line":6262},[3946,41973,4040],{"class":3952},[3743,41975,40450,41976,13298,41978],{},[3771,41977,41419],{},[3782,41979,41980],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fapi\u002FauthApi.ts",[3743,41982,41983],{},[3771,41984,41609],{},[3878,41986,41987,41990,41993,41996],{},[3768,41988,41989],{},"🔵 Request interceptor — автоматичне додавання Bearer token",[3768,41991,41992],{},"⚠️ Response interceptor — глобальна обробка 401",[3768,41994,41995],{},"📝 Детальні повідомлення помилок для користувача",[3768,41997,41998],{},"🎯 Type-safe методи з TypeScript",[3743,42000,42001,42004],{},[3771,42002,42003],{},"4. Auth Context (AuthContext.tsx)"," — Глобальний стан",[3857,42006,42008],{"className":4242,"code":42007,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext.tsx\nexport function AuthProvider({ children }: AuthProviderProps) {\n  const [state, setState] = useState\u003CAuthState>({\n    user: null,\n    isAuthenticated: false,\n    isLoading: true, \u002F\u002F Початково true!\n    error: null,\n  });\n\n  \u002F\u002F Відновлення сесії при старті\n  useEffect(() => {\n    restoreSession();\n  }, []);\n\n  const login = async (credentials) => {\n    const response = await authApi.login(credentials);\n    await tokenService.saveTokens(\u002F*...*\u002F);\n    setAuthenticated(response.user);\n  };\n\n  const logout = async () => {\n    await authApi.logout();\n    await tokenService.clearTokens();\n    setUnauthenticated();\n  };\n\n  \u002F\u002F ...\n}\n",[3782,42009,42010,42014,42032,42054,42062,42070,42081,42089,42093,42097,42102,42112,42118,42122,42126,42146,42168,42185,42200,42204,42208,42224,42236,42248,42255,42259,42263,42268],{"__ignoreMap":3865},[3946,42011,42012],{"class":3948,"line":3949},[3946,42013,10233],{"class":4342},[3946,42015,42016,42018,42020,42022,42024,42026,42028,42030],{"class":3948,"line":3956},[3946,42017,6030],{"class":4251},[3946,42019,4390],{"class":4255},[3946,42021,10503],{"class":4224},[3946,42023,10506],{"class":3952},[3946,42025,10509],{"class":4262},[3946,42027,10512],{"class":3952},[3946,42029,10515],{"class":4403},[3946,42031,4318],{"class":3952},[3946,42033,42034,42036,42038,42040,42042,42044,42046,42048,42050,42052],{"class":3948,"line":3973},[3946,42035,5018],{"class":4255},[3946,42037,10529],{"class":3952},[3946,42039,10532],{"class":4286},[3946,42041,4447],{"class":3952},[3946,42043,10537],{"class":4286},[3946,42045,10540],{"class":3952},[3946,42047,10543],{"class":4224},[3946,42049,4413],{"class":3952},[3946,42051,10548],{"class":4403},[3946,42053,10551],{"class":3952},[3946,42055,42056,42058,42060],{"class":3948,"line":3986},[3946,42057,10556],{"class":4262},[3946,42059,4648],{"class":4255},[3946,42061,3970],{"class":3952},[3946,42063,42064,42066,42068],{"class":3948,"line":3999},[3946,42065,10565],{"class":4262},[3946,42067,7628],{"class":4255},[3946,42069,3970],{"class":3952},[3946,42071,42072,42074,42076,42078],{"class":3948,"line":4012},[3946,42073,10574],{"class":4262},[3946,42075,4960],{"class":4255},[3946,42077,4447],{"class":3952},[3946,42079,42080],{"class":4342},"\u002F\u002F Початково true!\n",[3946,42082,42083,42085,42087],{"class":3948,"line":4026},[3946,42084,10586],{"class":4262},[3946,42086,4648],{"class":4255},[3946,42088,3970],{"class":3952},[3946,42090,42091],{"class":3948,"line":4037},[3946,42092,4977],{"class":3952},[3946,42094,42095],{"class":3948,"line":4487},[3946,42096,4278],{"emptyLinePlaceholder":4277},[3946,42098,42099],{"class":3948,"line":4507},[3946,42100,42101],{"class":4342},"  \u002F\u002F Відновлення сесії при старті\n",[3946,42103,42104,42106,42108,42110],{"class":3948,"line":4518},[3946,42105,10265],{"class":4224},[3946,42107,10707],{"class":3952},[3946,42109,6453],{"class":4255},[3946,42111,4427],{"class":3952},[3946,42113,42114,42116],{"class":3948,"line":4524},[3946,42115,12421],{"class":4224},[3946,42117,4304],{"class":3952},[3946,42119,42120],{"class":3948,"line":4529},[3946,42121,10676],{"class":3952},[3946,42123,42124],{"class":3948,"line":4534},[3946,42125,4278],{"emptyLinePlaceholder":4277},[3946,42127,42128,42130,42132,42134,42136,42138,42140,42142,42144],{"class":3948,"line":4540},[3946,42129,5018],{"class":4255},[3946,42131,8914],{"class":4224},[3946,42133,4290],{"class":3952},[3946,42135,4387],{"class":4255},[3946,42137,4479],{"class":3952},[3946,42139,6443],{"class":4262},[3946,42141,5783],{"class":3952},[3946,42143,6453],{"class":4255},[3946,42145,4427],{"class":3952},[3946,42147,42148,42150,42152,42154,42156,42158,42160,42162,42164,42166],{"class":3948,"line":4567},[3946,42149,4577],{"class":4255},[3946,42151,8776],{"class":4286},[3946,42153,4290],{"class":3952},[3946,42155,4293],{"class":4251},[3946,42157,10106],{"class":4262},[3946,42159,4298],{"class":3952},[3946,42161,11402],{"class":4224},[3946,42163,4331],{"class":3952},[3946,42165,6443],{"class":4262},[3946,42167,4337],{"class":3952},[3946,42169,42170,42172,42174,42176,42178,42180,42183],{"class":3948,"line":4574},[3946,42171,4432],{"class":4251},[3946,42173,8213],{"class":4262},[3946,42175,4298],{"class":3952},[3946,42177,7869],{"class":4224},[3946,42179,4331],{"class":3952},[3946,42181,42182],{"class":4342},"\u002F*...*\u002F",[3946,42184,4337],{"class":3952},[3946,42186,42187,42190,42192,42194,42196,42198],{"class":3948,"line":4600},[3946,42188,42189],{"class":4224},"    setAuthenticated",[3946,42191,4331],{"class":3952},[3946,42193,8757],{"class":4262},[3946,42195,4298],{"class":3952},[3946,42197,10775],{"class":4262},[3946,42199,4337],{"class":3952},[3946,42201,42202],{"class":3948,"line":4610},[3946,42203,15539],{"class":3952},[3946,42205,42206],{"class":3948,"line":4623},[3946,42207,4278],{"emptyLinePlaceholder":4277},[3946,42209,42210,42212,42214,42216,42218,42220,42222],{"class":3948,"line":4643},[3946,42211,5018],{"class":4255},[3946,42213,9202],{"class":4224},[3946,42215,4290],{"class":3952},[3946,42217,4387],{"class":4255},[3946,42219,11004],{"class":3952},[3946,42221,6453],{"class":4255},[3946,42223,4427],{"class":3952},[3946,42225,42226,42228,42230,42232,42234],{"class":3948,"line":4653},[3946,42227,4432],{"class":4251},[3946,42229,10106],{"class":4262},[3946,42231,4298],{"class":3952},[3946,42233,11981],{"class":4224},[3946,42235,4304],{"class":3952},[3946,42237,42238,42240,42242,42244,42246],{"class":3948,"line":4658},[3946,42239,4432],{"class":4251},[3946,42241,8213],{"class":4262},[3946,42243,4298],{"class":3952},[3946,42245,7382],{"class":4224},[3946,42247,4304],{"class":3952},[3946,42249,42250,42253],{"class":3948,"line":4663},[3946,42251,42252],{"class":4224},"    setUnauthenticated",[3946,42254,4304],{"class":3952},[3946,42256,42257],{"class":3948,"line":4668},[3946,42258,15539],{"class":3952},[3946,42260,42261],{"class":3948,"line":4674},[3946,42262,4278],{"emptyLinePlaceholder":4277},[3946,42264,42265],{"class":3948,"line":4694},[3946,42266,42267],{"class":4342},"  \u002F\u002F ...\n",[3946,42269,42270],{"class":3948,"line":4701},[3946,42271,4040],{"class":3952},[3743,42273,40450,42274,13298,42276],{},[3771,42275,41419],{},[3782,42277,42278],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext.tsx",[3743,42280,42281],{},[3771,42282,42283],{},"Lifecycle:",[3857,42285,42288],{"className":42286,"code":42287,"language":3862},[3860],"App Start\n   ↓\nAuthProvider init (isLoading: true)\n   ↓\nrestoreSession()\n   ├─ Tokens found & valid → fetch user → setAuthenticated\n   └─ No tokens → setUnauthenticated\n   ↓\nisLoading: false → Navigation renders\n",[3782,42289,42287],{"__ignoreMap":3865},[3750,42291,42293],{"id":42292},"_114-ui-components-та-screens","11.4. UI Components та Screens",[3847,42295,42297],{"id":42296},"крок-5-створення-компонентів","Крок 5: Створення компонентів",[3743,42299,42300,42303],{},[3771,42301,42302],{},"Auth Input"," — кастомний input з валідацією:",[3857,42305,42307],{"className":4242,"code":42306,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthInput.tsx\nexport function AuthInput({\n  label,\n  error,\n  secureTextEntry,\n  ...rest\n}: AuthInputProps) {\n  const [isSecure, setIsSecure] = useState(secureTextEntry);\n\n  return (\n    \u003CView>\n      {label && \u003CText style={styles.label}>{label}\u003C\u002FText>}\n      \n      \u003CTextInput\n        style={[styles.input, error && styles.inputError]}\n        secureTextEntry={isSecure}\n        {...rest}\n      \u002F>\n      \n      {secureTextEntry && (\n        \u003CTouchableOpacity onPress={() => setIsSecure(!isSecure)}>\n          \u003CIonicons name={isSecure ? 'eye-off' : 'eye'} \u002F>\n        \u003C\u002FTouchableOpacity>\n      )}\n      \n      {error && \u003CText style={styles.errorText}>{error}\u003C\u002FText>}\n    \u003C\u002FView>\n  );\n}\n",[3782,42308,42309,42314,42325,42331,42337,42343,42349,42358,42380,42384,42390,42398,42424,42428,42434,42448,42453,42458,42462,42466,42471,42476,42486,42494,42498,42502,42532,42540,42544],{"__ignoreMap":3865},[3946,42310,42311],{"class":3948,"line":3949},[3946,42312,42313],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthInput.tsx\n",[3946,42315,42316,42318,42320,42323],{"class":3948,"line":3956},[3946,42317,6030],{"class":4251},[3946,42319,4390],{"class":4255},[3946,42321,42322],{"class":4224}," AuthInput",[3946,42324,8512],{"class":3952},[3946,42326,42327,42329],{"class":3948,"line":3973},[3946,42328,21978],{"class":4262},[3946,42330,3970],{"class":3952},[3946,42332,42333,42335],{"class":3948,"line":3986},[3946,42334,6379],{"class":4262},[3946,42336,3970],{"class":3952},[3946,42338,42339,42341],{"class":3948,"line":3999},[3946,42340,21999],{"class":4262},[3946,42342,3970],{"class":3952},[3946,42344,42345,42347],{"class":3948,"line":4012},[3946,42346,21442],{"class":3952},[3946,42348,21445],{"class":4262},[3946,42350,42351,42353,42356],{"class":3948,"line":4026},[3946,42352,21450],{"class":3952},[3946,42354,42355],{"class":4403},"AuthInputProps",[3946,42357,4318],{"class":3952},[3946,42359,42360,42362,42364,42366,42368,42370,42372,42374,42376,42378],{"class":3948,"line":4037},[3946,42361,5018],{"class":4255},[3946,42363,10529],{"class":3952},[3946,42365,22072],{"class":4286},[3946,42367,4447],{"class":3952},[3946,42369,22077],{"class":4286},[3946,42371,10540],{"class":3952},[3946,42373,10543],{"class":4224},[3946,42375,4331],{"class":3952},[3946,42377,22086],{"class":4262},[3946,42379,4337],{"class":3952},[3946,42381,42382],{"class":3948,"line":4487},[3946,42383,4278],{"emptyLinePlaceholder":4277},[3946,42385,42386,42388],{"class":3948,"line":4507},[3946,42387,5062],{"class":4251},[3946,42389,13079],{"class":3952},[3946,42391,42392,42394,42396],{"class":3948,"line":4518},[3946,42393,13158],{"class":3952},[3946,42395,12926],{"class":4403},[3946,42397,13135],{"class":3952},[3946,42399,42400,42402,42404,42406,42408,42410,42412,42414,42416,42418,42420,42422],{"class":3948,"line":4524},[3946,42401,13167],{"class":3952},[3946,42403,22119],{"class":4262},[3946,42405,22122],{"class":3952},[3946,42407,14762],{"class":4262},[3946,42409,13089],{"class":4262},[3946,42411,13092],{"class":3952},[3946,42413,22119],{"class":4262},[3946,42415,12608],{"class":3952},[3946,42417,22119],{"class":4262},[3946,42419,12613],{"class":3952},[3946,42421,14762],{"class":4262},[3946,42423,22141],{"class":3952},[3946,42425,42426],{"class":3948,"line":4529},[3946,42427,7095],{"class":3952},[3946,42429,42430,42432],{"class":3948,"line":4534},[3946,42431,13084],{"class":3952},[3946,42433,22167],{"class":4262},[3946,42435,42436,42438,42440,42443,42445],{"class":3948,"line":4540},[3946,42437,29480],{"class":4262},[3946,42439,12602],{"class":3952},[3946,42441,42442],{"class":4262},"[styles.input, error ",[3946,42444,21501],{"class":3952},[3946,42446,42447],{"class":4262}," styles.inputError]}\n",[3946,42449,42450],{"class":3948,"line":4567},[3946,42451,42452],{"class":4262},"        secureTextEntry={isSecure}\n",[3946,42454,42455],{"class":3948,"line":4574},[3946,42456,42457],{"class":4262},"        {...rest}\n",[3946,42459,42460],{"class":3948,"line":4600},[3946,42461,14410],{"class":4262},[3946,42463,42464],{"class":3948,"line":4610},[3946,42465,7095],{"class":4262},[3946,42467,42468],{"class":3948,"line":4623},[3946,42469,42470],{"class":4262},"      {secureTextEntry && (\n",[3946,42472,42473],{"class":3948,"line":4643},[3946,42474,42475],{"class":4262},"        \u003CTouchableOpacity onPress={() => setIsSecure(!isSecure)}>\n",[3946,42477,42478,42481,42484],{"class":3948,"line":4653},[3946,42479,42480],{"class":4262},"          \u003CIonicons name={isSecure ? 'eye-off' :",[3946,42482,42483],{"class":3966}," 'eye'",[3946,42485,13631],{"class":3952},[3946,42487,42488,42490,42492],{"class":3948,"line":4658},[3946,42489,15256],{"class":3952},[3946,42491,14771],{"class":4262},[3946,42493,13135],{"class":3952},[3946,42495,42496],{"class":3948,"line":4663},[3946,42497,21608],{"class":3952},[3946,42499,42500],{"class":3948,"line":4668},[3946,42501,7095],{"class":3952},[3946,42503,42504,42506,42508,42510,42512,42514,42516,42518,42520,42522,42524,42526,42528,42530],{"class":3948,"line":4674},[3946,42505,13167],{"class":3952},[3946,42507,4482],{"class":4262},[3946,42509,22122],{"class":3952},[3946,42511,14762],{"class":4403},[3946,42513,13089],{"class":4403},[3946,42515,12602],{"class":3952},[3946,42517,22341],{"class":4403},[3946,42519,4298],{"class":3952},[3946,42521,22346],{"class":4262},[3946,42523,12608],{"class":3952},[3946,42525,4482],{"class":4262},[3946,42527,12613],{"class":3952},[3946,42529,14762],{"class":4262},[3946,42531,22141],{"class":3952},[3946,42533,42534,42536,42538],{"class":3948,"line":4694},[3946,42535,13187],{"class":3952},[3946,42537,12926],{"class":4262},[3946,42539,13135],{"class":3952},[3946,42541,42542],{"class":3948,"line":4701},[3946,42543,10875],{"class":3952},[3946,42545,42546],{"class":3948,"line":4719},[3946,42547,4040],{"class":3952},[3743,42549,40450,42550,13298,42552],{},[3771,42551,41419],{},[3782,42553,42554],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthInput.tsx",[3743,42556,42557,42560],{},[3771,42558,42559],{},"Auth Button"," — кнопка з loading state:",[3857,42562,42564],{"className":4242,"code":42563,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthButton.tsx\nexport function AuthButton({ title, loading, variant, ...rest }: AuthButtonProps) {\n  return (\n    \u003CTouchableOpacity\n      style={[styles.button, styles[variant], loading && styles.disabled]}\n      disabled={loading}\n      {...rest}\n    >\n      {loading ? (\n        \u003CActivityIndicator color=\"#FFFFFF\" \u002F>\n      ) : (\n        \u003CText style={styles.text}>{title}\u003C\u002FText>\n      )}\n    \u003C\u002FTouchableOpacity>\n  );\n}\n",[3782,42565,42566,42571,42606,42612,42618,42632,42637,42641,42645,42649,42653,42659,42681,42685,42693,42697],{"__ignoreMap":3865},[3946,42567,42568],{"class":3948,"line":3949},[3946,42569,42570],{"class":4342},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthButton.tsx\n",[3946,42572,42573,42575,42577,42580,42582,42584,42586,42589,42591,42594,42596,42599,42601,42604],{"class":3948,"line":3956},[3946,42574,6030],{"class":4251},[3946,42576,4390],{"class":4255},[3946,42578,42579],{"class":4224}," AuthButton",[3946,42581,10506],{"class":3952},[3946,42583,15121],{"class":4262},[3946,42585,4447],{"class":3952},[3946,42587,42588],{"class":4262},"loading",[3946,42590,4447],{"class":3952},[3946,42592,42593],{"class":4262},"variant",[3946,42595,10666],{"class":3952},[3946,42597,42598],{"class":4262},"rest",[3946,42600,10512],{"class":3952},[3946,42602,42603],{"class":4403},"AuthButtonProps",[3946,42605,4318],{"class":3952},[3946,42607,42608,42610],{"class":3948,"line":3973},[3946,42609,5062],{"class":4251},[3946,42611,13079],{"class":3952},[3946,42613,42614,42616],{"class":3948,"line":3986},[3946,42615,13158],{"class":3952},[3946,42617,15436],{"class":4262},[3946,42619,42620,42622,42624,42627,42629],{"class":3948,"line":3999},[3946,42621,21472],{"class":4262},[3946,42623,12602],{"class":3952},[3946,42625,42626],{"class":4262},"[styles.button, styles[variant], loading ",[3946,42628,21501],{"class":3952},[3946,42630,42631],{"class":4262}," styles.disabled]}\n",[3946,42633,42634],{"class":3948,"line":4012},[3946,42635,42636],{"class":4262},"      disabled={loading}\n",[3946,42638,42639],{"class":3948,"line":4026},[3946,42640,21524],{"class":4262},[3946,42642,42643],{"class":3948,"line":4037},[3946,42644,13602],{"class":4262},[3946,42646,42647],{"class":3948,"line":4487},[3946,42648,21533],{"class":4262},[3946,42650,42651],{"class":3948,"line":4507},[3946,42652,21538],{"class":4262},[3946,42654,42655,42657],{"class":3948,"line":4518},[3946,42656,21543],{"class":4262},[3946,42658,13079],{"class":3952},[3946,42660,42661,42663,42665,42667,42669,42671,42673,42675,42677,42679],{"class":3948,"line":4524},[3946,42662,13103],{"class":3952},[3946,42664,14762],{"class":4262},[3946,42666,13089],{"class":4262},[3946,42668,13092],{"class":3952},[3946,42670,3862],{"class":4262},[3946,42672,12608],{"class":3952},[3946,42674,15121],{"class":4262},[3946,42676,12613],{"class":3952},[3946,42678,14762],{"class":4262},[3946,42680,13135],{"class":3952},[3946,42682,42683],{"class":3948,"line":4529},[3946,42684,21608],{"class":3952},[3946,42686,42687,42689,42691],{"class":3948,"line":4534},[3946,42688,13187],{"class":3952},[3946,42690,14771],{"class":4262},[3946,42692,13135],{"class":3952},[3946,42694,42695],{"class":3948,"line":4540},[3946,42696,10875],{"class":3952},[3946,42698,42699],{"class":3948,"line":4567},[3946,42700,4040],{"class":3952},[3743,42702,40450,42703,13298,42705],{},[3771,42704,41419],{},[3782,42706,42707],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fcomponents\u002FAuthButton.tsx",[3847,42709,42711],{"id":42710},"крок-6-створення-екранів","Крок 6: Створення екранів",[3743,42713,42714],{},[3771,42715,42716],{},"Login Screen:",[3857,42718,42720],{"className":4242,"code":42719,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen.tsx\nexport function LoginScreen() {\n  const { login, isLoading, error, clearError } = useAuth();\n  const [email, setEmail] = useState('');\n  const [password, setPassword] = useState('');\n\n  const handleLogin = async () => {\n    if (!validateForm()) return;\n    \n    try {\n      await login({ email, password });\n      \u002F\u002F Success → router автоматично перенаправить\n    } catch (err) {\n      Alert.alert('Помилка', error);\n    }\n  };\n\n  return (\n    \u003CScrollView>\n      \u003CAuthInput\n        label=\"Email\"\n        value={email}\n        onChangeText={setEmail}\n        keyboardType=\"email-address\"\n      \u002F>\n      \n      \u003CAuthInput\n        label=\"Пароль\"\n        value={password}\n        onChangeText={setPassword}\n        secureTextEntry\n      \u002F>\n      \n      \u003CAuthButton\n        title=\"Увійти\"\n        onPress={handleLogin}\n        loading={isLoading}\n      \u002F>\n    \u003C\u002FScrollView>\n  );\n}\n",[3782,42721,42722,42726,42736,42762,42784,42806,42810,42826,42841,42845,42851,42867,42872,42884,42902,42906,42910,42914,42920,42928,42935,42944,42955,42966,42975,42979,42983,42989,42997,43007,43017,43022,43026,43030,43037,43046,43056,43067,43071,43079,43083],{"__ignoreMap":3865},[3946,42723,42724],{"class":3948,"line":3949},[3946,42725,22682],{"class":4342},[3946,42727,42728,42730,42732,42734],{"class":3948,"line":3956},[3946,42729,6030],{"class":4251},[3946,42731,4390],{"class":4255},[3946,42733,22928],{"class":4224},[3946,42735,8490],{"class":3952},[3946,42737,42738,42740,42742,42744,42746,42748,42750,42752,42754,42756,42758,42760],{"class":3948,"line":3973},[3946,42739,5018],{"class":4255},[3946,42741,6817],{"class":3952},[3946,42743,11402],{"class":4286},[3946,42745,4447],{"class":3952},[3946,42747,13046],{"class":4286},[3946,42749,4447],{"class":3952},[3946,42751,4482],{"class":4286},[3946,42753,4447],{"class":3952},[3946,42755,12569],{"class":4286},[3946,42757,13049],{"class":3952},[3946,42759,12954],{"class":4224},[3946,42761,4304],{"class":3952},[3946,42763,42764,42766,42768,42770,42772,42774,42776,42778,42780,42782],{"class":3948,"line":3986},[3946,42765,5018],{"class":4255},[3946,42767,10529],{"class":3952},[3946,42769,10853],{"class":4286},[3946,42771,4447],{"class":3952},[3946,42773,22981],{"class":4286},[3946,42775,10540],{"class":3952},[3946,42777,10543],{"class":4224},[3946,42779,4331],{"class":3952},[3946,42781,22990],{"class":3966},[3946,42783,4337],{"class":3952},[3946,42785,42786,42788,42790,42792,42794,42796,42798,42800,42802,42804],{"class":3948,"line":3999},[3946,42787,5018],{"class":4255},[3946,42789,10529],{"class":3952},[3946,42791,19836],{"class":4286},[3946,42793,4447],{"class":3952},[3946,42795,23005],{"class":4286},[3946,42797,10540],{"class":3952},[3946,42799,10543],{"class":4224},[3946,42801,4331],{"class":3952},[3946,42803,22990],{"class":3966},[3946,42805,4337],{"class":3952},[3946,42807,42808],{"class":3948,"line":4012},[3946,42809,4278],{"emptyLinePlaceholder":4277},[3946,42811,42812,42814,42816,42818,42820,42822,42824],{"class":3948,"line":4026},[3946,42813,5018],{"class":4255},[3946,42815,23434],{"class":4224},[3946,42817,4290],{"class":3952},[3946,42819,4387],{"class":4255},[3946,42821,11004],{"class":3952},[3946,42823,6453],{"class":4255},[3946,42825,4427],{"class":3952},[3946,42827,42828,42830,42832,42834,42837,42839],{"class":3948,"line":4037},[3946,42829,5503],{"class":4251},[3946,42831,4312],{"class":3952},[3946,42833,23464],{"class":4224},[3946,42835,42836],{"class":3952},"()) ",[3946,42838,5786],{"class":4251},[3946,42840,4272],{"class":3952},[3946,42842,42843],{"class":3948,"line":4487},[3946,42844,7612],{"class":3952},[3946,42846,42847,42849],{"class":3948,"line":4507},[3946,42848,6977],{"class":4251},[3946,42850,4427],{"class":3952},[3946,42852,42853,42855,42857,42859,42861,42863,42865],{"class":3948,"line":4518},[3946,42854,7069],{"class":4251},[3946,42856,8914],{"class":4224},[3946,42858,10506],{"class":3952},[3946,42860,10853],{"class":4262},[3946,42862,4447],{"class":3952},[3946,42864,19836],{"class":4262},[3946,42866,10726],{"class":3952},[3946,42868,42869],{"class":3948,"line":4524},[3946,42870,42871],{"class":4342},"      \u002F\u002F Success → router автоматично перенаправить\n",[3946,42873,42874,42876,42878,42880,42882],{"class":3948,"line":4529},[3946,42875,7115],{"class":3952},[3946,42877,4476],{"class":4251},[3946,42879,4479],{"class":3952},[3946,42881,19689],{"class":4262},[3946,42883,4318],{"class":3952},[3946,42885,42886,42888,42890,42892,42894,42896,42898,42900],{"class":3948,"line":4534},[3946,42887,23537],{"class":4262},[3946,42889,4298],{"class":3952},[3946,42891,23542],{"class":4224},[3946,42893,4331],{"class":3952},[3946,42895,29130],{"class":3966},[3946,42897,4447],{"class":3952},[3946,42899,4482],{"class":4262},[3946,42901,4337],{"class":3952},[3946,42903,42904],{"class":3948,"line":4540},[3946,42905,5550],{"class":3952},[3946,42907,42908],{"class":3948,"line":4567},[3946,42909,15539],{"class":3952},[3946,42911,42912],{"class":3948,"line":4574},[3946,42913,4278],{"emptyLinePlaceholder":4277},[3946,42915,42916,42918],{"class":3948,"line":4600},[3946,42917,5062],{"class":4251},[3946,42919,13079],{"class":3952},[3946,42921,42922,42924,42926],{"class":3948,"line":4610},[3946,42923,13158],{"class":3952},[3946,42925,24325],{"class":4403},[3946,42927,13135],{"class":3952},[3946,42929,42930,42932],{"class":3948,"line":4623},[3946,42931,13084],{"class":3952},[3946,42933,42934],{"class":4262},"AuthInput\n",[3946,42936,42937,42940,42942],{"class":3948,"line":4643},[3946,42938,42939],{"class":4262},"        label",[3946,42941,13111],{"class":3952},[3946,42943,23887],{"class":3966},[3946,42945,42946,42949,42951,42953],{"class":3948,"line":4653},[3946,42947,42948],{"class":4262},"        value",[3946,42950,12602],{"class":3952},[3946,42952,10853],{"class":4262},[3946,42954,4040],{"class":3952},[3946,42956,42957,42960,42962,42964],{"class":3948,"line":4658},[3946,42958,42959],{"class":4262},"        onChangeText",[3946,42961,12602],{"class":3952},[3946,42963,22981],{"class":4262},[3946,42965,4040],{"class":3952},[3946,42967,42968,42971,42973],{"class":3948,"line":4663},[3946,42969,42970],{"class":4262},"        keyboardType",[3946,42972,13111],{"class":3952},[3946,42974,23941],{"class":3966},[3946,42976,42977],{"class":3948,"line":4668},[3946,42978,14410],{"class":3952},[3946,42980,42981],{"class":3948,"line":4674},[3946,42982,7095],{"class":3952},[3946,42984,42985,42987],{"class":3948,"line":4694},[3946,42986,13084],{"class":3952},[3946,42988,42934],{"class":4262},[3946,42990,42991,42993,42995],{"class":3948,"line":4701},[3946,42992,42939],{"class":4262},[3946,42994,13111],{"class":3952},[3946,42996,23997],{"class":3966},[3946,42998,42999,43001,43003,43005],{"class":3948,"line":4719},[3946,43000,42948],{"class":4262},[3946,43002,12602],{"class":3952},[3946,43004,19836],{"class":4262},[3946,43006,4040],{"class":3952},[3946,43008,43009,43011,43013,43015],{"class":3948,"line":4735},[3946,43010,42959],{"class":4262},[3946,43012,12602],{"class":3952},[3946,43014,23005],{"class":4262},[3946,43016,4040],{"class":3952},[3946,43018,43019],{"class":3948,"line":4748},[3946,43020,43021],{"class":4262},"        secureTextEntry\n",[3946,43023,43024],{"class":3948,"line":4768},[3946,43025,14410],{"class":3952},[3946,43027,43028],{"class":3948,"line":4777},[3946,43029,7095],{"class":3952},[3946,43031,43032,43034],{"class":3948,"line":4782},[3946,43033,13084],{"class":3952},[3946,43035,43036],{"class":4262},"AuthButton\n",[3946,43038,43039,43042,43044],{"class":3948,"line":6262},[3946,43040,43041],{"class":4262},"        title",[3946,43043,13111],{"class":3952},[3946,43045,24085],{"class":3966},[3946,43047,43048,43050,43052,43054],{"class":3948,"line":6273},[3946,43049,29492],{"class":4262},[3946,43051,12602],{"class":3952},[3946,43053,24094],{"class":4262},[3946,43055,4040],{"class":3952},[3946,43057,43058,43061,43063,43065],{"class":3948,"line":6284},[3946,43059,43060],{"class":4262},"        loading",[3946,43062,12602],{"class":3952},[3946,43064,13046],{"class":4262},[3946,43066,4040],{"class":3952},[3946,43068,43069],{"class":3948,"line":6299},[3946,43070,14410],{"class":3952},[3946,43072,43073,43075,43077],{"class":3948,"line":6304},[3946,43074,13187],{"class":3952},[3946,43076,24325],{"class":4262},[3946,43078,13135],{"class":3952},[3946,43080,43081],{"class":3948,"line":6309},[3946,43082,10875],{"class":3952},[3946,43084,43085],{"class":3948,"line":6314},[3946,43086,4040],{"class":3952},[3743,43088,40450,43089,13298,43091],{},[3771,43090,41419],{},[3782,43092,43093],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen.tsx",[3743,43095,43096],{},[3771,43097,43098],{},"Register Screen:",[3743,43100,43101],{},"Аналогічно до Login, але з додатковими полями:",[3878,43103,43104,43107,43109,43112],{},[3768,43105,43106],{},"Name",[3768,43108,24261],{},[3768,43110,43111],{},"Password",[3768,43113,43114],{},"Confirm Password",[3743,43116,40450,43117,13298,43119],{},[3771,43118,41419],{},[3782,43120,43121],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fsrc\u002Ffeatures\u002Fauth\u002Fscreens\u002FRegisterScreen.tsx",[3750,43123,43125],{"id":43124},"_115-backend-mock-server","11.5. Backend Mock Server",[3847,43127,43129],{"id":43128},"крок-7-створення-auth-serverjs","Крок 7: Створення auth-server.js",[3743,43131,43132],{},"Створимо простий Express сервер для тестування:",[3857,43134,43138],{"className":43135,"code":43136,"language":43137,"meta":3865,"style":3865},"language-javascript shiki shiki-themes light-plus dark-plus dark-plus","\u002F\u002F auth-server.js\nconst express = require('express');\nconst fs = require('fs');\n\nconst app = express();\napp.use(express.json());\n\nfunction generateToken(user) {\n  const payload = { userId: user.id, email: user.email, exp: Date.now() + 3600000 };\n  return Buffer.from(JSON.stringify(payload)).toString('base64');\n}\n\napp.post('\u002Fauth\u002Flogin', (req, res) => {\n  const { email, password } = req.body;\n  const db = JSON.parse(fs.readFileSync('db.json'));\n  const user = db.users.find(u => u.email === email && u.password === password);\n\n  if (!user) {\n    return res.status(401).json({ message: 'Невірний email або пароль' });\n  }\n\n  res.json({\n    user: { id: user.id, email: user.email, name: user.name, role: user.role },\n    accessToken: generateToken(user),\n    refreshToken: generateToken(user),\n    expiresIn: 3600,\n  });\n});\n\n\u002F\u002F ... (решта endpoints)\n\napp.listen(3000, () => console.log('✅ Server на http:\u002F\u002Flocalhost:3000'));\n","javascript",[3782,43139,43140,43145,43163,43181,43185,43197,43215,43219,43232,43276,43313,43317,43321,43348,43370,43402,43451,43455,43465,43491,43495,43499,43509,43557,43570,43583,43591,43595,43599,43603,43608,43612],{"__ignoreMap":3865},[3946,43141,43142],{"class":3948,"line":3949},[3946,43143,43144],{"class":4342},"\u002F\u002F auth-server.js\n",[3946,43146,43147,43149,43151,43153,43156,43158,43161],{"class":3948,"line":3956},[3946,43148,4283],{"class":4255},[3946,43150,19207],{"class":4286},[3946,43152,4290],{"class":3952},[3946,43154,43155],{"class":4224},"require",[3946,43157,4331],{"class":3952},[3946,43159,43160],{"class":3966},"'express'",[3946,43162,4337],{"class":3952},[3946,43164,43165,43167,43170,43172,43174,43176,43179],{"class":3948,"line":3973},[3946,43166,4283],{"class":4255},[3946,43168,43169],{"class":4286}," fs",[3946,43171,4290],{"class":3952},[3946,43173,43155],{"class":4224},[3946,43175,4331],{"class":3952},[3946,43177,43178],{"class":3966},"'fs'",[3946,43180,4337],{"class":3952},[3946,43182,43183],{"class":3948,"line":3986},[3946,43184,4278],{"emptyLinePlaceholder":4277},[3946,43186,43187,43189,43191,43193,43195],{"class":3948,"line":3999},[3946,43188,4283],{"class":4255},[3946,43190,19265],{"class":4286},[3946,43192,4290],{"class":3952},[3946,43194,19270],{"class":4224},[3946,43196,4304],{"class":3952},[3946,43198,43199,43201,43203,43205,43207,43209,43211,43213],{"class":3948,"line":4012},[3946,43200,19314],{"class":4262},[3946,43202,4298],{"class":3952},[3946,43204,8592],{"class":4224},[3946,43206,4331],{"class":3952},[3946,43208,19270],{"class":4262},[3946,43210,4298],{"class":3952},[3946,43212,3942],{"class":4224},[3946,43214,19330],{"class":3952},[3946,43216,43217],{"class":3948,"line":4026},[3946,43218,4278],{"emptyLinePlaceholder":4277},[3946,43220,43221,43223,43226,43228,43230],{"class":3948,"line":4037},[3946,43222,14029],{"class":4255},[3946,43224,43225],{"class":4224}," generateToken",[3946,43227,4331],{"class":3952},[3946,43229,10775],{"class":4262},[3946,43231,4318],{"class":3952},[3946,43233,43234,43236,43239,43241,43243,43245,43247,43249,43251,43253,43255,43257,43259,43261,43264,43266,43268,43270,43272,43274],{"class":3948,"line":4487},[3946,43235,5018],{"class":4255},[3946,43237,43238],{"class":4286}," payload",[3946,43240,23100],{"class":3952},[3946,43242,19977],{"class":4262},[3946,43244,11201],{"class":4262},[3946,43246,4298],{"class":3952},[3946,43248,19984],{"class":4262},[3946,43250,4447],{"class":3952},[3946,43252,19989],{"class":4262},[3946,43254,11201],{"class":4262},[3946,43256,4298],{"class":3952},[3946,43258,10853],{"class":4262},[3946,43260,4447],{"class":3952},[3946,43262,43263],{"class":4262},"exp:",[3946,43265,7015],{"class":4262},[3946,43267,4298],{"class":3952},[3946,43269,7020],{"class":4224},[3946,43271,7023],{"class":3952},[3946,43273,38921],{"class":4020},[3946,43275,13912],{"class":3952},[3946,43277,43278,43280,43283,43285,43287,43289,43291,43293,43295,43297,43300,43303,43306,43308,43311],{"class":3948,"line":4507},[3946,43279,5062],{"class":4251},[3946,43281,43282],{"class":4262}," Buffer",[3946,43284,4298],{"class":3952},[3946,43286,6826],{"class":4224},[3946,43288,4331],{"class":3952},[3946,43290,5685],{"class":4286},[3946,43292,4298],{"class":3952},[3946,43294,5690],{"class":4224},[3946,43296,4331],{"class":3952},[3946,43298,43299],{"class":4262},"payload",[3946,43301,43302],{"class":3952},")).",[3946,43304,43305],{"class":4224},"toString",[3946,43307,4331],{"class":3952},[3946,43309,43310],{"class":3966},"'base64'",[3946,43312,4337],{"class":3952},[3946,43314,43315],{"class":3948,"line":4518},[3946,43316,4040],{"class":3952},[3946,43318,43319],{"class":3948,"line":4524},[3946,43320,4278],{"emptyLinePlaceholder":4277},[3946,43322,43323,43325,43327,43329,43331,43334,43336,43338,43340,43342,43344,43346],{"class":3948,"line":4529},[3946,43324,19314],{"class":4262},[3946,43326,4298],{"class":3952},[3946,43328,8960],{"class":4224},[3946,43330,4331],{"class":3952},[3946,43332,43333],{"class":3966},"'\u002Fauth\u002Flogin'",[3946,43335,19686],{"class":3952},[3946,43337,19532],{"class":4262},[3946,43339,4447],{"class":3952},[3946,43341,19541],{"class":4262},[3946,43343,5783],{"class":3952},[3946,43345,6453],{"class":4255},[3946,43347,4427],{"class":3952},[3946,43349,43350,43352,43354,43356,43358,43360,43362,43364,43366,43368],{"class":3948,"line":4534},[3946,43351,5018],{"class":4255},[3946,43353,6817],{"class":3952},[3946,43355,10853],{"class":4286},[3946,43357,4447],{"class":3952},[3946,43359,19836],{"class":4286},[3946,43361,13049],{"class":3952},[3946,43363,19532],{"class":4262},[3946,43365,4298],{"class":3952},[3946,43367,19845],{"class":4262},[3946,43369,4272],{"class":3952},[3946,43371,43372,43374,43377,43379,43381,43383,43385,43387,43390,43392,43395,43397,43400],{"class":3948,"line":4540},[3946,43373,5018],{"class":4255},[3946,43375,43376],{"class":4286}," db",[3946,43378,4290],{"class":3952},[3946,43380,5685],{"class":4286},[3946,43382,4298],{"class":3952},[3946,43384,5813],{"class":4224},[3946,43386,4331],{"class":3952},[3946,43388,43389],{"class":4262},"fs",[3946,43391,4298],{"class":3952},[3946,43393,43394],{"class":4224},"readFileSync",[3946,43396,4331],{"class":3952},[3946,43398,43399],{"class":3966},"'db.json'",[3946,43401,29083],{"class":3952},[3946,43403,43404,43406,43408,43410,43413,43415,43417,43419,43421,43423,43425,43427,43429,43431,43433,43435,43437,43439,43441,43443,43445,43447,43449],{"class":3948,"line":4567},[3946,43405,5018],{"class":4255},[3946,43407,11201],{"class":4286},[3946,43409,4290],{"class":3952},[3946,43411,43412],{"class":4262},"db",[3946,43414,4298],{"class":3952},[3946,43416,19862],{"class":4262},[3946,43418,4298],{"class":3952},[3946,43420,19867],{"class":4224},[3946,43422,4331],{"class":3952},[3946,43424,19872],{"class":4262},[3946,43426,23088],{"class":4255},[3946,43428,19879],{"class":4262},[3946,43430,4298],{"class":3952},[3946,43432,10853],{"class":4262},[3946,43434,8816],{"class":3952},[3946,43436,10853],{"class":4262},[3946,43438,15293],{"class":3952},[3946,43440,19872],{"class":4262},[3946,43442,4298],{"class":3952},[3946,43444,19836],{"class":4262},[3946,43446,8816],{"class":3952},[3946,43448,19836],{"class":4262},[3946,43450,4337],{"class":3952},[3946,43452,43453],{"class":3948,"line":4574},[3946,43454,4278],{"emptyLinePlaceholder":4277},[3946,43456,43457,43459,43461,43463],{"class":3948,"line":4600},[3946,43458,5776],{"class":4251},[3946,43460,4312],{"class":3952},[3946,43462,10775],{"class":4262},[3946,43464,4318],{"class":3952},[3946,43466,43467,43469,43471,43473,43475,43477,43479,43481,43483,43485,43487,43489],{"class":3948,"line":4610},[3946,43468,4603],{"class":4251},[3946,43470,19633],{"class":4262},[3946,43472,4298],{"class":3952},[3946,43474,8813],{"class":4224},[3946,43476,4331],{"class":3952},[3946,43478,8819],{"class":4020},[3946,43480,19644],{"class":3952},[3946,43482,3942],{"class":4224},[3946,43484,10506],{"class":3952},[3946,43486,19651],{"class":4262},[3946,43488,19940],{"class":3966},[3946,43490,10726],{"class":3952},[3946,43492,43493],{"class":3948,"line":4623},[3946,43494,4521],{"class":3952},[3946,43496,43497],{"class":3948,"line":4643},[3946,43498,4278],{"emptyLinePlaceholder":4277},[3946,43500,43501,43503,43505,43507],{"class":3948,"line":4653},[3946,43502,20095],{"class":4262},[3946,43504,4298],{"class":3952},[3946,43506,3942],{"class":4224},[3946,43508,8512],{"class":3952},[3946,43510,43511,43513,43515,43518,43520,43522,43524,43526,43528,43530,43532,43534,43536,43538,43540,43542,43544,43546,43549,43551,43553,43555],{"class":3948,"line":4658},[3946,43512,10556],{"class":4262},[3946,43514,6817],{"class":3952},[3946,43516,43517],{"class":4262},"id:",[3946,43519,11201],{"class":4262},[3946,43521,4298],{"class":3952},[3946,43523,19984],{"class":4262},[3946,43525,4447],{"class":3952},[3946,43527,19989],{"class":4262},[3946,43529,11201],{"class":4262},[3946,43531,4298],{"class":3952},[3946,43533,10853],{"class":4262},[3946,43535,4447],{"class":3952},[3946,43537,37424],{"class":4262},[3946,43539,11201],{"class":4262},[3946,43541,4298],{"class":3952},[3946,43543,6679],{"class":4262},[3946,43545,4447],{"class":3952},[3946,43547,43548],{"class":4262},"role:",[3946,43550,11201],{"class":4262},[3946,43552,4298],{"class":3952},[3946,43554,15300],{"class":4262},[3946,43556,19998],{"class":3952},[3946,43558,43559,43562,43564,43566,43568],{"class":3948,"line":4663},[3946,43560,43561],{"class":4262},"    accessToken:",[3946,43563,43225],{"class":4224},[3946,43565,4331],{"class":3952},[3946,43567,10775],{"class":4262},[3946,43569,16266],{"class":3952},[3946,43571,43572,43575,43577,43579,43581],{"class":3948,"line":4668},[3946,43573,43574],{"class":4262},"    refreshToken:",[3946,43576,43225],{"class":4224},[3946,43578,4331],{"class":3952},[3946,43580,10775],{"class":4262},[3946,43582,16266],{"class":3952},[3946,43584,43585,43587,43589],{"class":3948,"line":4674},[3946,43586,20180],{"class":4262},[3946,43588,20183],{"class":4020},[3946,43590,3970],{"class":3952},[3946,43592,43593],{"class":3948,"line":4694},[3946,43594,4977],{"class":3952},[3946,43596,43597],{"class":3948,"line":4701},[3946,43598,13276],{"class":3952},[3946,43600,43601],{"class":3948,"line":4719},[3946,43602,4278],{"emptyLinePlaceholder":4277},[3946,43604,43605],{"class":3948,"line":4735},[3946,43606,43607],{"class":4342},"\u002F\u002F ... (решта endpoints)\n",[3946,43609,43610],{"class":3948,"line":4748},[3946,43611,4278],{"emptyLinePlaceholder":4277},[3946,43613,43614,43616,43618,43620,43622,43624,43626,43628,43631,43633,43635,43637,43640],{"class":3948,"line":4768},[3946,43615,19314],{"class":4262},[3946,43617,4298],{"class":3952},[3946,43619,21192],{"class":4224},[3946,43621,4331],{"class":3952},[3946,43623,19284],{"class":4020},[3946,43625,21200],{"class":3952},[3946,43627,6453],{"class":4255},[3946,43629,43630],{"class":4262}," console",[3946,43632,4298],{"class":3952},[3946,43634,4461],{"class":4224},[3946,43636,4331],{"class":3952},[3946,43638,43639],{"class":3966},"'✅ Server на http:\u002F\u002Flocalhost:3000'",[3946,43641,29083],{"class":3952},[3743,43643,40450,43644,13298,43646],{},[3771,43645,41419],{},[3782,43647,43648],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fauth-server.js",[3743,43650,43651],{},[3771,43652,43653],{},"Оновлення package.json:",[3857,43655,43657],{"className":3940,"code":43656,"language":3942,"meta":3865,"style":3865},"{\n  \"scripts\": {\n    \"api\": \"node auth-server.js\"\n  }\n}\n",[3782,43658,43659,43663,43670,43680,43684],{"__ignoreMap":3865},[3946,43660,43661],{"class":3948,"line":3949},[3946,43662,3953],{"class":3952},[3946,43664,43665,43668],{"class":3948,"line":3956},[3946,43666,43667],{"class":3959},"  \"scripts\"",[3946,43669,41062],{"class":3952},[3946,43671,43672,43675,43677],{"class":3948,"line":3973},[3946,43673,43674],{"class":3959},"    \"api\"",[3946,43676,3963],{"class":3952},[3946,43678,43679],{"class":3966},"\"node auth-server.js\"\n",[3946,43681,43682],{"class":3948,"line":3986},[3946,43683,4521],{"class":3952},[3946,43685,43686],{"class":3948,"line":3999},[3946,43687,4040],{"class":3952},[3743,43689,43690],{},[3771,43691,43692],{},"Запуск сервера:",[3857,43694,43696],{"className":4215,"code":43695,"language":4217,"meta":3865,"style":3865},"# Terminal 1: Backend\ncd \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\nnpm run api\n\n# Terminal 2: Expo\nnpm start\n",[3782,43697,43698,43703,43709,43719,43723,43728],{"__ignoreMap":3865},[3946,43699,43700],{"class":3948,"line":3949},[3946,43701,43702],{"class":4342},"# Terminal 1: Backend\n",[3946,43704,43705,43707],{"class":3948,"line":3956},[3946,43706,40959],{"class":4224},[3946,43708,40962],{"class":3966},[3946,43710,43711,43713,43716],{"class":3948,"line":3973},[3946,43712,18852],{"class":4224},[3946,43714,43715],{"class":3966}," run",[3946,43717,43718],{"class":3966}," api\n",[3946,43720,43721],{"class":3948,"line":3986},[3946,43722,4278],{"emptyLinePlaceholder":4277},[3946,43724,43725],{"class":3948,"line":3999},[3946,43726,43727],{"class":4342},"# Terminal 2: Expo\n",[3946,43729,43730,43732],{"class":3948,"line":4012},[3946,43731,18852],{"class":4224},[3946,43733,43734],{"class":3966}," start\n",[3743,43736,43737],{},[3771,43738,43739],{},"Тестові credentials:",[3857,43741,43744],{"className":43742,"code":43743,"language":3862},[3860],"Email: demo@nomad.com\nPassword: password123\n",[3782,43745,43743],{"__ignoreMap":3865},[3750,43747,43749],{"id":43748},"_116-integration-з-expo-router","11.6. Integration з Expo Router",[3847,43751,43753],{"id":43752},"крок-8-налаштування-навігації","Крок 8: Налаштування навігації",[3743,43755,43756],{},[3771,43757,43758],{},"Оновлення app\u002F_layout.tsx:",[3857,43760,43762],{"className":4242,"code":43761,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F_layout.tsx\nimport { AuthProvider, useAuth } from '@\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext';\n\nfunction useProtectedRoute() {\n  const { isAuthenticated, isLoading } = useAuth();\n  const segments = useSegments();\n  const router = useRouter();\n\n  useEffect(() => {\n    if (isLoading) return;\n\n    const inAuthGroup = segments[0] === '(auth)';\n\n    if (!isAuthenticated && !inAuthGroup) {\n      router.replace('\u002F(auth)\u002Flogin');\n    } else if (isAuthenticated && inAuthGroup) {\n      router.replace('\u002F(tabs)');\n    }\n  }, [isAuthenticated, isLoading, segments]);\n}\n\nfunction RootNavigator() {\n  useProtectedRoute(); \u002F\u002F ⬅️ Navigation guard\n  \n  return (\n    \u003CStack>\n      \u003CStack.Screen name=\"(auth)\" options={{ headerShown: false }} \u002F>\n      \u003CStack.Screen name=\"(tabs)\" options={{ headerShown: false }} \u002F>\n    \u003C\u002FStack>\n  );\n}\n\nexport default function RootLayout() {\n  return (\n    \u003CAuthProvider>\n      \u003CRootNavigator \u002F>\n    \u003C\u002FAuthProvider>\n  );\n}\n",[3782,43763,43764,43769,43790,43794,43802,43820,43834,43848,43852,43862,43876,43880,43904,43908,43923,43940,43958,43973,43977,43993,43997,44001,44009,44019,44023,44029,44037,44068,44097,44105,44109,44113,44117,44130,44136,44144,44152,44160,44164],{"__ignoreMap":3865},[3946,43765,43766],{"class":3948,"line":3949},[3946,43767,43768],{"class":4342},"\u002F\u002F app\u002F_layout.tsx\n",[3946,43770,43771,43773,43775,43777,43779,43781,43783,43785,43788],{"class":3948,"line":3956},[3946,43772,4252],{"class":4251},[3946,43774,6817],{"class":3952},[3946,43776,17317],{"class":4262},[3946,43778,4447],{"class":3952},[3946,43780,12954],{"class":4262},[3946,43782,6823],{"class":3952},[3946,43784,6826],{"class":4251},[3946,43786,43787],{"class":3966}," '@\u002Ffeatures\u002Fauth\u002Fcontext\u002FAuthContext'",[3946,43789,4272],{"class":3952},[3946,43791,43792],{"class":3948,"line":3973},[3946,43793,4278],{"emptyLinePlaceholder":4277},[3946,43795,43796,43798,43800],{"class":3948,"line":3986},[3946,43797,14029],{"class":4255},[3946,43799,16019],{"class":4224},[3946,43801,8490],{"class":3952},[3946,43803,43804,43806,43808,43810,43812,43814,43816,43818],{"class":3948,"line":3999},[3946,43805,5018],{"class":4255},[3946,43807,6817],{"class":3952},[3946,43809,13041],{"class":4286},[3946,43811,4447],{"class":3952},[3946,43813,13046],{"class":4286},[3946,43815,13049],{"class":3952},[3946,43817,12954],{"class":4224},[3946,43819,4304],{"class":3952},[3946,43821,43822,43824,43827,43829,43832],{"class":3948,"line":4012},[3946,43823,5018],{"class":4255},[3946,43825,43826],{"class":4286}," segments",[3946,43828,4290],{"class":3952},[3946,43830,43831],{"class":4224},"useSegments",[3946,43833,4304],{"class":3952},[3946,43835,43836,43838,43841,43843,43846],{"class":3948,"line":4026},[3946,43837,5018],{"class":4255},[3946,43839,43840],{"class":4286}," router",[3946,43842,4290],{"class":3952},[3946,43844,43845],{"class":4224},"useRouter",[3946,43847,4304],{"class":3952},[3946,43849,43850],{"class":3948,"line":4037},[3946,43851,4278],{"emptyLinePlaceholder":4277},[3946,43853,43854,43856,43858,43860],{"class":3948,"line":4487},[3946,43855,10265],{"class":4224},[3946,43857,10707],{"class":3952},[3946,43859,6453],{"class":4255},[3946,43861,4427],{"class":3952},[3946,43863,43864,43866,43868,43870,43872,43874],{"class":3948,"line":4507},[3946,43865,5503],{"class":4251},[3946,43867,4479],{"class":3952},[3946,43869,13046],{"class":4262},[3946,43871,5783],{"class":3952},[3946,43873,5786],{"class":4251},[3946,43875,4272],{"class":3952},[3946,43877,43878],{"class":3948,"line":4518},[3946,43879,4278],{"emptyLinePlaceholder":4277},[3946,43881,43882,43884,43887,43889,43892,43894,43896,43899,43902],{"class":3948,"line":4524},[3946,43883,4577],{"class":4255},[3946,43885,43886],{"class":4286}," inAuthGroup",[3946,43888,4290],{"class":3952},[3946,43890,43891],{"class":4262},"segments",[3946,43893,19575],{"class":3952},[3946,43895,8175],{"class":4020},[3946,43897,43898],{"class":3952},"] === ",[3946,43900,43901],{"class":3966},"'(auth)'",[3946,43903,4272],{"class":3952},[3946,43905,43906],{"class":3948,"line":4529},[3946,43907,4278],{"emptyLinePlaceholder":4277},[3946,43909,43910,43912,43914,43916,43918,43921],{"class":3948,"line":4534},[3946,43911,5503],{"class":4251},[3946,43913,4312],{"class":3952},[3946,43915,13041],{"class":4262},[3946,43917,17470],{"class":3952},[3946,43919,43920],{"class":4262},"inAuthGroup",[3946,43922,4318],{"class":3952},[3946,43924,43925,43928,43930,43933,43935,43938],{"class":3948,"line":4540},[3946,43926,43927],{"class":4262},"      router",[3946,43929,4298],{"class":3952},[3946,43931,43932],{"class":4224},"replace",[3946,43934,4331],{"class":3952},[3946,43936,43937],{"class":3966},"'\u002F(auth)\u002Flogin'",[3946,43939,4337],{"class":3952},[3946,43941,43942,43944,43946,43948,43950,43952,43954,43956],{"class":3948,"line":4567},[3946,43943,7115],{"class":3952},[3946,43945,23192],{"class":4251},[3946,43947,23195],{"class":4251},[3946,43949,4479],{"class":3952},[3946,43951,13041],{"class":4262},[3946,43953,15293],{"class":3952},[3946,43955,43920],{"class":4262},[3946,43957,4318],{"class":3952},[3946,43959,43960,43962,43964,43966,43968,43971],{"class":3948,"line":4574},[3946,43961,43927],{"class":4262},[3946,43963,4298],{"class":3952},[3946,43965,43932],{"class":4224},[3946,43967,4331],{"class":3952},[3946,43969,43970],{"class":3966},"'\u002F(tabs)'",[3946,43972,4337],{"class":3952},[3946,43974,43975],{"class":3948,"line":4600},[3946,43976,5550],{"class":3952},[3946,43978,43979,43981,43983,43985,43987,43989,43991],{"class":3948,"line":4610},[3946,43980,10731],{"class":3952},[3946,43982,13041],{"class":4262},[3946,43984,4447],{"class":3952},[3946,43986,13046],{"class":4262},[3946,43988,4447],{"class":3952},[3946,43990,43891],{"class":4262},[3946,43992,10737],{"class":3952},[3946,43994,43995],{"class":3948,"line":4623},[3946,43996,4040],{"class":3952},[3946,43998,43999],{"class":3948,"line":4643},[3946,44000,4278],{"emptyLinePlaceholder":4277},[3946,44002,44003,44005,44007],{"class":3948,"line":4653},[3946,44004,14029],{"class":4255},[3946,44006,13030],{"class":4224},[3946,44008,8490],{"class":3952},[3946,44010,44011,44014,44016],{"class":3948,"line":4658},[3946,44012,44013],{"class":4224},"  useProtectedRoute",[3946,44015,17297],{"class":3952},[3946,44017,44018],{"class":4342},"\u002F\u002F ⬅️ Navigation guard\n",[3946,44020,44021],{"class":3948,"line":4663},[3946,44022,5795],{"class":3952},[3946,44024,44025,44027],{"class":3948,"line":4668},[3946,44026,5062],{"class":4251},[3946,44028,13079],{"class":3952},[3946,44030,44031,44033,44035],{"class":3948,"line":4674},[3946,44032,13158],{"class":3952},[3946,44034,13541],{"class":4403},[3946,44036,13135],{"class":3952},[3946,44038,44039,44041,44043,44045,44047,44049,44051,44054,44057,44059,44061,44063,44065],{"class":3948,"line":4694},[3946,44040,13084],{"class":3952},[3946,44042,13541],{"class":4262},[3946,44044,4298],{"class":3952},[3946,44046,13613],{"class":4262},[3946,44048,13616],{"class":4262},[3946,44050,13111],{"class":3952},[3946,44052,44053],{"class":3966},"\"(auth)\"",[3946,44055,44056],{"class":4262}," options",[3946,44058,14394],{"class":3952},[3946,44060,14611],{"class":13569},[3946,44062,3963],{"class":3952},[3946,44064,13575],{"class":4255},[3946,44066,44067],{"class":3952}," }} \u002F>\n",[3946,44069,44070,44072,44074,44076,44078,44080,44082,44085,44087,44089,44091,44093,44095],{"class":3948,"line":4701},[3946,44071,13084],{"class":3952},[3946,44073,13541],{"class":4262},[3946,44075,4298],{"class":3952},[3946,44077,13613],{"class":4262},[3946,44079,13616],{"class":4262},[3946,44081,13111],{"class":3952},[3946,44083,44084],{"class":3966},"\"(tabs)\"",[3946,44086,44056],{"class":4262},[3946,44088,14394],{"class":3952},[3946,44090,14611],{"class":13569},[3946,44092,3963],{"class":3952},[3946,44094,13575],{"class":4255},[3946,44096,44067],{"class":3952},[3946,44098,44099,44101,44103],{"class":3948,"line":4719},[3946,44100,13187],{"class":3952},[3946,44102,13541],{"class":4262},[3946,44104,13135],{"class":3952},[3946,44106,44107],{"class":3948,"line":4735},[3946,44108,10875],{"class":3952},[3946,44110,44111],{"class":3948,"line":4748},[3946,44112,4040],{"class":3952},[3946,44114,44115],{"class":3948,"line":4768},[3946,44116,4278],{"emptyLinePlaceholder":4277},[3946,44118,44119,44121,44123,44125,44128],{"class":3948,"line":4777},[3946,44120,6030],{"class":4251},[3946,44122,39938],{"class":4251},[3946,44124,4390],{"class":4255},[3946,44126,44127],{"class":4224}," RootLayout",[3946,44129,8490],{"class":3952},[3946,44131,44132,44134],{"class":3948,"line":4782},[3946,44133,5062],{"class":4251},[3946,44135,13079],{"class":3952},[3946,44137,44138,44140,44142],{"class":3948,"line":6262},[3946,44139,13158],{"class":3952},[3946,44141,17317],{"class":4403},[3946,44143,13135],{"class":3952},[3946,44145,44146,44148,44150],{"class":3948,"line":6273},[3946,44147,13084],{"class":3952},[3946,44149,17326],{"class":4262},[3946,44151,13125],{"class":3952},[3946,44153,44154,44156,44158],{"class":3948,"line":6284},[3946,44155,13187],{"class":3952},[3946,44157,17317],{"class":4262},[3946,44159,13135],{"class":3952},[3946,44161,44162],{"class":3948,"line":6299},[3946,44163,10875],{"class":3952},[3946,44165,44166],{"class":3948,"line":6304},[3946,44167,4040],{"class":3952},[3743,44169,40450,44170,13298,44173],{},[3771,44171,44172],{},"Оновлено:",[3782,44174,44175],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F_layout.tsx",[3743,44177,44178],{},[3771,44179,44180],{},"Створення (auth) group:",[3857,44182,44185],{"className":44183,"code":44184,"language":3862},[3860],"app\u002F\n├── (auth)\u002F\n│   ├── _layout.tsx      # Auth stack\n│   ├── login.tsx        # Login screen\n│   └── register.tsx     # Register screen\n",[3782,44186,44184],{"__ignoreMap":3865},[3857,44188,44190],{"className":4242,"code":44189,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(auth)\u002F_layout.tsx\nexport default function AuthLayout() {\n  return (\n    \u003CStack screenOptions={{ headerShown: false }}>\n      \u003CStack.Screen name=\"login\" \u002F>\n      \u003CStack.Screen name=\"register\" \u002F>\n    \u003C\u002FStack>\n  );\n}\n",[3782,44191,44192,44197,44210,44216,44236,44255,44274,44282,44286],{"__ignoreMap":3865},[3946,44193,44194],{"class":3948,"line":3949},[3946,44195,44196],{"class":4342},"\u002F\u002F app\u002F(auth)\u002F_layout.tsx\n",[3946,44198,44199,44201,44203,44205,44208],{"class":3948,"line":3956},[3946,44200,6030],{"class":4251},[3946,44202,39938],{"class":4251},[3946,44204,4390],{"class":4255},[3946,44206,44207],{"class":4224}," AuthLayout",[3946,44209,8490],{"class":3952},[3946,44211,44212,44214],{"class":3948,"line":3973},[3946,44213,5062],{"class":4251},[3946,44215,13079],{"class":3952},[3946,44217,44218,44220,44222,44225,44227,44229,44231,44233],{"class":3948,"line":3986},[3946,44219,13158],{"class":3952},[3946,44221,13541],{"class":4262},[3946,44223,44224],{"class":4262}," screenOptions",[3946,44226,14394],{"class":3952},[3946,44228,14611],{"class":13569},[3946,44230,3963],{"class":3952},[3946,44232,13575],{"class":4255},[3946,44234,44235],{"class":3952}," }}>\n",[3946,44237,44238,44240,44242,44244,44246,44248,44250,44253],{"class":3948,"line":3999},[3946,44239,13084],{"class":3952},[3946,44241,13541],{"class":4262},[3946,44243,4298],{"class":3952},[3946,44245,13613],{"class":4262},[3946,44247,13616],{"class":4262},[3946,44249,13111],{"class":3952},[3946,44251,44252],{"class":3966},"\"login\"",[3946,44254,13125],{"class":3952},[3946,44256,44257,44259,44261,44263,44265,44267,44269,44272],{"class":3948,"line":4012},[3946,44258,13084],{"class":3952},[3946,44260,13541],{"class":4262},[3946,44262,4298],{"class":3952},[3946,44264,13613],{"class":4262},[3946,44266,13616],{"class":4262},[3946,44268,13111],{"class":3952},[3946,44270,44271],{"class":3966},"\"register\"",[3946,44273,13125],{"class":3952},[3946,44275,44276,44278,44280],{"class":3948,"line":4026},[3946,44277,13187],{"class":3952},[3946,44279,13541],{"class":4262},[3946,44281,13135],{"class":3952},[3946,44283,44284],{"class":3948,"line":4037},[3946,44285,10875],{"class":3952},[3946,44287,44288],{"class":3948,"line":4487},[3946,44289,4040],{"class":3952},[3743,44291,40450,44292],{},[3771,44293,41419],{},[3878,44295,44296,44301,44306],{},[3768,44297,44298],{},[3782,44299,44300],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F(auth)\u002F_layout.tsx",[3768,44302,44303],{},[3782,44304,44305],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F(auth)\u002Flogin.tsx",[3768,44307,44308],{},[3782,44309,44310],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F(auth)\u002Fregister.tsx",[3743,44312,44313],{},[3771,44314,44315],{},"Route files:",[3857,44317,44319],{"className":4242,"code":44318,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(auth)\u002Flogin.tsx\nimport { LoginScreen } from '@\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen';\nexport default LoginScreen;\n\n\u002F\u002F app\u002F(auth)\u002Fregister.tsx\nimport { RegisterScreen } from '@\u002Ffeatures\u002Fauth\u002Fscreens\u002FRegisterScreen';\nexport default RegisterScreen;\n",[3782,44320,44321,44326,44343,44353,44357,44362,44379],{"__ignoreMap":3865},[3946,44322,44323],{"class":3948,"line":3949},[3946,44324,44325],{"class":4342},"\u002F\u002F app\u002F(auth)\u002Flogin.tsx\n",[3946,44327,44328,44330,44332,44334,44336,44338,44341],{"class":3948,"line":3956},[3946,44329,4252],{"class":4251},[3946,44331,6817],{"class":3952},[3946,44333,13366],{"class":4262},[3946,44335,6823],{"class":3952},[3946,44337,6826],{"class":4251},[3946,44339,44340],{"class":3966}," '@\u002Ffeatures\u002Fauth\u002Fscreens\u002FLoginScreen'",[3946,44342,4272],{"class":3952},[3946,44344,44345,44347,44349,44351],{"class":3948,"line":3973},[3946,44346,6030],{"class":4251},[3946,44348,39938],{"class":4251},[3946,44350,22928],{"class":4262},[3946,44352,4272],{"class":3952},[3946,44354,44355],{"class":3948,"line":3986},[3946,44356,4278],{"emptyLinePlaceholder":4277},[3946,44358,44359],{"class":3948,"line":3999},[3946,44360,44361],{"class":4342},"\u002F\u002F app\u002F(auth)\u002Fregister.tsx\n",[3946,44363,44364,44366,44368,44370,44372,44374,44377],{"class":3948,"line":4012},[3946,44365,4252],{"class":4251},[3946,44367,6817],{"class":3952},[3946,44369,13384],{"class":4262},[3946,44371,6823],{"class":3952},[3946,44373,6826],{"class":4251},[3946,44375,44376],{"class":3966}," '@\u002Ffeatures\u002Fauth\u002Fscreens\u002FRegisterScreen'",[3946,44378,4272],{"class":3952},[3946,44380,44381,44383,44385,44387],{"class":3948,"line":4026},[3946,44382,6030],{"class":4251},[3946,44384,39938],{"class":4251},[3946,44386,24998],{"class":4262},[3946,44388,4272],{"class":3952},[3847,44390,44392],{"id":44391},"крок-9-додавання-profile-screen","Крок 9: Додавання Profile Screen",[3743,44394,44395],{},[3771,44396,44397],{},"Створення profile tab:",[3857,44399,44401],{"className":4242,"code":44400,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(tabs)\u002Fprofile.tsx\nexport default function ProfileScreen() {\n  const { user, logout } = useAuth();\n\n  const handleLogout = () => {\n    Alert.alert('Вийти?', '', [\n      { text: 'Скасувати', style: 'cancel' },\n      { text: 'Вийти', onPress: () => logout() },\n    ]);\n  };\n\n  return (\n    \u003CScrollView>\n      \u003CView style={styles.header}>\n        \u003CView style={styles.avatar}>\n          \u003CText>{user?.name.charAt(0).toUpperCase()}\u003C\u002FText>\n        \u003C\u002FView>\n        \u003CText>{user?.name}\u003C\u002FText>\n        \u003CText>{user?.email}\u003C\u002FText>\n      \u003C\u002FView>\n\n      \u003CTouchableOpacity onPress={handleLogout}>\n        \u003CIonicons name=\"log-out-outline\" \u002F>\n        \u003CText>Вийти з акаунту\u003C\u002FText>\n      \u003C\u002FTouchableOpacity>\n    \u003C\u002FScrollView>\n  );\n}\n",[3782,44402,44403,44408,44420,44438,44442,44454,44473,44490,44513,44518,44522,44526,44532,44540,44554,44569,44590,44598,44615,44631,44639,44643,44658,44672,44692,44700,44708,44712],{"__ignoreMap":3865},[3946,44404,44405],{"class":3948,"line":3949},[3946,44406,44407],{"class":4342},"\u002F\u002F app\u002F(tabs)\u002Fprofile.tsx\n",[3946,44409,44410,44412,44414,44416,44418],{"class":3948,"line":3956},[3946,44411,6030],{"class":4251},[3946,44413,39938],{"class":4251},[3946,44415,4390],{"class":4255},[3946,44417,34549],{"class":4224},[3946,44419,8490],{"class":3952},[3946,44421,44422,44424,44426,44428,44430,44432,44434,44436],{"class":3948,"line":3973},[3946,44423,5018],{"class":4255},[3946,44425,6817],{"class":3952},[3946,44427,10775],{"class":4286},[3946,44429,4447],{"class":3952},[3946,44431,11981],{"class":4286},[3946,44433,13049],{"class":3952},[3946,44435,12954],{"class":4224},[3946,44437,4304],{"class":3952},[3946,44439,44440],{"class":3948,"line":3986},[3946,44441,4278],{"emptyLinePlaceholder":4277},[3946,44443,44444,44446,44448,44450,44452],{"class":3948,"line":3999},[3946,44445,5018],{"class":4255},[3946,44447,34597],{"class":4224},[3946,44449,18252],{"class":3952},[3946,44451,6453],{"class":4255},[3946,44453,4427],{"class":3952},[3946,44455,44456,44458,44460,44462,44464,44467,44469,44471],{"class":3948,"line":4012},[3946,44457,28909],{"class":4262},[3946,44459,4298],{"class":3952},[3946,44461,23542],{"class":4224},[3946,44463,4331],{"class":3952},[3946,44465,44466],{"class":3966},"'Вийти?'",[3946,44468,4447],{"class":3952},[3946,44470,22990],{"class":3966},[3946,44472,31550],{"class":3952},[3946,44474,44475,44478,44480,44482,44484,44486,44488],{"class":3948,"line":4026},[3946,44476,44477],{"class":3952},"      { ",[3946,44479,23571],{"class":4262},[3946,44481,28956],{"class":3966},[3946,44483,4447],{"class":3952},[3946,44485,28961],{"class":4262},[3946,44487,28964],{"class":3966},[3946,44489,19998],{"class":3952},[3946,44491,44492,44494,44496,44498,44500,44502,44504,44506,44508,44510],{"class":3948,"line":4037},[3946,44493,44477],{"class":3952},[3946,44495,23571],{"class":4262},[3946,44497,34658],{"class":3966},[3946,44499,4447],{"class":3952},[3946,44501,15204],{"class":4224},[3946,44503,8545],{"class":4262},[3946,44505,11004],{"class":3952},[3946,44507,6453],{"class":4255},[3946,44509,9202],{"class":4224},[3946,44511,44512],{"class":3952},"() },\n",[3946,44514,44515],{"class":3948,"line":4487},[3946,44516,44517],{"class":3952},"    ]);\n",[3946,44519,44520],{"class":3948,"line":4507},[3946,44521,15539],{"class":3952},[3946,44523,44524],{"class":3948,"line":4518},[3946,44525,4278],{"emptyLinePlaceholder":4277},[3946,44527,44528,44530],{"class":3948,"line":4524},[3946,44529,5062],{"class":4251},[3946,44531,13079],{"class":3952},[3946,44533,44534,44536,44538],{"class":3948,"line":4529},[3946,44535,13158],{"class":3952},[3946,44537,24325],{"class":4403},[3946,44539,13135],{"class":3952},[3946,44541,44542,44544,44546,44548,44550,44552],{"class":3948,"line":4534},[3946,44543,13084],{"class":3952},[3946,44545,12926],{"class":4262},[3946,44547,13089],{"class":4262},[3946,44549,13092],{"class":3952},[3946,44551,23762],{"class":4262},[3946,44553,13098],{"class":3952},[3946,44555,44556,44558,44560,44562,44564,44567],{"class":3948,"line":4540},[3946,44557,13103],{"class":3952},[3946,44559,12926],{"class":4262},[3946,44561,13089],{"class":4262},[3946,44563,13092],{"class":3952},[3946,44565,44566],{"class":4262},"avatar",[3946,44568,13098],{"class":3952},[3946,44570,44571,44573,44575,44578,44580,44583,44586,44588],{"class":3948,"line":4567},[3946,44572,15112],{"class":3952},[3946,44574,14762],{"class":4403},[3946,44576,44577],{"class":3952},">{user?.name.charAt(",[3946,44579,8175],{"class":4020},[3946,44581,44582],{"class":4262},").toUpperCase",[3946,44584,44585],{"class":3952},"()}\u003C\u002F",[3946,44587,14762],{"class":4262},[3946,44589,13135],{"class":3952},[3946,44591,44592,44594,44596],{"class":3948,"line":4574},[3946,44593,15256],{"class":3952},[3946,44595,12926],{"class":4262},[3946,44597,13135],{"class":3952},[3946,44599,44600,44602,44604,44607,44609,44611,44613],{"class":3948,"line":4600},[3946,44601,13103],{"class":3952},[3946,44603,14762],{"class":4403},[3946,44605,44606],{"class":3952},">{user?.",[3946,44608,6679],{"class":4262},[3946,44610,12613],{"class":3952},[3946,44612,14762],{"class":4262},[3946,44614,13135],{"class":3952},[3946,44616,44617,44619,44621,44623,44625,44627,44629],{"class":3948,"line":4610},[3946,44618,13103],{"class":3952},[3946,44620,14762],{"class":4403},[3946,44622,44606],{"class":3952},[3946,44624,10853],{"class":4262},[3946,44626,12613],{"class":3952},[3946,44628,14762],{"class":4262},[3946,44630,13135],{"class":3952},[3946,44632,44633,44635,44637],{"class":3948,"line":4623},[3946,44634,13130],{"class":3952},[3946,44636,12926],{"class":4262},[3946,44638,13135],{"class":3952},[3946,44640,44641],{"class":3948,"line":4643},[3946,44642,4278],{"emptyLinePlaceholder":4277},[3946,44644,44645,44647,44649,44652,44654,44656],{"class":3948,"line":4653},[3946,44646,13084],{"class":3952},[3946,44648,14771],{"class":4262},[3946,44650,44651],{"class":4262}," onPress",[3946,44653,12602],{"class":3952},[3946,44655,35844],{"class":4262},[3946,44657,13098],{"class":3952},[3946,44659,44660,44662,44664,44666,44668,44670],{"class":3948,"line":4658},[3946,44661,13103],{"class":3952},[3946,44663,13775],{"class":4262},[3946,44665,13616],{"class":4262},[3946,44667,13111],{"class":3952},[3946,44669,35874],{"class":3966},[3946,44671,13125],{"class":3952},[3946,44673,44674,44676,44678,44680,44682,44684,44686,44688,44690],{"class":3948,"line":4663},[3946,44675,13103],{"class":3952},[3946,44677,14762],{"class":4403},[3946,44679,16361],{"class":3952},[3946,44681,35908],{"class":4262},[3946,44683,35911],{"class":4262},[3946,44685,35093],{"class":4262},[3946,44687,15133],{"class":3952},[3946,44689,14762],{"class":4262},[3946,44691,13135],{"class":3952},[3946,44693,44694,44696,44698],{"class":3948,"line":4668},[3946,44695,13130],{"class":3952},[3946,44697,14771],{"class":4262},[3946,44699,13135],{"class":3952},[3946,44701,44702,44704,44706],{"class":3948,"line":4674},[3946,44703,13187],{"class":3952},[3946,44705,24325],{"class":4262},[3946,44707,13135],{"class":3952},[3946,44709,44710],{"class":3948,"line":4694},[3946,44711,10875],{"class":3952},[3946,44713,44714],{"class":3948,"line":4701},[3946,44715,4040],{"class":3952},[3743,44717,40450,44718,13298,44720],{},[3771,44719,41419],{},[3782,44721,44722],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F(tabs)\u002Fprofile.tsx",[3743,44724,44725],{},[3771,44726,44727],{},"Оновлення tabs layout:",[3857,44729,44731],{"className":4242,"code":44730,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(tabs)\u002F_layout.tsx\n\u003CTabs>\n  \u003CTabs.Screen name=\"trips\" options={{ title: 'Поїздки' }} \u002F>\n  \u003CTabs.Screen name=\"places\" options={{ title: 'Місця' }} \u002F>\n  \u003CTabs.Screen name=\"about\" options={{ title: 'Ще' }} \u002F>\n  \u003CTabs.Screen \n    name=\"profile\" \n    options={{ \n      title: 'Профіль',\n      tabBarIcon: ({ color, size }) => (\n        \u003CIonicons name=\"person-outline\" size={size} color={color} \u002F>\n      )\n    }} \n  \u002F>\n\u003C\u002FTabs>\n",[3782,44732,44733,44738,44747,44778,44808,44838,44851,44862,44870,44881,44900,44928,44933,44938,44943],{"__ignoreMap":3865},[3946,44734,44735],{"class":3948,"line":3949},[3946,44736,44737],{"class":4342},"\u002F\u002F app\u002F(tabs)\u002F_layout.tsx\n",[3946,44739,44740,44742,44745],{"class":3948,"line":3956},[3946,44741,4413],{"class":3952},[3946,44743,44744],{"class":4403},"Tabs",[3946,44746,13135],{"class":3952},[3946,44748,44749,44752,44754,44756,44758,44760,44762,44765,44767,44769,44771,44773,44776],{"class":3948,"line":3973},[3946,44750,44751],{"class":3952},"  \u003C",[3946,44753,44744],{"class":4262},[3946,44755,4298],{"class":3952},[3946,44757,13613],{"class":4262},[3946,44759,13616],{"class":4262},[3946,44761,13111],{"class":3952},[3946,44763,44764],{"class":3966},"\"trips\"",[3946,44766,44056],{"class":4262},[3946,44768,14394],{"class":3952},[3946,44770,15121],{"class":13569},[3946,44772,3963],{"class":3952},[3946,44774,44775],{"class":3966},"'Поїздки'",[3946,44777,44067],{"class":3952},[3946,44779,44780,44782,44784,44786,44788,44790,44792,44795,44797,44799,44801,44803,44806],{"class":3948,"line":3986},[3946,44781,44751],{"class":3952},[3946,44783,44744],{"class":4262},[3946,44785,4298],{"class":3952},[3946,44787,13613],{"class":4262},[3946,44789,13616],{"class":4262},[3946,44791,13111],{"class":3952},[3946,44793,44794],{"class":3966},"\"places\"",[3946,44796,44056],{"class":4262},[3946,44798,14394],{"class":3952},[3946,44800,15121],{"class":13569},[3946,44802,3963],{"class":3952},[3946,44804,44805],{"class":3966},"'Місця'",[3946,44807,44067],{"class":3952},[3946,44809,44810,44812,44814,44816,44818,44820,44822,44825,44827,44829,44831,44833,44836],{"class":3948,"line":3999},[3946,44811,44751],{"class":3952},[3946,44813,44744],{"class":4262},[3946,44815,4298],{"class":3952},[3946,44817,13613],{"class":4262},[3946,44819,13616],{"class":4262},[3946,44821,13111],{"class":3952},[3946,44823,44824],{"class":3966},"\"about\"",[3946,44826,44056],{"class":4262},[3946,44828,14394],{"class":3952},[3946,44830,15121],{"class":13569},[3946,44832,3963],{"class":3952},[3946,44834,44835],{"class":3966},"'Ще'",[3946,44837,44067],{"class":3952},[3946,44839,44840,44842,44844,44846,44848],{"class":3948,"line":4012},[3946,44841,44751],{"class":3952},[3946,44843,44744],{"class":4262},[3946,44845,4298],{"class":3952},[3946,44847,13613],{"class":4262},[3946,44849,44850],{"class":3952}," \n",[3946,44852,44853,44855,44857,44860],{"class":3948,"line":4026},[3946,44854,20384],{"class":4262},[3946,44856,13111],{"class":3952},[3946,44858,44859],{"class":3966},"\"profile\"",[3946,44861,44850],{"class":3952},[3946,44863,44864,44867],{"class":3948,"line":4037},[3946,44865,44866],{"class":4262},"    options",[3946,44868,44869],{"class":3952},"={{ \n",[3946,44871,44872,44875,44877,44879],{"class":3948,"line":4487},[3946,44873,44874],{"class":13569},"      title",[3946,44876,3963],{"class":3952},[3946,44878,14500],{"class":3966},[3946,44880,3970],{"class":3952},[3946,44882,44883,44886,44888,44890,44892,44894,44896,44898],{"class":3948,"line":4507},[3946,44884,44885],{"class":13569},"      tabBarIcon",[3946,44887,14072],{"class":3952},[3946,44889,14080],{"class":4262},[3946,44891,4447],{"class":3952},[3946,44893,14085],{"class":4262},[3946,44895,14088],{"class":3952},[3946,44897,6453],{"class":4255},[3946,44899,13079],{"class":3952},[3946,44901,44902,44904,44906,44908,44910,44912,44914,44916,44918,44920,44922,44924,44926],{"class":3948,"line":4518},[3946,44903,13103],{"class":3952},[3946,44905,13775],{"class":4262},[3946,44907,13616],{"class":4262},[3946,44909,13111],{"class":3952},[3946,44911,35131],{"class":3966},[3946,44913,13108],{"class":4262},[3946,44915,12602],{"class":3952},[3946,44917,14085],{"class":4262},[3946,44919,5928],{"class":3952},[3946,44921,14080],{"class":4262},[3946,44923,12602],{"class":3952},[3946,44925,14080],{"class":4262},[3946,44927,13631],{"class":3952},[3946,44929,44930],{"class":3948,"line":4524},[3946,44931,44932],{"class":3952},"      )\n",[3946,44934,44935],{"class":3948,"line":4529},[3946,44936,44937],{"class":3952},"    }} \n",[3946,44939,44940],{"class":3948,"line":4534},[3946,44941,44942],{"class":3952},"  \u002F>\n",[3946,44944,44945,44947,44949],{"class":3948,"line":4540},[3946,44946,15133],{"class":3952},[3946,44948,44744],{"class":4262},[3946,44950,13135],{"class":3952},[3743,44952,40450,44953,13298,44955],{},[3771,44954,44172],{},[3782,44956,44957],{},"\u002FUsers\u002Farakviel\u002FWork\u002Fnomad\u002Fapp\u002F(tabs)\u002F_layout.tsx",[3750,44959,44961],{"id":44960},"_117-тестування-flow","11.7. Тестування Flow",[3847,44963,44965],{"id":44964},"крок-10-запуск-та-тестування","Крок 10: Запуск та тестування",[3743,44967,44968],{},[3771,44969,44970],{},"1. Запустити backend:",[3857,44972,44974],{"className":4215,"code":44973,"language":4217,"meta":3865,"style":3865},"cd \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\nnpm run api\n",[3782,44975,44976,44982],{"__ignoreMap":3865},[3946,44977,44978,44980],{"class":3948,"line":3949},[3946,44979,40959],{"class":4224},[3946,44981,40962],{"class":3966},[3946,44983,44984,44986,44988],{"class":3948,"line":3956},[3946,44985,18852],{"class":4224},[3946,44987,43715],{"class":3966},[3946,44989,43718],{"class":3966},[3743,44991,44992],{},"Очікуваний вивід:",[3857,44994,44997],{"className":44995,"code":44996,"language":3862},[3860],"✅ Auth Server running on http:\u002F\u002Flocalhost:3000\n📝 Database: db.json\n\nAvailable endpoints:\n  POST \u002Fauth\u002Flogin\n  POST \u002Fauth\u002Fregister\n  GET  \u002Fauth\u002Fme\n  POST \u002Fauth\u002Flogout\n  GET  \u002Ftrips\n  POST \u002Ftrips\n",[3782,44998,44996],{"__ignoreMap":3865},[3743,45000,45001],{},[3771,45002,45003],{},"2. Запустити Expo:",[3857,45005,45007],{"className":4215,"code":45006,"language":4217,"meta":3865,"style":3865},"npm start\n",[3782,45008,45009],{"__ignoreMap":3865},[3946,45010,45011,45013],{"class":3948,"line":3949},[3946,45012,18852],{"class":4224},[3946,45014,43734],{"class":3966},[3743,45016,45017],{},[3771,45018,45019],{},"3. Відкрити додаток:",[3857,45021,45023],{"className":4215,"code":45022,"language":4217,"meta":3865,"style":3865},"# iOS Simulator\nnpm run ios\n\n# Android Emulator\nnpm run android\n",[3782,45024,45025,45030,45039,45043,45048],{"__ignoreMap":3865},[3946,45026,45027],{"class":3948,"line":3949},[3946,45028,45029],{"class":4342},"# iOS Simulator\n",[3946,45031,45032,45034,45036],{"class":3948,"line":3956},[3946,45033,18852],{"class":4224},[3946,45035,43715],{"class":3966},[3946,45037,45038],{"class":3966}," ios\n",[3946,45040,45041],{"class":3948,"line":3973},[3946,45042,4278],{"emptyLinePlaceholder":4277},[3946,45044,45045],{"class":3948,"line":3986},[3946,45046,45047],{"class":4342},"# Android Emulator\n",[3946,45049,45050,45052,45054],{"class":3948,"line":3999},[3946,45051,18852],{"class":4224},[3946,45053,43715],{"class":3966},[3946,45055,45056],{"class":3966}," android\n",[3743,45058,45059],{},[3771,45060,45061],{},"4. Тестові сценарії:",[3743,45063,45064],{},[3771,45065,45066],{},"Сценарій 1: Перший запуск (немає токенів)",[3857,45068,45071],{"className":45069,"code":45070,"language":3862},[3860],"1. Додаток стартує\n2. AuthProvider перевіряє SecureStore\n3. Токенів немає → isAuthenticated: false\n4. useProtectedRoute редірект → \u002F(auth)\u002Flogin\n5. Показується Login Screen\n",[3782,45072,45070],{"__ignoreMap":3865},[3743,45074,45075],{},[3771,45076,45077],{},"Сценарій 2: Успішний вхід",[3857,45079,45082],{"className":45080,"code":45081,"language":3862},[3860],"1. Введення email: demo@nomad.com\n2. Введення password: password123\n3. Натискання \"Увійти\"\n4. API запит POST \u002Fauth\u002Flogin\n5. Успіх → токени збережено в SecureStore\n6. setAuthenticated(user)\n7. useProtectedRoute редірект → \u002F(tabs)\n8. Показується Trips Screen\n",[3782,45083,45081],{"__ignoreMap":3865},[3743,45085,45086],{},[3771,45087,45088],{},"Сценарій 3: Помилка входу",[3857,45090,45093],{"className":45091,"code":45092,"language":3862},[3860],"1. Введення невірних credentials\n2. API повертає 401\n3. Error message: \"Невірний email або пароль\"\n4. Alert показує помилку\n5. Залишаємось на Login Screen\n",[3782,45094,45092],{"__ignoreMap":3865},[3743,45096,45097],{},[3771,45098,45099],{},"Сценарій 4: Logout",[3857,45101,45104],{"className":45102,"code":45103,"language":3862},[3860],"1. Навігація до Profile tab\n2. Натискання \"Вийти з акаунту\"\n3. Confirmation alert\n4. API запит POST \u002Fauth\u002Flogout\n5. Видалення токенів з SecureStore\n6. setUnauthenticated()\n7. useProtectedRoute редірект → \u002F(auth)\u002Flogin\n",[3782,45105,45103],{"__ignoreMap":3865},[3743,45107,45108],{},[3771,45109,45110],{},"Сценарій 5: Відновлення сесії",[3857,45112,45115],{"className":45113,"code":45114,"language":3862},[3860],"1. Закриття додатку (токени в SecureStore)\n2. Повторний запуск\n3. AuthProvider → restoreSession()\n4. Токени знайдено та валідні\n5. API запит GET \u002Fauth\u002Fme\n6. setAuthenticated(user)\n7. useProtectedRoute → \u002F(tabs)\n8. Користувач одразу на головній\n",[3782,45116,45114],{"__ignoreMap":3865},[3743,45118,45119],{},[3771,45120,45121],{},"Сценарій 6: Закінчення токену",[3857,45123,45126],{"className":45124,"code":45125,"language":3862},[3860],"1. Токен закінчився (expiresAt \u003C Date.now())\n2. isTokenValid() → false\n3. Автоматичне очищення tokenService.clearTokens()\n4. setUnauthenticated()\n5. Редірект → \u002F(auth)\u002Flogin\n",[3782,45127,45125],{"__ignoreMap":3865},[3750,45129,45131],{"id":45130},"_118-debugging-та-dev-tools","11.8. Debugging та Dev Tools",[3847,45133,45135],{"id":45134},"корисні-логи","Корисні логи",[3743,45137,45138],{},"Всі сервіси мають детальне логування:",[3857,45140,45142],{"className":4242,"code":45141,"language":4244,"meta":3865,"style":3865},"\u002F\u002F TokenService\nconsole.log('✅ [TokenService] Токени збережено');\nconsole.log('ℹ️ [TokenService] Токени не знайдено');\nconsole.log('⏰ [TokenService] Токен закінчився');\nconsole.log('🗑️ [TokenService] Токени видалено');\n\n\u002F\u002F AuthAPI\nconsole.log('🔵 [AuthAPI] POST \u002Fauth\u002Flogin');\nconsole.log('✅ [AuthAPI] Response 200');\nconsole.log('⚠️ [AuthAPI] 401 Unauthorized');\n\n\u002F\u002F AuthContext\nconsole.log('🔄 [AuthContext] Відновлення сесії...');\nconsole.log('✅ [AuthContext] Користувач автентифікований');\nconsole.log('🔓 [AuthContext] Користувач деавтентифікований');\n",[3782,45143,45144,45149,45164,45179,45194,45209,45213,45218,45233,45248,45263,45267,45272,45287,45302],{"__ignoreMap":3865},[3946,45145,45146],{"class":3948,"line":3949},[3946,45147,45148],{"class":4342},"\u002F\u002F TokenService\n",[3946,45150,45151,45153,45155,45157,45159,45162],{"class":3948,"line":3956},[3946,45152,36794],{"class":4262},[3946,45154,4298],{"class":3952},[3946,45156,4461],{"class":4224},[3946,45158,4331],{"class":3952},[3946,45160,45161],{"class":3966},"'✅ [TokenService] Токени збережено'",[3946,45163,4337],{"class":3952},[3946,45165,45166,45168,45170,45172,45174,45177],{"class":3948,"line":3973},[3946,45167,36794],{"class":4262},[3946,45169,4298],{"class":3952},[3946,45171,4461],{"class":4224},[3946,45173,4331],{"class":3952},[3946,45175,45176],{"class":3966},"'ℹ️ [TokenService] Токени не знайдено'",[3946,45178,4337],{"class":3952},[3946,45180,45181,45183,45185,45187,45189,45192],{"class":3948,"line":3986},[3946,45182,36794],{"class":4262},[3946,45184,4298],{"class":3952},[3946,45186,4461],{"class":4224},[3946,45188,4331],{"class":3952},[3946,45190,45191],{"class":3966},"'⏰ [TokenService] Токен закінчився'",[3946,45193,4337],{"class":3952},[3946,45195,45196,45198,45200,45202,45204,45207],{"class":3948,"line":3999},[3946,45197,36794],{"class":4262},[3946,45199,4298],{"class":3952},[3946,45201,4461],{"class":4224},[3946,45203,4331],{"class":3952},[3946,45205,45206],{"class":3966},"'🗑️ [TokenService] Токени видалено'",[3946,45208,4337],{"class":3952},[3946,45210,45211],{"class":3948,"line":4012},[3946,45212,4278],{"emptyLinePlaceholder":4277},[3946,45214,45215],{"class":3948,"line":4026},[3946,45216,45217],{"class":4342},"\u002F\u002F AuthAPI\n",[3946,45219,45220,45222,45224,45226,45228,45231],{"class":3948,"line":4037},[3946,45221,36794],{"class":4262},[3946,45223,4298],{"class":3952},[3946,45225,4461],{"class":4224},[3946,45227,4331],{"class":3952},[3946,45229,45230],{"class":3966},"'🔵 [AuthAPI] POST \u002Fauth\u002Flogin'",[3946,45232,4337],{"class":3952},[3946,45234,45235,45237,45239,45241,45243,45246],{"class":3948,"line":4487},[3946,45236,36794],{"class":4262},[3946,45238,4298],{"class":3952},[3946,45240,4461],{"class":4224},[3946,45242,4331],{"class":3952},[3946,45244,45245],{"class":3966},"'✅ [AuthAPI] Response 200'",[3946,45247,4337],{"class":3952},[3946,45249,45250,45252,45254,45256,45258,45261],{"class":3948,"line":4507},[3946,45251,36794],{"class":4262},[3946,45253,4298],{"class":3952},[3946,45255,4461],{"class":4224},[3946,45257,4331],{"class":3952},[3946,45259,45260],{"class":3966},"'⚠️ [AuthAPI] 401 Unauthorized'",[3946,45262,4337],{"class":3952},[3946,45264,45265],{"class":3948,"line":4518},[3946,45266,4278],{"emptyLinePlaceholder":4277},[3946,45268,45269],{"class":3948,"line":4524},[3946,45270,45271],{"class":4342},"\u002F\u002F AuthContext\n",[3946,45273,45274,45276,45278,45280,45282,45285],{"class":3948,"line":4529},[3946,45275,36794],{"class":4262},[3946,45277,4298],{"class":3952},[3946,45279,4461],{"class":4224},[3946,45281,4331],{"class":3952},[3946,45283,45284],{"class":3966},"'🔄 [AuthContext] Відновлення сесії...'",[3946,45286,4337],{"class":3952},[3946,45288,45289,45291,45293,45295,45297,45300],{"class":3948,"line":4534},[3946,45290,36794],{"class":4262},[3946,45292,4298],{"class":3952},[3946,45294,4461],{"class":4224},[3946,45296,4331],{"class":3952},[3946,45298,45299],{"class":3966},"'✅ [AuthContext] Користувач автентифікований'",[3946,45301,4337],{"class":3952},[3946,45303,45304,45306,45308,45310,45312,45315],{"class":3948,"line":4540},[3946,45305,36794],{"class":4262},[3946,45307,4298],{"class":3952},[3946,45309,4461],{"class":4224},[3946,45311,4331],{"class":3952},[3946,45313,45314],{"class":3966},"'🔓 [AuthContext] Користувач деавтентифікований'",[3946,45316,4337],{"class":3952},[3847,45318,45320],{"id":45319},"react-native-debugger","React Native Debugger",[3765,45322,45323,45330,45336],{},[3768,45324,45325,45326],{},"Встановити ",[40725,45327,45320],{"href":45328,"rel":45329},"https:\u002F\u002Fgithub.com\u002Fjhen0409\u002Freact-native-debugger",[40729],[3768,45331,45332,45333],{},"Запустити: ",[3782,45334,45335],{},"open \"rndebugger:\u002F\u002Fset-debugger-loc?host=localhost&port=8081\"",[3768,45337,45338],{},"В Expo: shake device → \"Debug Remote JS\"",[3847,45340,45342],{"id":45341},"redux-devtools","Redux DevTools",[3743,45344,45345],{},"Auth state також можна інтегрувати з Redux для кращого debugging:",[3857,45347,45349],{"className":4242,"code":45348,"language":4244,"meta":3865,"style":3865},"\u002F\u002F store\u002FauthSlice.ts\nconst authSlice = createSlice({\n  name: 'auth',\n  initialState: {\n    user: null,\n    isAuthenticated: false,\n  },\n  reducers: {\n    setUser: (state, action) => {\n      state.user = action.payload;\n      state.isAuthenticated = true;\n    },\n    clearUser: (state) => {\n      state.user = null;\n      state.isAuthenticated = false;\n    },\n  },\n});\n",[3782,45350,45351,45356,45370,45379,45386,45394,45402,45406,45413,45435,45454,45468,45472,45489,45503,45517,45521,45525],{"__ignoreMap":3865},[3946,45352,45353],{"class":3948,"line":3949},[3946,45354,45355],{"class":4342},"\u002F\u002F store\u002FauthSlice.ts\n",[3946,45357,45358,45360,45363,45365,45368],{"class":3948,"line":3956},[3946,45359,4283],{"class":4255},[3946,45361,45362],{"class":4286}," authSlice",[3946,45364,4290],{"class":3952},[3946,45366,45367],{"class":4224},"createSlice",[3946,45369,8512],{"class":3952},[3946,45371,45372,45374,45377],{"class":3948,"line":3973},[3946,45373,36226],{"class":4262},[3946,45375,45376],{"class":3966}," 'auth'",[3946,45378,3970],{"class":3952},[3946,45380,45381,45384],{"class":3948,"line":3986},[3946,45382,45383],{"class":4262},"  initialState:",[3946,45385,4427],{"class":3952},[3946,45387,45388,45390,45392],{"class":3948,"line":3999},[3946,45389,10556],{"class":4262},[3946,45391,4648],{"class":4255},[3946,45393,3970],{"class":3952},[3946,45395,45396,45398,45400],{"class":3948,"line":4012},[3946,45397,10565],{"class":4262},[3946,45399,7628],{"class":4255},[3946,45401,3970],{"class":3952},[3946,45403,45404],{"class":3948,"line":4026},[3946,45405,13271],{"class":3952},[3946,45407,45408,45411],{"class":3948,"line":4037},[3946,45409,45410],{"class":4262},"  reducers:",[3946,45412,4427],{"class":3952},[3946,45414,45415,45418,45420,45422,45424,45426,45429,45431,45433],{"class":3948,"line":4487},[3946,45416,45417],{"class":4224},"    setUser",[3946,45419,8545],{"class":4262},[3946,45421,4479],{"class":3952},[3946,45423,10532],{"class":4262},[3946,45425,4447],{"class":3952},[3946,45427,45428],{"class":4262},"action",[3946,45430,5783],{"class":3952},[3946,45432,6453],{"class":4255},[3946,45434,4427],{"class":3952},[3946,45436,45437,45440,45442,45444,45446,45448,45450,45452],{"class":3948,"line":4507},[3946,45438,45439],{"class":4262},"      state",[3946,45441,4298],{"class":3952},[3946,45443,10775],{"class":4262},[3946,45445,4290],{"class":3952},[3946,45447,45428],{"class":4262},[3946,45449,4298],{"class":3952},[3946,45451,43299],{"class":4262},[3946,45453,4272],{"class":3952},[3946,45455,45456,45458,45460,45462,45464,45466],{"class":3948,"line":4518},[3946,45457,45439],{"class":4262},[3946,45459,4298],{"class":3952},[3946,45461,13041],{"class":4262},[3946,45463,4290],{"class":3952},[3946,45465,17493],{"class":4255},[3946,45467,4272],{"class":3952},[3946,45469,45470],{"class":3948,"line":4524},[3946,45471,10860],{"class":3952},[3946,45473,45474,45477,45479,45481,45483,45485,45487],{"class":3948,"line":4529},[3946,45475,45476],{"class":4224},"    clearUser",[3946,45478,8545],{"class":4262},[3946,45480,4479],{"class":3952},[3946,45482,10532],{"class":4262},[3946,45484,5783],{"class":3952},[3946,45486,6453],{"class":4255},[3946,45488,4427],{"class":3952},[3946,45490,45491,45493,45495,45497,45499,45501],{"class":3948,"line":4534},[3946,45492,45439],{"class":4262},[3946,45494,4298],{"class":3952},[3946,45496,10775],{"class":4262},[3946,45498,4290],{"class":3952},[3946,45500,4562],{"class":4255},[3946,45502,4272],{"class":3952},[3946,45504,45505,45507,45509,45511,45513,45515],{"class":3948,"line":4540},[3946,45506,45439],{"class":4262},[3946,45508,4298],{"class":3952},[3946,45510,13041],{"class":4262},[3946,45512,4290],{"class":3952},[3946,45514,13575],{"class":4255},[3946,45516,4272],{"class":3952},[3946,45518,45519],{"class":3948,"line":4567},[3946,45520,10860],{"class":3952},[3946,45522,45523],{"class":3948,"line":4574},[3946,45524,13271],{"class":3952},[3946,45526,45527],{"class":3948,"line":4600},[3946,45528,13276],{"class":3952},[3750,45530,45532],{"id":45531},"_119-результати-реалізації","11.9. Результати Реалізації",[3847,45534,45536],{"id":45535},"що-було-створено","Що було створено",[3743,45538,45539],{},[3771,45540,45541],{},"📁 Структура:",[3857,45543,45546],{"className":45544,"code":45545,"language":3862},[3860],"nomad\u002F\n├── src\u002Ffeatures\u002Fauth\u002F\n│   ├── api\u002FauthApi.ts              ✅ HTTP клієнт\n│   ├── components\u002F\n│   │   ├── AuthInput.tsx           ✅ Input компонент\n│   │   └── AuthButton.tsx          ✅ Button компонент\n│   ├── context\u002FAuthContext.tsx     ✅ Глобальний стан\n│   ├── screens\u002F\n│   │   ├── LoginScreen.tsx         ✅ Екран входу\n│   │   └── RegisterScreen.tsx      ✅ Екран реєстрації\n│   ├── services\u002FtokenService.ts    ✅ SecureStore сервіс\n│   └── types\u002Fauth.types.ts         ✅ TypeScript типи\n├── app\u002F\n│   ├── (auth)\u002F\n│   │   ├── login.tsx               ✅ Login route\n│   │   └── register.tsx            ✅ Register route\n│   ├── (tabs)\u002F\n│   │   └── profile.tsx             ✅ Profile з logout\n│   └── _layout.tsx                 ✅ Root з AuthProvider\n├── auth-server.js                  ✅ Mock backend\n└── db.json                         ✅ Database з users\n\n",[3782,45547,45545],{"__ignoreMap":3865},[3743,45549,45550],{},[3771,45551,45552],{},"📊 Статистика:",[3878,45554,45555,45561,45567,45573],{},[3768,45556,45557,45560],{},[3771,45558,45559],{},"Файлів створено:"," 13",[3768,45562,45563,45566],{},[3771,45564,45565],{},"Рядків коду:"," ~1,500",[3768,45568,45569,45572],{},[3771,45570,45571],{},"TypeScript:"," 100%",[3768,45574,45575,45578],{},[3771,45576,45577],{},"Залежностей додано:"," 1 (expo-secure-store)",[3847,45580,45582],{"id":45581},"ключові-features","Ключові Features",[3743,45584,40450,45585,45588,45589,45591,45592,45595,45596,45599,45600,45603,45604,45607,45608,45610,45611,45613],{},[3771,45586,45587],{},"JWT Authentication"," — tokens з expiry\n✅ ",[3771,45590,38643],{}," — криптографічне зберігання\n✅ ",[3771,45593,45594],{},"Auto Session Restore"," — відновлення при запуску\n✅ ",[3771,45597,45598],{},"Protected Routes"," — navigation guards\n✅ ",[3771,45601,45602],{},"401 Handling"," — автоматична обробка\n✅ ",[3771,45605,45606],{},"Loading States"," — UX feedback\n✅ ",[3771,45609,8240],{}," — graceful degradation\n✅ ",[3771,45612,2325],{}," — повна типізація",[3750,45615,45617],{"id":45616},"_1110-git-commit","11.10. Git Commit",[3743,45619,45620],{},"Тепер зробимо професійний commit згідно з Nomad philosophy:",[3857,45622,45624],{"className":4215,"code":45623,"language":4217,"meta":3865,"style":3865},"cd \u002FUsers\u002Farakviel\u002FWork\u002Fnomad\n\n# Перевіряємо статус\ngit status\n\n# Додаємо файли\ngit add src\u002Ffeatures\u002Fauth\u002F\ngit add app\u002F(auth)\u002F\ngit add app\u002F(tabs)\u002Fprofile.tsx\ngit add app\u002F_layout.tsx\ngit add auth-server.js\ngit add db.json\ngit add package.json\ngit add package-lock.json\n\n# Commit з детальним описом\ngit commit -m \"feat: secure session and protected routes\n\nImplemented comprehensive authentication system for Nomad:\n\nFeatures:\n- JWT-based authentication with access\u002Frefresh tokens\n- Secure token storage using expo-secure-store (iOS Keychain \u002F Android Keystore)\n- Auth context with global state management\n- Automatic session restoration on app start\n- Protected routes with expo-router navigation guards\n- Login\u002FRegister flows with validation\n- Profile screen with logout functionality\n\nArchitecture:\n- Token Service: SecureStore abstraction with expiry validation\n- Auth API: Axios client with request\u002Fresponse interceptors\n- Auth Context: React Context for global auth state\n- Navigation Guard: Automatic redirect based on auth status\n\nSecurity:\n- Encrypted token storage on device\n- Automatic token cleanup on 401 errors\n- 60-second expiry buffer for race condition prevention\n- Type-safe implementation with TypeScript\n\nFiles Added:\n- src\u002Ffeatures\u002Fauth\u002F (complete auth feature module)\n- app\u002F(auth)\u002F (login, register routes)\n- app\u002F(tabs)\u002Fprofile.tsx (profile with logout)\n- auth-server.js (mock backend for development)\n\nDependencies:\n- expo-secure-store ~14.0.0\n\nTesting:\n- Demo credentials: demo@nomad.com \u002F password123\n- Run backend: npm run api\n- All auth flows tested and working\"\n",[3782,45625,45626,45632,45636,45641,45648,45652,45657,45666,45685,45703,45712,45721,45730,45739,45748,45752,45757,45767,45771,45776,45780,45785,45790,45795,45800,45805,45810,45815,45820,45824,45829,45834,45839,45844,45849,45853,45858,45863,45868,45873,45878,45882,45887,45892,45897,45902,45907,45911,45916,45921,45925,45930,45935,45940],{"__ignoreMap":3865},[3946,45627,45628,45630],{"class":3948,"line":3949},[3946,45629,40959],{"class":4224},[3946,45631,40962],{"class":3966},[3946,45633,45634],{"class":3948,"line":3956},[3946,45635,4278],{"emptyLinePlaceholder":4277},[3946,45637,45638],{"class":3948,"line":3973},[3946,45639,45640],{"class":4342},"# Перевіряємо статус\n",[3946,45642,45643,45645],{"class":3948,"line":3986},[3946,45644,40589],{"class":4224},[3946,45646,45647],{"class":3966}," status\n",[3946,45649,45650],{"class":3948,"line":3999},[3946,45651,4278],{"emptyLinePlaceholder":4277},[3946,45653,45654],{"class":3948,"line":4012},[3946,45655,45656],{"class":4342},"# Додаємо файли\n",[3946,45658,45659,45661,45663],{"class":3948,"line":4026},[3946,45660,40589],{"class":4224},[3946,45662,40592],{"class":3966},[3946,45664,45665],{"class":3966}," src\u002Ffeatures\u002Fauth\u002F\n",[3946,45667,45668,45670,45672,45675,45677,45680,45682],{"class":3948,"line":4037},[3946,45669,40589],{"class":4224},[3946,45671,40592],{"class":3966},[3946,45673,45674],{"class":3966}," app\u002F",[3946,45676,4331],{"class":3952},[3946,45678,45679],{"class":4224},"auth",[3946,45681,25745],{"class":3952},[3946,45683,45684],{"class":3966},"\u002F\n",[3946,45686,45687,45689,45691,45693,45695,45698,45700],{"class":3948,"line":4487},[3946,45688,40589],{"class":4224},[3946,45690,40592],{"class":3966},[3946,45692,45674],{"class":3966},[3946,45694,4331],{"class":3952},[3946,45696,45697],{"class":4224},"tabs",[3946,45699,25745],{"class":3952},[3946,45701,45702],{"class":3966},"\u002Fprofile.tsx\n",[3946,45704,45705,45707,45709],{"class":3948,"line":4507},[3946,45706,40589],{"class":4224},[3946,45708,40592],{"class":3966},[3946,45710,45711],{"class":3966}," app\u002F_layout.tsx\n",[3946,45713,45714,45716,45718],{"class":3948,"line":4518},[3946,45715,40589],{"class":4224},[3946,45717,40592],{"class":3966},[3946,45719,45720],{"class":3966}," auth-server.js\n",[3946,45722,45723,45725,45727],{"class":3948,"line":4524},[3946,45724,40589],{"class":4224},[3946,45726,40592],{"class":3966},[3946,45728,45729],{"class":3966}," db.json\n",[3946,45731,45732,45734,45736],{"class":3948,"line":4529},[3946,45733,40589],{"class":4224},[3946,45735,40592],{"class":3966},[3946,45737,45738],{"class":3966}," package.json\n",[3946,45740,45741,45743,45745],{"class":3948,"line":4534},[3946,45742,40589],{"class":4224},[3946,45744,40592],{"class":3966},[3946,45746,45747],{"class":3966}," package-lock.json\n",[3946,45749,45750],{"class":3948,"line":4540},[3946,45751,4278],{"emptyLinePlaceholder":4277},[3946,45753,45754],{"class":3948,"line":4567},[3946,45755,45756],{"class":4342},"# Commit з детальним описом\n",[3946,45758,45759,45761,45763,45765],{"class":3948,"line":4574},[3946,45760,40589],{"class":4224},[3946,45762,40611],{"class":3966},[3946,45764,40614],{"class":4255},[3946,45766,40617],{"class":3966},[3946,45768,45769],{"class":3948,"line":4600},[3946,45770,4278],{"emptyLinePlaceholder":4277},[3946,45772,45773],{"class":3948,"line":4610},[3946,45774,45775],{"class":3966},"Implemented comprehensive authentication system for Nomad:\n",[3946,45777,45778],{"class":3948,"line":4623},[3946,45779,4278],{"emptyLinePlaceholder":4277},[3946,45781,45782],{"class":3948,"line":4643},[3946,45783,45784],{"class":3966},"Features:\n",[3946,45786,45787],{"class":3948,"line":4653},[3946,45788,45789],{"class":3966},"- JWT-based authentication with access\u002Frefresh tokens\n",[3946,45791,45792],{"class":3948,"line":4658},[3946,45793,45794],{"class":3966},"- Secure token storage using expo-secure-store (iOS Keychain \u002F Android Keystore)\n",[3946,45796,45797],{"class":3948,"line":4663},[3946,45798,45799],{"class":3966},"- Auth context with global state management\n",[3946,45801,45802],{"class":3948,"line":4668},[3946,45803,45804],{"class":3966},"- Automatic session restoration on app start\n",[3946,45806,45807],{"class":3948,"line":4674},[3946,45808,45809],{"class":3966},"- Protected routes with expo-router navigation guards\n",[3946,45811,45812],{"class":3948,"line":4694},[3946,45813,45814],{"class":3966},"- Login\u002FRegister flows with validation\n",[3946,45816,45817],{"class":3948,"line":4701},[3946,45818,45819],{"class":3966},"- Profile screen with logout functionality\n",[3946,45821,45822],{"class":3948,"line":4719},[3946,45823,4278],{"emptyLinePlaceholder":4277},[3946,45825,45826],{"class":3948,"line":4735},[3946,45827,45828],{"class":3966},"Architecture:\n",[3946,45830,45831],{"class":3948,"line":4748},[3946,45832,45833],{"class":3966},"- Token Service: SecureStore abstraction with expiry validation\n",[3946,45835,45836],{"class":3948,"line":4768},[3946,45837,45838],{"class":3966},"- Auth API: Axios client with request\u002Fresponse interceptors\n",[3946,45840,45841],{"class":3948,"line":4777},[3946,45842,45843],{"class":3966},"- Auth Context: React Context for global auth state\n",[3946,45845,45846],{"class":3948,"line":4782},[3946,45847,45848],{"class":3966},"- Navigation Guard: Automatic redirect based on auth status\n",[3946,45850,45851],{"class":3948,"line":6262},[3946,45852,4278],{"emptyLinePlaceholder":4277},[3946,45854,45855],{"class":3948,"line":6273},[3946,45856,45857],{"class":3966},"Security:\n",[3946,45859,45860],{"class":3948,"line":6284},[3946,45861,45862],{"class":3966},"- Encrypted token storage on device\n",[3946,45864,45865],{"class":3948,"line":6299},[3946,45866,45867],{"class":3966},"- Automatic token cleanup on 401 errors\n",[3946,45869,45870],{"class":3948,"line":6304},[3946,45871,45872],{"class":3966},"- 60-second expiry buffer for race condition prevention\n",[3946,45874,45875],{"class":3948,"line":6309},[3946,45876,45877],{"class":3966},"- Type-safe implementation with TypeScript\n",[3946,45879,45880],{"class":3948,"line":6314},[3946,45881,4278],{"emptyLinePlaceholder":4277},[3946,45883,45884],{"class":3948,"line":6320},[3946,45885,45886],{"class":3966},"Files Added:\n",[3946,45888,45889],{"class":3948,"line":6325},[3946,45890,45891],{"class":3966},"- src\u002Ffeatures\u002Fauth\u002F (complete auth feature module)\n",[3946,45893,45894],{"class":3948,"line":6337},[3946,45895,45896],{"class":3966},"- app\u002F(auth)\u002F (login, register routes)\n",[3946,45898,45899],{"class":3948,"line":6352},[3946,45900,45901],{"class":3966},"- app\u002F(tabs)\u002Fprofile.tsx (profile with logout)\n",[3946,45903,45904],{"class":3948,"line":6364},[3946,45905,45906],{"class":3966},"- auth-server.js (mock backend for development)\n",[3946,45908,45909],{"class":3948,"line":6376},[3946,45910,4278],{"emptyLinePlaceholder":4277},[3946,45912,45913],{"class":3948,"line":6392},[3946,45914,45915],{"class":3966},"Dependencies:\n",[3946,45917,45918],{"class":3948,"line":6397},[3946,45919,45920],{"class":3966},"- expo-secure-store ~14.0.0\n",[3946,45922,45923],{"class":3948,"line":6402},[3946,45924,4278],{"emptyLinePlaceholder":4277},[3946,45926,45927],{"class":3948,"line":6407},[3946,45928,45929],{"class":3966},"Testing:\n",[3946,45931,45932],{"class":3948,"line":6413},[3946,45933,45934],{"class":3966},"- Demo credentials: demo@nomad.com \u002F password123\n",[3946,45936,45937],{"class":3948,"line":6418},[3946,45938,45939],{"class":3966},"- Run backend: npm run api\n",[3946,45941,45942],{"class":3948,"line":6434},[3946,45943,45944],{"class":3966},"- All auth flows tested and working\"\n",[3743,45946,45947],{},[3771,45948,45949],{},"Альтернативний короткий варіант:",[3857,45951,45953],{"className":4215,"code":45952,"language":4217,"meta":3865,"style":3865},"git commit -m \"feat: secure session and protected routes\n\n- JWT auth with SecureStore (iOS Keychain\u002FAndroid Keystore)\n- Auto session restore on app start  \n- Protected routes with expo-router guards\n- Login\u002FRegister\u002FLogout flows\n- Mock backend (auth-server.js)\n\nDemo: demo@nomad.com \u002F password123\"\n",[3782,45954,45955,45965,45969,45974,45979,45984,45989,45994,45998],{"__ignoreMap":3865},[3946,45956,45957,45959,45961,45963],{"class":3948,"line":3949},[3946,45958,40589],{"class":4224},[3946,45960,40611],{"class":3966},[3946,45962,40614],{"class":4255},[3946,45964,40617],{"class":3966},[3946,45966,45967],{"class":3948,"line":3956},[3946,45968,4278],{"emptyLinePlaceholder":4277},[3946,45970,45971],{"class":3948,"line":3973},[3946,45972,45973],{"class":3966},"- JWT auth with SecureStore (iOS Keychain\u002FAndroid Keystore)\n",[3946,45975,45976],{"class":3948,"line":3986},[3946,45977,45978],{"class":3966},"- Auto session restore on app start  \n",[3946,45980,45981],{"class":3948,"line":3999},[3946,45982,45983],{"class":3966},"- Protected routes with expo-router guards\n",[3946,45985,45986],{"class":3948,"line":4012},[3946,45987,45988],{"class":3966},"- Login\u002FRegister\u002FLogout flows\n",[3946,45990,45991],{"class":3948,"line":4026},[3946,45992,45993],{"class":3966},"- Mock backend (auth-server.js)\n",[3946,45995,45996],{"class":3948,"line":4037},[3946,45997,4278],{"emptyLinePlaceholder":4277},[3946,45999,46000],{"class":3948,"line":4487},[3946,46001,46002],{"class":3966},"Demo: demo@nomad.com \u002F password123\"\n",[3847,46004,46006],{"id":46005},"перевірка-змін-перед-push","Перевірка змін перед push:",[3857,46008,46010],{"className":4215,"code":46009,"language":4217,"meta":3865,"style":3865},"# Дивимося що було змінено\ngit diff --cached --stat\n\n# Переглядаємо commit\ngit show --stat\n\n# Якщо все ОК — push\ngit push origin main\n",[3782,46011,46012,46017,46030,46034,46039,46048,46052,46057],{"__ignoreMap":3865},[3946,46013,46014],{"class":3948,"line":3949},[3946,46015,46016],{"class":4342},"# Дивимося що було змінено\n",[3946,46018,46019,46021,46024,46027],{"class":3948,"line":3956},[3946,46020,40589],{"class":4224},[3946,46022,46023],{"class":3966}," diff",[3946,46025,46026],{"class":4255}," --cached",[3946,46028,46029],{"class":4255}," --stat\n",[3946,46031,46032],{"class":3948,"line":3973},[3946,46033,4278],{"emptyLinePlaceholder":4277},[3946,46035,46036],{"class":3948,"line":3986},[3946,46037,46038],{"class":4342},"# Переглядаємо commit\n",[3946,46040,46041,46043,46046],{"class":3948,"line":3999},[3946,46042,40589],{"class":4224},[3946,46044,46045],{"class":3966}," show",[3946,46047,46029],{"class":4255},[3946,46049,46050],{"class":3948,"line":4012},[3946,46051,4278],{"emptyLinePlaceholder":4277},[3946,46053,46054],{"class":3948,"line":4026},[3946,46055,46056],{"class":4342},"# Якщо все ОК — push\n",[3946,46058,46059,46061,46064,46067],{"class":3948,"line":4037},[3946,46060,40589],{"class":4224},[3946,46062,46063],{"class":3966}," push",[3946,46065,46066],{"class":3966}," origin",[3946,46068,46069],{"class":3966}," main\n",[3750,46071,46073],{"id":46072},"_1111-next-steps-та-покращення","11.11. Next Steps та Покращення",[3743,46075,46076],{},"Поточна реалізація — це solid foundation. Ось що можна додати далі:",[3847,46078,46080],{"id":46079},"короткострокові-покращення-1-2-дні","Короткострокові покращення (1-2 дні)",[3743,46082,46083],{},[3771,46084,46085],{},"1. Password Recovery:",[3857,46087,46089],{"className":4242,"code":46088,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(auth)\u002Fforgot-password.tsx\nexport default function ForgotPasswordScreen() {\n  \u002F\u002F Email input → send reset link\n}\n",[3782,46090,46091,46096,46109,46114],{"__ignoreMap":3865},[3946,46092,46093],{"class":3948,"line":3949},[3946,46094,46095],{"class":4342},"\u002F\u002F app\u002F(auth)\u002Fforgot-password.tsx\n",[3946,46097,46098,46100,46102,46104,46107],{"class":3948,"line":3956},[3946,46099,6030],{"class":4251},[3946,46101,39938],{"class":4251},[3946,46103,4390],{"class":4255},[3946,46105,46106],{"class":4224}," ForgotPasswordScreen",[3946,46108,8490],{"class":3952},[3946,46110,46111],{"class":3948,"line":3973},[3946,46112,46113],{"class":4342},"  \u002F\u002F Email input → send reset link\n",[3946,46115,46116],{"class":3948,"line":3986},[3946,46117,4040],{"class":3952},[3743,46119,46120],{},[3771,46121,46122],{},"2. Biometric Auth:",[3857,46124,46126],{"className":4242,"code":46125,"language":4244,"meta":3865,"style":3865},"import * as LocalAuthentication from 'expo-local-authentication';\n\nconst useBiometrics = async () => {\n  const result = await LocalAuthentication.authenticateAsync({\n    promptMessage: 'Вхід у Nomad',\n  });\n  if (result.success) {\n    \u002F\u002F Автоматичний login\n  }\n};\n",[3782,46127,46128,46144,46148,46165,46183,46192,46196,46211,46216,46220],{"__ignoreMap":3865},[3946,46129,46130,46132,46134,46136,46138,46140,46142],{"class":3948,"line":3949},[3946,46131,4252],{"class":4251},[3946,46133,4256],{"class":4255},[3946,46135,4259],{"class":4251},[3946,46137,37458],{"class":4262},[3946,46139,4266],{"class":4251},[3946,46141,37463],{"class":3966},[3946,46143,4272],{"class":3952},[3946,46145,46146],{"class":3948,"line":3956},[3946,46147,4278],{"emptyLinePlaceholder":4277},[3946,46149,46150,46152,46155,46157,46159,46161,46163],{"class":3948,"line":3973},[3946,46151,4283],{"class":4255},[3946,46153,46154],{"class":4224}," useBiometrics",[3946,46156,4290],{"class":3952},[3946,46158,4387],{"class":4255},[3946,46160,11004],{"class":3952},[3946,46162,6453],{"class":4255},[3946,46164,4427],{"class":3952},[3946,46166,46167,46169,46171,46173,46175,46177,46179,46181],{"class":3948,"line":3986},[3946,46168,5018],{"class":4255},[3946,46170,37603],{"class":4286},[3946,46172,4290],{"class":3952},[3946,46174,4293],{"class":4251},[3946,46176,37458],{"class":4262},[3946,46178,4298],{"class":3952},[3946,46180,37614],{"class":4224},[3946,46182,8512],{"class":3952},[3946,46184,46185,46187,46190],{"class":3948,"line":3999},[3946,46186,37621],{"class":4262},[3946,46188,46189],{"class":3966}," 'Вхід у Nomad'",[3946,46191,3970],{"class":3952},[3946,46193,46194],{"class":3948,"line":4012},[3946,46195,4977],{"class":3952},[3946,46197,46198,46200,46202,46205,46207,46209],{"class":3948,"line":4026},[3946,46199,5776],{"class":4251},[3946,46201,4479],{"class":3952},[3946,46203,46204],{"class":4262},"result",[3946,46206,4298],{"class":3952},[3946,46208,37664],{"class":4262},[3946,46210,4318],{"class":3952},[3946,46212,46213],{"class":3948,"line":4037},[3946,46214,46215],{"class":4342},"    \u002F\u002F Автоматичний login\n",[3946,46217,46218],{"class":3948,"line":4487},[3946,46219,4521],{"class":3952},[3946,46221,46222],{"class":3948,"line":4507},[3946,46223,13477],{"class":3952},[3743,46225,46226],{},[3771,46227,46228],{},"3. Remember Me:",[3857,46230,46232],{"className":4242,"code":46231,"language":4244,"meta":3865,"style":3865},"const [rememberMe, setRememberMe] = useState(true);\n\n\u002F\u002F Різний expiry для tokens\nconst expiresIn = rememberMe ? 86400 * 30 : 3600; \u002F\u002F 30 днів vs 1 година\n",[3782,46233,46234,46256,46260,46265],{"__ignoreMap":3865},[3946,46235,46236,46238,46240,46242,46244,46246,46248,46250,46252,46254],{"class":3948,"line":3949},[3946,46237,4283],{"class":4255},[3946,46239,10529],{"class":3952},[3946,46241,38257],{"class":4286},[3946,46243,4447],{"class":3952},[3946,46245,38262],{"class":4286},[3946,46247,10540],{"class":3952},[3946,46249,10543],{"class":4224},[3946,46251,4331],{"class":3952},[3946,46253,17493],{"class":4255},[3946,46255,4337],{"class":3952},[3946,46257,46258],{"class":3948,"line":3956},[3946,46259,4278],{"emptyLinePlaceholder":4277},[3946,46261,46262],{"class":3948,"line":3973},[3946,46263,46264],{"class":4342},"\u002F\u002F Різний expiry для tokens\n",[3946,46266,46267,46269,46271,46273,46275,46277,46279,46281,46283,46285,46287,46289],{"class":3948,"line":3986},[3946,46268,4283],{"class":4255},[3946,46270,38595],{"class":4286},[3946,46272,4290],{"class":3952},[3946,46274,38257],{"class":4262},[3946,46276,11523],{"class":3952},[3946,46278,37038],{"class":4020},[3946,46280,7029],{"class":3952},[3946,46282,37043],{"class":4020},[3946,46284,11532],{"class":3952},[3946,46286,37064],{"class":4020},[3946,46288,4851],{"class":3952},[3946,46290,46291],{"class":4342},"\u002F\u002F 30 днів vs 1 година\n",[3743,46293,46294],{},[3771,46295,46296],{},"4. Refresh Token Logic:",[3857,46298,46300],{"className":4242,"code":46299,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Automatic refresh при 401\nif (error.response?.status === 401 && !originalRequest._retry) {\n  const tokens = await tokenService.getTokens();\n  const newTokens = await authApi.refreshToken(tokens.refreshToken);\n  await tokenService.saveTokens(\u002F*...*\u002F);\n  return axios(originalRequest); \u002F\u002F Retry original request\n}\n",[3782,46301,46302,46307,46337,46355,46382,46398,46413],{"__ignoreMap":3865},[3946,46303,46304],{"class":3948,"line":3949},[3946,46305,46306],{"class":4342},"\u002F\u002F Automatic refresh при 401\n",[3946,46308,46309,46311,46313,46315,46317,46319,46321,46323,46325,46327,46329,46331,46333,46335],{"class":3948,"line":3956},[3946,46310,4309],{"class":4251},[3946,46312,4479],{"class":3952},[3946,46314,4482],{"class":4262},[3946,46316,4298],{"class":3952},[3946,46318,8757],{"class":4262},[3946,46320,7539],{"class":3952},[3946,46322,8813],{"class":4262},[3946,46324,8816],{"class":3952},[3946,46326,8819],{"class":4020},[3946,46328,17470],{"class":3952},[3946,46330,17467],{"class":4262},[3946,46332,4298],{"class":3952},[3946,46334,17477],{"class":4262},[3946,46336,4318],{"class":3952},[3946,46338,46339,46341,46343,46345,46347,46349,46351,46353],{"class":3948,"line":3973},[3946,46340,5018],{"class":4255},[3946,46342,6987],{"class":4286},[3946,46344,4290],{"class":3952},[3946,46346,4293],{"class":4251},[3946,46348,8213],{"class":4262},[3946,46350,4298],{"class":3952},[3946,46352,7528],{"class":4224},[3946,46354,4304],{"class":3952},[3946,46356,46357,46359,46362,46364,46366,46368,46370,46372,46374,46376,46378,46380],{"class":3948,"line":3986},[3946,46358,5018],{"class":4255},[3946,46360,46361],{"class":4286}," newTokens",[3946,46363,4290],{"class":3952},[3946,46365,4293],{"class":4251},[3946,46367,10106],{"class":4262},[3946,46369,4298],{"class":3952},[3946,46371,5363],{"class":4224},[3946,46373,4331],{"class":3952},[3946,46375,7062],{"class":4262},[3946,46377,4298],{"class":3952},[3946,46379,5363],{"class":4262},[3946,46381,4337],{"class":3952},[3946,46383,46384,46386,46388,46390,46392,46394,46396],{"class":3948,"line":3999},[3946,46385,4935],{"class":4251},[3946,46387,8213],{"class":4262},[3946,46389,4298],{"class":3952},[3946,46391,7869],{"class":4224},[3946,46393,4331],{"class":3952},[3946,46395,42182],{"class":4342},[3946,46397,4337],{"class":3952},[3946,46399,46400,46402,46404,46406,46408,46410],{"class":3948,"line":4012},[3946,46401,5062],{"class":4251},[3946,46403,8287],{"class":4224},[3946,46405,4331],{"class":3952},[3946,46407,17467],{"class":4262},[3946,46409,5397],{"class":3952},[3946,46411,46412],{"class":4342},"\u002F\u002F Retry original request\n",[3946,46414,46415],{"class":3948,"line":4026},[3946,46416,4040],{"class":3952},[3847,46418,46420],{"id":46419},"середньострокові-покращення-1-тиждень","Середньострокові покращення (1 тиждень)",[3743,46422,46423],{},[3771,46424,46425],{},"5. Social Auth (Google, Apple):",[3857,46427,46429],{"className":4215,"code":46428,"language":4217,"meta":3865,"style":3865},"npm install @react-native-google-signin\u002Fgoogle-signin\nnpm install expo-apple-authentication\n",[3782,46430,46431,46440],{"__ignoreMap":3865},[3946,46432,46433,46435,46437],{"class":3948,"line":3949},[3946,46434,18852],{"class":4224},[3946,46436,4231],{"class":3966},[3946,46438,46439],{"class":3966}," @react-native-google-signin\u002Fgoogle-signin\n",[3946,46441,46442,46444,46446],{"class":3948,"line":3956},[3946,46443,18852],{"class":4224},[3946,46445,4231],{"class":3966},[3946,46447,46448],{"class":3966}," expo-apple-authentication\n",[3743,46450,46451],{},[3771,46452,46453],{},"6. Multi-factor Authentication:",[3878,46455,46456,46459,46462],{},[3768,46457,46458],{},"SMS verification",[3768,46460,46461],{},"Authenticator app (TOTP)",[3768,46463,46464],{},"Email confirmation",[3743,46466,46467],{},[3771,46468,46469],{},"7. Session Management:",[3857,46471,46473],{"className":4242,"code":46472,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Список активних сесій\ninterface Session {\n  id: string;\n  device: string;\n  lastActive: Date;\n  location?: string;\n}\n\n\u002F\u002F Logout з інших пристроїв\nawait authApi.logoutAllDevices();\n",[3782,46474,46475,46480,46489,46499,46510,46521,46532,46536,46540,46545],{"__ignoreMap":3865},[3946,46476,46477],{"class":3948,"line":3949},[3946,46478,46479],{"class":4342},"\u002F\u002F Список активних сесій\n",[3946,46481,46482,46484,46487],{"class":3948,"line":3956},[3946,46483,4801],{"class":4255},[3946,46485,46486],{"class":4403}," Session",[3946,46488,4427],{"class":3952},[3946,46490,46491,46493,46495,46497],{"class":3948,"line":3973},[3946,46492,6043],{"class":4262},[3946,46494,3963],{"class":3952},[3946,46496,4404],{"class":4403},[3946,46498,4272],{"class":3952},[3946,46500,46501,46504,46506,46508],{"class":3948,"line":3986},[3946,46502,46503],{"class":4262},"  device",[3946,46505,3963],{"class":3952},[3946,46507,4404],{"class":4403},[3946,46509,4272],{"class":3952},[3946,46511,46512,46515,46517,46519],{"class":3948,"line":3999},[3946,46513,46514],{"class":4262},"  lastActive",[3946,46516,3963],{"class":3952},[3946,46518,7663],{"class":4403},[3946,46520,4272],{"class":3952},[3946,46522,46523,46526,46528,46530],{"class":3948,"line":4012},[3946,46524,46525],{"class":4262},"  location",[3946,46527,4814],{"class":3952},[3946,46529,4404],{"class":4403},[3946,46531,4272],{"class":3952},[3946,46533,46534],{"class":3948,"line":4026},[3946,46535,4040],{"class":3952},[3946,46537,46538],{"class":3948,"line":4037},[3946,46539,4278],{"emptyLinePlaceholder":4277},[3946,46541,46542],{"class":3948,"line":4487},[3946,46543,46544],{"class":4342},"\u002F\u002F Logout з інших пристроїв\n",[3946,46546,46547,46549,46551,46553,46556],{"class":3948,"line":4507},[3946,46548,4293],{"class":4251},[3946,46550,10106],{"class":4262},[3946,46552,4298],{"class":3952},[3946,46554,46555],{"class":4224},"logoutAllDevices",[3946,46557,4304],{"class":3952},[3743,46559,46560],{},[3771,46561,46562],{},"8. Role-based Access Control:",[3857,46564,46566],{"className":4242,"code":46565,"language":4244,"meta":3865,"style":3865},"\u002F\u002F HOC для захисту за роллю\nexport const withRole = (Component, requiredRole) => {\n  return (props) => {\n    const { user } = useAuth();\n    if (user?.role !== requiredRole) {\n      return \u003CAccessDenied \u002F>;\n    }\n    return \u003CComponent {...props} \u002F>;\n  };\n};\n\n\u002F\u002F Використання\nexport default withRole(AdminDashboard, 'admin');\n",[3782,46567,46568,46573,46596,46610,46624,46642,46653,46657,46671,46675,46679,46683,46687],{"__ignoreMap":3865},[3946,46569,46570],{"class":3948,"line":3949},[3946,46571,46572],{"class":4342},"\u002F\u002F HOC для захисту за роллю\n",[3946,46574,46575,46577,46579,46582,46584,46586,46588,46590,46592,46594],{"class":3948,"line":3956},[3946,46576,6030],{"class":4251},[3946,46578,5933],{"class":4255},[3946,46580,46581],{"class":4224}," withRole",[3946,46583,25165],{"class":3952},[3946,46585,15527],{"class":4262},[3946,46587,4447],{"class":3952},[3946,46589,15290],{"class":4262},[3946,46591,5783],{"class":3952},[3946,46593,6453],{"class":4255},[3946,46595,4427],{"class":3952},[3946,46597,46598,46600,46602,46604,46606,46608],{"class":3948,"line":3973},[3946,46599,5062],{"class":4251},[3946,46601,4479],{"class":3952},[3946,46603,14969],{"class":4262},[3946,46605,5783],{"class":3952},[3946,46607,6453],{"class":4255},[3946,46609,4427],{"class":3952},[3946,46611,46612,46614,46616,46618,46620,46622],{"class":3948,"line":3986},[3946,46613,4577],{"class":4255},[3946,46615,6817],{"class":3952},[3946,46617,10775],{"class":4286},[3946,46619,13049],{"class":3952},[3946,46621,12954],{"class":4224},[3946,46623,4304],{"class":3952},[3946,46625,46626,46628,46630,46632,46634,46636,46638,46640],{"class":3948,"line":3999},[3946,46627,5503],{"class":4251},[3946,46629,4479],{"class":3952},[3946,46631,10775],{"class":4262},[3946,46633,7539],{"class":3952},[3946,46635,15300],{"class":4262},[3946,46637,15303],{"class":3952},[3946,46639,15290],{"class":4262},[3946,46641,4318],{"class":3952},[3946,46643,46644,46646,46648,46651],{"class":3948,"line":4012},[3946,46645,7405],{"class":4251},[3946,46647,12589],{"class":3952},[3946,46649,46650],{"class":4403},"AccessDenied",[3946,46652,15078],{"class":3952},[3946,46654,46655],{"class":3948,"line":4026},[3946,46656,5550],{"class":3952},[3946,46658,46659,46661,46663,46665,46667,46669],{"class":3948,"line":4037},[3946,46660,4603],{"class":4251},[3946,46662,12589],{"class":3952},[3946,46664,15527],{"class":4403},[3946,46666,15530],{"class":3952},[3946,46668,14969],{"class":4403},[3946,46670,14306],{"class":3952},[3946,46672,46673],{"class":3948,"line":4487},[3946,46674,15539],{"class":3952},[3946,46676,46677],{"class":3948,"line":4507},[3946,46678,13477],{"class":3952},[3946,46680,46681],{"class":3948,"line":4518},[3946,46682,4278],{"emptyLinePlaceholder":4277},[3946,46684,46685],{"class":3948,"line":4524},[3946,46686,5944],{"class":4342},[3946,46688,46689,46691,46693,46695,46697,46700,46702,46704],{"class":3948,"line":4529},[3946,46690,6030],{"class":4251},[3946,46692,39938],{"class":4251},[3946,46694,46581],{"class":4224},[3946,46696,4331],{"class":3952},[3946,46698,46699],{"class":4262},"AdminDashboard",[3946,46701,4447],{"class":3952},[3946,46703,6097],{"class":3966},[3946,46705,4337],{"class":3952},[3847,46707,46709],{"id":46708},"довгострокові-покращення-1-місяць","Довгострокові покращення (1 місяць)",[3743,46711,46712],{},[3771,46713,46714],{},"9. Offline-first Auth:",[3857,46716,46718],{"className":4242,"code":46717,"language":4244,"meta":3865,"style":3865},"\u002F\u002F SQLite для кешування user data\nimport * as SQLite from 'expo-sqlite';\n\nconst db = SQLite.openDatabase('nomad.db');\ndb.transaction(tx => {\n  tx.executeSql(\n    'CREATE TABLE IF NOT EXISTS user_cache (id TEXT PRIMARY KEY, data TEXT)'\n  );\n});\n",[3782,46719,46720,46725,46743,46747,46770,46788,46800,46805,46809],{"__ignoreMap":3865},[3946,46721,46722],{"class":3948,"line":3949},[3946,46723,46724],{"class":4342},"\u002F\u002F SQLite для кешування user data\n",[3946,46726,46727,46729,46731,46733,46736,46738,46741],{"class":3948,"line":3956},[3946,46728,4252],{"class":4251},[3946,46730,4256],{"class":4255},[3946,46732,4259],{"class":4251},[3946,46734,46735],{"class":4262}," SQLite",[3946,46737,4266],{"class":4251},[3946,46739,46740],{"class":3966}," 'expo-sqlite'",[3946,46742,4272],{"class":3952},[3946,46744,46745],{"class":3948,"line":3973},[3946,46746,4278],{"emptyLinePlaceholder":4277},[3946,46748,46749,46751,46753,46755,46758,46760,46763,46765,46768],{"class":3948,"line":3986},[3946,46750,4283],{"class":4255},[3946,46752,43376],{"class":4286},[3946,46754,4290],{"class":3952},[3946,46756,46757],{"class":4262},"SQLite",[3946,46759,4298],{"class":3952},[3946,46761,46762],{"class":4224},"openDatabase",[3946,46764,4331],{"class":3952},[3946,46766,46767],{"class":3966},"'nomad.db'",[3946,46769,4337],{"class":3952},[3946,46771,46772,46774,46776,46779,46781,46784,46786],{"class":3948,"line":3999},[3946,46773,43412],{"class":4262},[3946,46775,4298],{"class":3952},[3946,46777,46778],{"class":4224},"transaction",[3946,46780,4331],{"class":3952},[3946,46782,46783],{"class":4262},"tx",[3946,46785,23088],{"class":4255},[3946,46787,4427],{"class":3952},[3946,46789,46790,46793,46795,46798],{"class":3948,"line":4012},[3946,46791,46792],{"class":4262},"  tx",[3946,46794,4298],{"class":3952},[3946,46796,46797],{"class":4224},"executeSql",[3946,46799,6594],{"class":3952},[3946,46801,46802],{"class":3948,"line":4026},[3946,46803,46804],{"class":3966},"    'CREATE TABLE IF NOT EXISTS user_cache (id TEXT PRIMARY KEY, data TEXT)'\n",[3946,46806,46807],{"class":3948,"line":4037},[3946,46808,10875],{"class":3952},[3946,46810,46811],{"class":3948,"line":4487},[3946,46812,13276],{"class":3952},[3743,46814,46815],{},[3771,46816,46817],{},"10. Analytics та Monitoring:",[3857,46819,46821],{"className":4242,"code":46820,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Track auth events\nanalytics.logLogin({ method: 'email' });\nanalytics.logSignUp({ method: 'email' });\n\n\u002F\u002F Error tracking\nSentry.captureException(error, {\n  tags: { feature: 'auth', action: 'login' },\n});\n",[3782,46822,46823,46828,46846,46863,46867,46872,46886,46907],{"__ignoreMap":3865},[3946,46824,46825],{"class":3948,"line":3949},[3946,46826,46827],{"class":4342},"\u002F\u002F Track auth events\n",[3946,46829,46830,46833,46835,46837,46839,46842,46844],{"class":3948,"line":3956},[3946,46831,46832],{"class":4262},"analytics",[3946,46834,4298],{"class":3952},[3946,46836,40350],{"class":4224},[3946,46838,10506],{"class":3952},[3946,46840,46841],{"class":4262},"method:",[3946,46843,40360],{"class":3966},[3946,46845,10726],{"class":3952},[3946,46847,46848,46850,46852,46855,46857,46859,46861],{"class":3948,"line":3973},[3946,46849,46832],{"class":4262},[3946,46851,4298],{"class":3952},[3946,46853,46854],{"class":4224},"logSignUp",[3946,46856,10506],{"class":3952},[3946,46858,46841],{"class":4262},[3946,46860,40360],{"class":3966},[3946,46862,10726],{"class":3952},[3946,46864,46865],{"class":3948,"line":3986},[3946,46866,4278],{"emptyLinePlaceholder":4277},[3946,46868,46869],{"class":3948,"line":3999},[3946,46870,46871],{"class":4342},"\u002F\u002F Error tracking\n",[3946,46873,46874,46876,46878,46880,46882,46884],{"class":3948,"line":4012},[3946,46875,40135],{"class":4262},[3946,46877,4298],{"class":3952},[3946,46879,40225],{"class":4224},[3946,46881,4331],{"class":3952},[3946,46883,4482],{"class":4262},[3946,46885,4952],{"class":3952},[3946,46887,46888,46891,46893,46896,46898,46900,46903,46905],{"class":3948,"line":4026},[3946,46889,46890],{"class":4262},"  tags:",[3946,46892,6817],{"class":3952},[3946,46894,46895],{"class":4262},"feature:",[3946,46897,45376],{"class":3966},[3946,46899,4447],{"class":3952},[3946,46901,46902],{"class":4262},"action:",[3946,46904,40256],{"class":3966},[3946,46906,19998],{"class":3952},[3946,46908,46909],{"class":3948,"line":4037},[3946,46910,13276],{"class":3952},[3743,46912,46913],{},[3771,46914,46915],{},"11. Security Hardening:",[3878,46917,46918,46921,46924,46927],{},[3768,46919,46920],{},"Certificate pinning",[3768,46922,46923],{},"Root\u002FJailbreak detection",[3768,46925,46926],{},"Secure keyboard для password inputs",[3768,46928,46929],{},"Rate limiting на backend",[3743,46931,46932],{},[3771,46933,46934],{},"12. Advanced UX:",[3878,46936,46937,46940,46943,46946],{},[3768,46938,46939],{},"Skeleton screens під час loading",[3768,46941,46942],{},"Smooth transitions між auth\u002Fapp stacks",[3768,46944,46945],{},"Password strength indicator",[3768,46947,46948],{},"Email verification flow",[3750,46950,46952],{"id":46951},"_1112-production-checklist","11.12. Production Checklist",[3743,46954,46955],{},"Перед виходом в production перевірте:",[3847,46957,46959],{"id":46958},"security","Security",[3878,46961,46964,46973,46979,46985,46991,46997,47003,47009],{"className":46962},[46963],"contains-task-list",[3768,46965,46968,46972],{"className":46966},[46967],"task-list-item",[46969,46970],"input",{"disabled":4277,"type":46971},"checkbox"," HTTPS для всіх API endpoints",[3768,46974,46976,46978],{"className":46975},[46967],[46969,46977],{"disabled":4277,"type":46971}," Environment variables для sensitive data",[3768,46980,46982,46984],{"className":46981},[46967],[46969,46983],{"disabled":4277,"type":46971}," Token expiry достатньо короткий (1 год)",[3768,46986,46988,46990],{"className":46987},[46967],[46969,46989],{"disabled":4277,"type":46971}," Refresh token rotation implemented",[3768,46992,46994,46996],{"className":46993},[46967],[46969,46995],{"disabled":4277,"type":46971}," XSS\u002FCSRF захист на backend",[3768,46998,47000,47002],{"className":46999},[46967],[46969,47001],{"disabled":4277,"type":46971}," Password hashing (bcrypt, Argon2)",[3768,47004,47006,47008],{"className":47005},[46967],[46969,47007],{"disabled":4277,"type":46971}," Rate limiting на login endpoint",[3768,47010,47012,47014],{"className":47011},[46967],[46969,47013],{"disabled":4277,"type":46971}," Logs не містять sensitive data",[3847,47016,47018],{"id":47017},"ux","UX",[3878,47020,47022,47028,47034,47040,47046,47052],{"className":47021},[46963],[3768,47023,47025,47027],{"className":47024},[46967],[46969,47026],{"disabled":4277,"type":46971}," Loading states для всіх async operations",[3768,47029,47031,47033],{"className":47030},[46967],[46969,47032],{"disabled":4277,"type":46971}," Error messages зрозумілі користувачу",[3768,47035,47037,47039],{"className":47036},[46967],[46969,47038],{"disabled":4277,"type":46971}," Offline mode gracefully handled",[3768,47041,47043,47045],{"className":47042},[46967],[46969,47044],{"disabled":4277,"type":46971}," Keyboard navigation працює правильно",[3768,47047,47049,47051],{"className":47048},[46967],[46969,47050],{"disabled":4277,"type":46971}," Accessibility labels додані",[3768,47053,47055,47057],{"className":47054},[46967],[46969,47056],{"disabled":4277,"type":46971}," Dark mode підтримується",[3847,47059,2269],{"id":47060},"testing",[3878,47062,47064,47070,47076,47082,47088],{"className":47063},[46963],[3768,47065,47067,47069],{"className":47066},[46967],[46969,47068],{"disabled":4277,"type":46971}," Unit tests для tokenService",[3768,47071,47073,47075],{"className":47072},[46967],[46969,47074],{"disabled":4277,"type":46971}," Integration tests для auth flow",[3768,47077,47079,47081],{"className":47078},[46967],[46969,47080],{"disabled":4277,"type":46971}," E2E tests для login\u002Fregister",[3768,47083,47085,47087],{"className":47084},[46967],[46969,47086],{"disabled":4277,"type":46971}," Error scenarios покриті",[3768,47089,47091,47093],{"className":47090},[46967],[46969,47092],{"disabled":4277,"type":46971}," Edge cases протестовані",[3847,47095,47097],{"id":47096},"monitoring","Monitoring",[3878,47099,47101,47107,47113,47119],{"className":47100},[46963],[3768,47102,47104,47106],{"className":47103},[46967],[46969,47105],{"disabled":4277,"type":46971}," Error tracking (Sentry)",[3768,47108,47110,47112],{"className":47109},[46967],[46969,47111],{"disabled":4277,"type":46971}," Analytics (Firebase, Mixpanel)",[3768,47114,47116,47118],{"className":47115},[46967],[46969,47117],{"disabled":4277,"type":46971}," Performance monitoring",[3768,47120,47122,47124],{"className":47121},[46967],[46969,47123],{"disabled":4277,"type":46971}," Auth success\u002Ffailure metrics",[3750,47126,47128],{"id":47127},"_1113-висновки-практичної-частини","11.13. Висновки Практичної Частини",[3743,47130,47131],{},"Ми успішно реалізували повноцінну систему автентифікації в реальному React Native проєкті. Основні досягнення:",[3743,47133,47134],{},[3771,47135,47136],{},"🎯 Навчальні цілі:",[3878,47138,47139,47142,47145,47148],{},[3768,47140,47141],{},"Практичне застосування SecureStore",[3768,47143,47144],{},"Інтеграція з expo-router",[3768,47146,47147],{},"Професійна архітектура auth system",[3768,47149,47150],{},"Production-ready код",[3743,47152,47153],{},[3771,47154,47155],{},"💡 Ключові insights:",[3878,47157,47158,47161,47164,47167],{},[3768,47159,47160],{},"SecureStore API простий, але потужний",[3768,47162,47163],{},"Navigation guards спрощують захист routes",[3768,47165,47166],{},"TypeScript допомагає уникнути помилок",[3768,47168,47169],{},"Mock backend прискорює розробку",[3743,47171,47172],{},[3771,47173,47174],{},"📈 Метрики якості:",[3878,47176,47177,47180,47183,47186],{},[3768,47178,47179],{},"Code coverage: можна покрити тестами",[3768,47181,47182],{},"Type safety: 100% TypeScript",[3768,47184,47185],{},"Security: industry best practices",[3768,47187,47188],{},"UX: responsive і зрозумілий",[3743,47190,47191],{},"Тепер у вас є solid foundation для будь-якого React Native проєкту з автентифікацією! 🚀",[3811,47193],{},[3743,47195,47196],{},[3771,47197,47198],{},"Фінальний Nomad Commit:",[3857,47200,47202],{"className":4215,"code":47201,"language":4217,"meta":3865,"style":3865},"git commit -m \"feat: secure session and protected routes\"\n",[3782,47203,47204],{"__ignoreMap":3865},[3946,47205,47206,47208,47210,47212],{"class":3948,"line":3949},[3946,47207,40589],{"class":4224},[3946,47209,40611],{"class":3966},[3946,47211,40614],{"class":4255},[3946,47213,47214],{"class":3966}," \"feat: secure session and protected routes\"\n",[3743,47216,47217],{},"Цей commit представляє повноцінну feature, яка готова до review та merge в main branch. Всі файли створені, протестовані та задокументовані.",[3811,47219],{},[3738,47221,47223],{"id":47222},"розділ-12-інструкції-по-запуску","Розділ 12: Інструкції по Запуску",[3750,47225,47227],{"id":47226},"_121-quick-start-guide","12.1. Quick Start Guide",[3743,47229,47230],{},"Якщо ви хочете спробувати готовий проєкт:",[3857,47232,47234],{"className":4215,"code":47233,"language":4217,"meta":3865,"style":3865},"# 1. Clone repository\ngit clone \u003Crepository-url>\ncd nomad\n\n# 2. Install dependencies\nnpm install\n\n# 3. Start backend (Terminal 1)\nnpm run api\n\n# 4. Start Expo (Terminal 2)\nnpm start\n\n# 5. Choose platform\n# Press 'i' for iOS Simulator\n# Press 'a' for Android Emulator\n# Scan QR code for physical device\n",[3782,47235,47236,47241,47256,47263,47267,47272,47279,47283,47288,47296,47300,47305,47311,47315,47320,47325,47330],{"__ignoreMap":3865},[3946,47237,47238],{"class":3948,"line":3949},[3946,47239,47240],{"class":4342},"# 1. Clone repository\n",[3946,47242,47243,47245,47248,47250,47253],{"class":3948,"line":3956},[3946,47244,40589],{"class":4224},[3946,47246,47247],{"class":3966}," clone",[3946,47249,12589],{"class":3952},[3946,47251,47252],{"class":3966},"repository-ur",[3946,47254,47255],{"class":3952},"l>\n",[3946,47257,47258,47260],{"class":3948,"line":3973},[3946,47259,40959],{"class":4224},[3946,47261,47262],{"class":3966}," nomad\n",[3946,47264,47265],{"class":3948,"line":3986},[3946,47266,4278],{"emptyLinePlaceholder":4277},[3946,47268,47269],{"class":3948,"line":3999},[3946,47270,47271],{"class":4342},"# 2. Install dependencies\n",[3946,47273,47274,47276],{"class":3948,"line":4012},[3946,47275,18852],{"class":4224},[3946,47277,47278],{"class":3966}," install\n",[3946,47280,47281],{"class":3948,"line":4026},[3946,47282,4278],{"emptyLinePlaceholder":4277},[3946,47284,47285],{"class":3948,"line":4037},[3946,47286,47287],{"class":4342},"# 3. Start backend (Terminal 1)\n",[3946,47289,47290,47292,47294],{"class":3948,"line":4487},[3946,47291,18852],{"class":4224},[3946,47293,43715],{"class":3966},[3946,47295,43718],{"class":3966},[3946,47297,47298],{"class":3948,"line":4507},[3946,47299,4278],{"emptyLinePlaceholder":4277},[3946,47301,47302],{"class":3948,"line":4518},[3946,47303,47304],{"class":4342},"# 4. Start Expo (Terminal 2)\n",[3946,47306,47307,47309],{"class":3948,"line":4524},[3946,47308,18852],{"class":4224},[3946,47310,43734],{"class":3966},[3946,47312,47313],{"class":3948,"line":4529},[3946,47314,4278],{"emptyLinePlaceholder":4277},[3946,47316,47317],{"class":3948,"line":4534},[3946,47318,47319],{"class":4342},"# 5. Choose platform\n",[3946,47321,47322],{"class":3948,"line":4540},[3946,47323,47324],{"class":4342},"# Press 'i' for iOS Simulator\n",[3946,47326,47327],{"class":3948,"line":4567},[3946,47328,47329],{"class":4342},"# Press 'a' for Android Emulator\n",[3946,47331,47332],{"class":3948,"line":4574},[3946,47333,47334],{"class":4342},"# Scan QR code for physical device\n",[3743,47336,47337],{},[3771,47338,47339],{},"Demo credentials:",[3857,47341,47343],{"className":47342,"code":43743,"language":3862},[3860],[3782,47344,43743],{"__ignoreMap":3865},[3750,47346,47348],{"id":47347},"_122-troubleshooting","12.2. Troubleshooting",[3847,47350,47352],{"id":47351},"problem-invalid-key-provided-to-securestore-️","Problem: \"Invalid key provided to SecureStore\" ⚠️",[3743,47354,47355],{},[3771,47356,47357],{},"Error Message:",[3857,47359,47362],{"className":47360,"code":47361,"language":3862},[3860],"Error: Invalid key provided to SecureStore. Keys must not be empty and \ncontain only alphanumeric characters, \".\", \"-\", and \"_\".\n",[3782,47363,47361],{"__ignoreMap":3865},[3743,47365,47366,47369,47370,4447,47372,4447,47374,47376],{},[3771,47367,47368],{},"Причина:","\nКлюч містить заборонені символи, такі як ",[3782,47371,5129],{},[3782,47373,5132],{},[3782,47375,5135],{},", тощо.",[3743,47378,47379,47382],{},[3771,47380,47381],{},"Solution:","\nВикористовуйте лише дозволені символи:",[3857,47384,47386],{"className":4242,"code":47385,"language":4244,"meta":3865,"style":3865},"\u002F\u002F ❌ Невірно\nconst STORAGE_KEYS = {\n  TOKENS: '@nomad\u002Fauth\u002Ftokens',  \u002F\u002F Містить @ і \u002F\n};\n\n\u002F\u002F ✅ Правильно\nconst STORAGE_KEYS = {\n  TOKENS: 'nomad.auth.tokens',   \u002F\u002F Лише крапки\n  \u002F\u002F або\n  TOKENS: 'nomad-auth-tokens',   \u002F\u002F Лише дефіси\n  \u002F\u002F або\n  TOKENS: 'nomad_auth_tokens',   \u002F\u002F Лише підкреслення\n};\n",[3782,47387,47388,47393,47401,47414,47418,47422,47427,47435,47448,47453,47465,47469,47481],{"__ignoreMap":3865},[3946,47389,47390],{"class":3948,"line":3949},[3946,47391,47392],{"class":4342},"\u002F\u002F ❌ Невірно\n",[3946,47394,47395,47397,47399],{"class":3948,"line":3956},[3946,47396,4283],{"class":4255},[3946,47398,5890],{"class":4286},[3946,47400,5893],{"class":3952},[3946,47402,47403,47405,47408,47411],{"class":3948,"line":3973},[3946,47404,6861],{"class":4262},[3946,47406,47407],{"class":3966}," '@nomad\u002Fauth\u002Ftokens'",[3946,47409,47410],{"class":3952},",  ",[3946,47412,47413],{"class":4342},"\u002F\u002F Містить @ і \u002F\n",[3946,47415,47416],{"class":3948,"line":3986},[3946,47417,13477],{"class":3952},[3946,47419,47420],{"class":3948,"line":3999},[3946,47421,4278],{"emptyLinePlaceholder":4277},[3946,47423,47424],{"class":3948,"line":4012},[3946,47425,47426],{"class":4342},"\u002F\u002F ✅ Правильно\n",[3946,47428,47429,47431,47433],{"class":3948,"line":4026},[3946,47430,4283],{"class":4255},[3946,47432,5890],{"class":4286},[3946,47434,5893],{"class":3952},[3946,47436,47437,47439,47442,47445],{"class":3948,"line":4037},[3946,47438,6861],{"class":4262},[3946,47440,47441],{"class":3966}," 'nomad.auth.tokens'",[3946,47443,47444],{"class":3952},",   ",[3946,47446,47447],{"class":4342},"\u002F\u002F Лише крапки\n",[3946,47449,47450],{"class":3948,"line":4487},[3946,47451,47452],{"class":4342},"  \u002F\u002F або\n",[3946,47454,47455,47457,47460,47462],{"class":3948,"line":4507},[3946,47456,6861],{"class":4262},[3946,47458,47459],{"class":3966}," 'nomad-auth-tokens'",[3946,47461,47444],{"class":3952},[3946,47463,47464],{"class":4342},"\u002F\u002F Лише дефіси\n",[3946,47466,47467],{"class":3948,"line":4518},[3946,47468,47452],{"class":4342},[3946,47470,47471,47473,47476,47478],{"class":3948,"line":4524},[3946,47472,6861],{"class":4262},[3946,47474,47475],{"class":3966}," 'nomad_auth_tokens'",[3946,47477,47444],{"class":3952},[3946,47479,47480],{"class":4342},"\u002F\u002F Лише підкреслення\n",[3946,47482,47483],{"class":3948,"line":4529},[3946,47484,13477],{"class":3952},[3743,47486,47487],{},[3771,47488,47489],{},"Валідні символи:",[3878,47491,47492,47502,47507,47512],{},[3768,47493,47494,47495,4447,47497,4447,47499],{},"Alphanumeric: ",[3782,47496,25721],{},[3782,47498,25733],{},[3782,47500,47501],{},"0-9",[3768,47503,47504,47505],{},"Крапка: ",[3782,47506,4298],{},[3768,47508,47509,47510],{},"Дефіс: ",[3782,47511,5121],{},[3768,47513,47514,47515],{},"Підкреслення: ",[3782,47516,5125],{},[3847,47518,47520],{"id":47519},"problem-expo-secure-store-не-працює-в-expo-go","Problem: \"expo-secure-store не працює в Expo Go\"",[3743,47522,47523,47525],{},[3771,47524,47381],{},"\nSecureStore потребує native code, тому не працює в Expo Go на Android. Використайте development build:",[3857,47527,47529],{"className":4215,"code":47528,"language":4217,"meta":3865,"style":3865},"# Install expo-dev-client\nnpm install expo-dev-client\n\n# Build development version\nnpx expo run:ios\n# або\nnpx expo run:android\n",[3782,47530,47531,47536,47545,47549,47554,47563,47568],{"__ignoreMap":3865},[3946,47532,47533],{"class":3948,"line":3949},[3946,47534,47535],{"class":4342},"# Install expo-dev-client\n",[3946,47537,47538,47540,47542],{"class":3948,"line":3956},[3946,47539,18852],{"class":4224},[3946,47541,4231],{"class":3966},[3946,47543,47544],{"class":3966}," expo-dev-client\n",[3946,47546,47547],{"class":3948,"line":3973},[3946,47548,4278],{"emptyLinePlaceholder":4277},[3946,47550,47551],{"class":3948,"line":3986},[3946,47552,47553],{"class":4342},"# Build development version\n",[3946,47555,47556,47558,47560],{"class":3948,"line":3999},[3946,47557,4225],{"class":4224},[3946,47559,4228],{"class":3966},[3946,47561,47562],{"class":3966}," run:ios\n",[3946,47564,47565],{"class":3948,"line":4012},[3946,47566,47567],{"class":4342},"# або\n",[3946,47569,47570,47572,47574],{"class":3948,"line":4026},[3946,47571,4225],{"class":4224},[3946,47573,4228],{"class":3966},[3946,47575,47576],{"class":3966}," run:android\n",[3847,47578,47580],{"id":47579},"problem-cannot-connect-to-localhost3000","Problem: \"Cannot connect to localhost:3000\"",[3743,47582,47583,47585,47586,47589],{},[3771,47584,47381],{},"\nНа фізичному пристрої ",[3782,47587,47588],{},"localhost"," не працює. Використайте IP адресу:",[3857,47591,47593],{"className":4215,"code":47592,"language":4217,"meta":3865,"style":3865},"# Знайдіть вашу IP\nifconfig | grep \"inet \" | grep -v 127.0.0.1\n\n# Оновіть в authApi.ts\nconst API_BASE_URL = 'http:\u002F\u002F192.168.1.100:3000'; \u002F\u002F ваша IP\n",[3782,47594,47595,47600,47622,47626,47631],{"__ignoreMap":3865},[3946,47596,47597],{"class":3948,"line":3949},[3946,47598,47599],{"class":4342},"# Знайдіть вашу IP\n",[3946,47601,47602,47605,47607,47609,47612,47614,47616,47619],{"class":3948,"line":3956},[3946,47603,47604],{"class":4224},"ifconfig",[3946,47606,4559],{"class":3952},[3946,47608,41012],{"class":4224},[3946,47610,47611],{"class":3966}," \"inet \"",[3946,47613,4559],{"class":3952},[3946,47615,41012],{"class":4224},[3946,47617,47618],{"class":4255}," -v",[3946,47620,47621],{"class":4020}," 127.0.0.1\n",[3946,47623,47624],{"class":3948,"line":3973},[3946,47625,4278],{"emptyLinePlaceholder":4277},[3946,47627,47628],{"class":3948,"line":3986},[3946,47629,47630],{"class":4342},"# Оновіть в authApi.ts\n",[3946,47632,47633,47635,47637,47640,47643,47645,47648,47651],{"class":3948,"line":3999},[3946,47634,4283],{"class":4224},[3946,47636,8395],{"class":3966},[3946,47638,47639],{"class":3966}," =",[3946,47641,47642],{"class":3966}," 'http:\u002F\u002F192.168.1.100:3000'",[3946,47644,4851],{"class":3952},[3946,47646,47647],{"class":4224},"\u002F\u002F",[3946,47649,47650],{"class":3966}," ваша",[3946,47652,47653],{"class":3966}," IP\n",[3743,47655,47656],{},[3771,47657,47658],{},"Або використайте ngrok:",[3857,47660,47662],{"className":4215,"code":47661,"language":4217,"meta":3865,"style":3865},"# Install ngrok\nnpm install -g ngrok\n\n# Expose local server\nngrok http 3000\n\n# Use ngrok URL\nconst API_BASE_URL = 'https:\u002F\u002Fabc123.ngrok.io';\n",[3782,47663,47664,47669,47680,47684,47689,47699,47703,47708],{"__ignoreMap":3865},[3946,47665,47666],{"class":3948,"line":3949},[3946,47667,47668],{"class":4342},"# Install ngrok\n",[3946,47670,47671,47673,47675,47677],{"class":3948,"line":3956},[3946,47672,18852],{"class":4224},[3946,47674,4231],{"class":3966},[3946,47676,18857],{"class":4255},[3946,47678,47679],{"class":3966}," ngrok\n",[3946,47681,47682],{"class":3948,"line":3973},[3946,47683,4278],{"emptyLinePlaceholder":4277},[3946,47685,47686],{"class":3948,"line":3986},[3946,47687,47688],{"class":4342},"# Expose local server\n",[3946,47690,47691,47694,47697],{"class":3948,"line":3999},[3946,47692,47693],{"class":4224},"ngrok",[3946,47695,47696],{"class":3966}," http",[3946,47698,19185],{"class":4020},[3946,47700,47701],{"class":3948,"line":4012},[3946,47702,4278],{"emptyLinePlaceholder":4277},[3946,47704,47705],{"class":3948,"line":4026},[3946,47706,47707],{"class":4342},"# Use ngrok URL\n",[3946,47709,47710,47712,47714,47716,47719],{"class":3948,"line":4037},[3946,47711,4283],{"class":4224},[3946,47713,8395],{"class":3966},[3946,47715,47639],{"class":3966},[3946,47717,47718],{"class":3966}," 'https:\u002F\u002Fabc123.ngrok.io'",[3946,47720,4272],{"class":3952},[3847,47722,47724],{"id":47723},"problem-token-не-зберігається-після-перезапуску","Problem: \"Token не зберігається після перезапуску\"",[3743,47726,47727,47729],{},[3771,47728,47381],{},"\nПеревірте чи SecureStore доступний:",[3857,47731,47733],{"className":4242,"code":47732,"language":4244,"meta":3865,"style":3865},"const isAvailable = await SecureStore.isAvailableAsync();\nconsole.log('SecureStore available:', isAvailable);\n",[3782,47734,47735,47753],{"__ignoreMap":3865},[3946,47736,47737,47739,47741,47743,47745,47747,47749,47751],{"class":3948,"line":3949},[3946,47738,4283],{"class":4255},[3946,47740,4287],{"class":4286},[3946,47742,4290],{"class":3952},[3946,47744,4293],{"class":4251},[3946,47746,4263],{"class":4262},[3946,47748,4298],{"class":3952},[3946,47750,4301],{"class":4224},[3946,47752,4304],{"class":3952},[3946,47754,47755,47757,47759,47761,47763,47766,47768,47770],{"class":3948,"line":3956},[3946,47756,36794],{"class":4262},[3946,47758,4298],{"class":3952},[3946,47760,4461],{"class":4224},[3946,47762,4331],{"class":3952},[3946,47764,47765],{"class":3966},"'SecureStore available:'",[3946,47767,4447],{"class":3952},[3946,47769,4315],{"class":4262},[3946,47771,4337],{"class":3952},[3743,47773,47774,47775,47777],{},"Якщо ",[3782,47776,13575],{}," — використайте AsyncStorage як fallback:",[3857,47779,47781],{"className":4242,"code":47780,"language":4244,"meta":3865,"style":3865},"import AsyncStorage from '@react-native-async-storage\u002Fasync-storage';\n\nasync saveTokens(\u002F*...*\u002F) {\n  const isSecureAvailable = await SecureStore.isAvailableAsync();\n  \n  if (isSecureAvailable) {\n    await SecureStore.setItemAsync(\u002F*...*\u002F);\n  } else {\n    await AsyncStorage.setItem(\u002F*...*\u002F);\n  }\n}\n",[3782,47782,47783,47797,47801,47813,47832,47836,47847,47863,47871,47888,47892],{"__ignoreMap":3865},[3946,47784,47785,47787,47790,47792,47795],{"class":3948,"line":3949},[3946,47786,4252],{"class":4251},[3946,47788,47789],{"class":4262}," AsyncStorage",[3946,47791,4266],{"class":4251},[3946,47793,47794],{"class":3966}," '@react-native-async-storage\u002Fasync-storage'",[3946,47796,4272],{"class":3952},[3946,47798,47799],{"class":3948,"line":3956},[3946,47800,4278],{"emptyLinePlaceholder":4277},[3946,47802,47803,47805,47807,47809,47811],{"class":3948,"line":3973},[3946,47804,4387],{"class":4262},[3946,47806,6926],{"class":4224},[3946,47808,4331],{"class":3952},[3946,47810,42182],{"class":4342},[3946,47812,4318],{"class":3952},[3946,47814,47815,47817,47820,47822,47824,47826,47828,47830],{"class":3948,"line":3986},[3946,47816,5018],{"class":4255},[3946,47818,47819],{"class":4286}," isSecureAvailable",[3946,47821,4290],{"class":3952},[3946,47823,4293],{"class":4251},[3946,47825,4263],{"class":4262},[3946,47827,4298],{"class":3952},[3946,47829,4301],{"class":4224},[3946,47831,4304],{"class":3952},[3946,47833,47834],{"class":3948,"line":3999},[3946,47835,5795],{"class":3952},[3946,47837,47838,47840,47842,47845],{"class":3948,"line":4012},[3946,47839,5776],{"class":4251},[3946,47841,4479],{"class":3952},[3946,47843,47844],{"class":4262},"isSecureAvailable",[3946,47846,4318],{"class":3952},[3946,47848,47849,47851,47853,47855,47857,47859,47861],{"class":3948,"line":4026},[3946,47850,4432],{"class":4251},[3946,47852,4263],{"class":4262},[3946,47854,4298],{"class":3952},[3946,47856,4439],{"class":4224},[3946,47858,4331],{"class":3952},[3946,47860,42182],{"class":4342},[3946,47862,4337],{"class":3952},[3946,47864,47865,47867,47869],{"class":3948,"line":4037},[3946,47866,4473],{"class":3952},[3946,47868,23192],{"class":4251},[3946,47870,4427],{"class":3952},[3946,47872,47873,47875,47877,47879,47882,47884,47886],{"class":3948,"line":4487},[3946,47874,4432],{"class":4251},[3946,47876,47789],{"class":4262},[3946,47878,4298],{"class":3952},[3946,47880,47881],{"class":4224},"setItem",[3946,47883,4331],{"class":3952},[3946,47885,42182],{"class":4342},[3946,47887,4337],{"class":3952},[3946,47889,47890],{"class":3948,"line":4507},[3946,47891,4521],{"class":3952},[3946,47893,47894],{"class":3948,"line":4518},[3946,47895,4040],{"class":3952},[3847,47897,47899],{"id":47898},"problem-logout-не-редірект-на-login","Problem: \"Logout не редірект на login\"",[3743,47901,47902,47904,47905,47907,47908,8545],{},[3771,47903,47381],{},"\nПеревірте ",[3782,47906,16318],{}," в ",[3782,47909,47910],{},"_layout.tsx",[3857,47912,47914],{"className":4242,"code":47913,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Debug logs\nuseEffect(() => {\n  console.log('Auth state:', { isAuthenticated, isLoading, segments });\n}, [isAuthenticated, isLoading, segments]);\n",[3782,47915,47916,47921,47931,47958],{"__ignoreMap":3865},[3946,47917,47918],{"class":3948,"line":3949},[3946,47919,47920],{"class":4342},"\u002F\u002F Debug logs\n",[3946,47922,47923,47925,47927,47929],{"class":3948,"line":3956},[3946,47924,15953],{"class":4224},[3946,47926,10707],{"class":3952},[3946,47928,6453],{"class":4255},[3946,47930,4427],{"class":3952},[3946,47932,47933,47935,47937,47939,47941,47944,47946,47948,47950,47952,47954,47956],{"class":3948,"line":3973},[3946,47934,4323],{"class":4262},[3946,47936,4298],{"class":3952},[3946,47938,4461],{"class":4224},[3946,47940,4331],{"class":3952},[3946,47942,47943],{"class":3966},"'Auth state:'",[3946,47945,8290],{"class":3952},[3946,47947,13041],{"class":4262},[3946,47949,4447],{"class":3952},[3946,47951,13046],{"class":4262},[3946,47953,4447],{"class":3952},[3946,47955,43891],{"class":4262},[3946,47957,10726],{"class":3952},[3946,47959,47960,47962,47964,47966,47968,47970,47972],{"class":3948,"line":3986},[3946,47961,39907],{"class":3952},[3946,47963,13041],{"class":4262},[3946,47965,4447],{"class":3952},[3946,47967,13046],{"class":4262},[3946,47969,4447],{"class":3952},[3946,47971,43891],{"class":4262},[3946,47973,10737],{"class":3952},[3750,47975,47977],{"id":47976},"_123-environment-configuration","12.3. Environment Configuration",[3743,47979,47980],{},"Для різних середовищ (dev, staging, production) створіть config:",[3857,47982,47984],{"className":4242,"code":47983,"language":4244,"meta":3865,"style":3865},"\u002F\u002F src\u002Fconfig\u002Fenv.ts\nimport Constants from 'expo-constants';\n\nconst ENV = {\n  dev: {\n    apiUrl: 'http:\u002F\u002Flocalhost:3000',\n  },\n  staging: {\n    apiUrl: 'https:\u002F\u002Fstaging-api.nomad.com',\n  },\n  prod: {\n    apiUrl: 'https:\u002F\u002Fapi.nomad.com',\n  },\n};\n\nfunction getEnvVars() {\n  const env = Constants.expoConfig?.extra?.environment || 'dev';\n  return ENV[env];\n}\n\nexport default getEnvVars();\n",[3782,47985,47986,47991,48003,48007,48016,48023,48032,48036,48043,48052,48056,48063,48072,48076,48080,48084,48093,48124,48136,48140,48144],{"__ignoreMap":3865},[3946,47987,47988],{"class":3948,"line":3949},[3946,47989,47990],{"class":4342},"\u002F\u002F src\u002Fconfig\u002Fenv.ts\n",[3946,47992,47993,47995,47997,47999,48001],{"class":3948,"line":3956},[3946,47994,4252],{"class":4251},[3946,47996,40055],{"class":4262},[3946,47998,4266],{"class":4251},[3946,48000,40060],{"class":3966},[3946,48002,4272],{"class":3952},[3946,48004,48005],{"class":3948,"line":3973},[3946,48006,4278],{"emptyLinePlaceholder":4277},[3946,48008,48009,48011,48014],{"class":3948,"line":3986},[3946,48010,4283],{"class":4255},[3946,48012,48013],{"class":4286}," ENV",[3946,48015,5893],{"class":3952},[3946,48017,48018,48021],{"class":3948,"line":3999},[3946,48019,48020],{"class":4262},"  dev:",[3946,48022,4427],{"class":3952},[3946,48024,48025,48028,48030],{"class":3948,"line":4012},[3946,48026,48027],{"class":4262},"    apiUrl:",[3946,48029,41708],{"class":3966},[3946,48031,3970],{"class":3952},[3946,48033,48034],{"class":3948,"line":4026},[3946,48035,13271],{"class":3952},[3946,48037,48038,48041],{"class":3948,"line":4037},[3946,48039,48040],{"class":4262},"  staging:",[3946,48042,4427],{"class":3952},[3946,48044,48045,48047,48050],{"class":3948,"line":4487},[3946,48046,48027],{"class":4262},[3946,48048,48049],{"class":3966}," 'https:\u002F\u002Fstaging-api.nomad.com'",[3946,48051,3970],{"class":3952},[3946,48053,48054],{"class":3948,"line":4507},[3946,48055,13271],{"class":3952},[3946,48057,48058,48061],{"class":3948,"line":4518},[3946,48059,48060],{"class":4262},"  prod:",[3946,48062,4427],{"class":3952},[3946,48064,48065,48067,48070],{"class":3948,"line":4524},[3946,48066,48027],{"class":4262},[3946,48068,48069],{"class":3966}," 'https:\u002F\u002Fapi.nomad.com'",[3946,48071,3970],{"class":3952},[3946,48073,48074],{"class":3948,"line":4529},[3946,48075,13271],{"class":3952},[3946,48077,48078],{"class":3948,"line":4534},[3946,48079,13477],{"class":3952},[3946,48081,48082],{"class":3948,"line":4540},[3946,48083,4278],{"emptyLinePlaceholder":4277},[3946,48085,48086,48088,48091],{"class":3948,"line":4567},[3946,48087,14029],{"class":4255},[3946,48089,48090],{"class":4224}," getEnvVars",[3946,48092,8490],{"class":3952},[3946,48094,48095,48097,48100,48102,48104,48106,48108,48110,48112,48114,48117,48119,48122],{"class":3948,"line":4574},[3946,48096,5018],{"class":4255},[3946,48098,48099],{"class":4286}," env",[3946,48101,4290],{"class":3952},[3946,48103,40077],{"class":4262},[3946,48105,4298],{"class":3952},[3946,48107,40082],{"class":4262},[3946,48109,7539],{"class":3952},[3946,48111,40087],{"class":4262},[3946,48113,7539],{"class":3952},[3946,48115,48116],{"class":4262},"environment",[3946,48118,9745],{"class":3952},[3946,48120,48121],{"class":3966},"'dev'",[3946,48123,4272],{"class":3952},[3946,48125,48126,48128,48130,48132,48134],{"class":3948,"line":4600},[3946,48127,5062],{"class":4251},[3946,48129,48013],{"class":4286},[3946,48131,19575],{"class":3952},[3946,48133,39995],{"class":4262},[3946,48135,19416],{"class":3952},[3946,48137,48138],{"class":3948,"line":4610},[3946,48139,4040],{"class":3952},[3946,48141,48142],{"class":3948,"line":4623},[3946,48143,4278],{"emptyLinePlaceholder":4277},[3946,48145,48146,48148,48150,48152],{"class":3948,"line":4643},[3946,48147,6030],{"class":4251},[3946,48149,39938],{"class":4251},[3946,48151,48090],{"class":4224},[3946,48153,4304],{"class":3952},[3743,48155,48156],{},[3771,48157,48158],{},"app.json:",[3857,48160,48162],{"className":3940,"code":48161,"language":3942,"meta":3865,"style":3865},"{\n  \"expo\": {\n    \"extra\": {\n      \"environment\": \"dev\"\n    }\n  }\n}\n",[3782,48163,48164,48168,48174,48181,48191,48195,48199],{"__ignoreMap":3865},[3946,48165,48166],{"class":3948,"line":3949},[3946,48167,3953],{"class":3952},[3946,48169,48170,48172],{"class":3948,"line":3956},[3946,48171,41059],{"class":3959},[3946,48173,41062],{"class":3952},[3946,48175,48176,48179],{"class":3948,"line":3973},[3946,48177,48178],{"class":3959},"    \"extra\"",[3946,48180,41062],{"class":3952},[3946,48182,48183,48186,48188],{"class":3948,"line":3986},[3946,48184,48185],{"class":3959},"      \"environment\"",[3946,48187,3963],{"class":3952},[3946,48189,48190],{"class":3966},"\"dev\"\n",[3946,48192,48193],{"class":3948,"line":3999},[3946,48194,5550],{"class":3952},[3946,48196,48197],{"class":3948,"line":4012},[3946,48198,4521],{"class":3952},[3946,48200,48201],{"class":3948,"line":4026},[3946,48202,4040],{"class":3952},[3743,48204,48205],{},[3771,48206,15806],{},[3857,48208,48210],{"className":4242,"code":48209,"language":4244,"meta":3865,"style":3865},"import ENV from '@\u002Fconfig\u002Fenv';\n\nconst API_BASE_URL = ENV.apiUrl;\n",[3782,48211,48212,48225,48229],{"__ignoreMap":3865},[3946,48213,48214,48216,48218,48220,48223],{"class":3948,"line":3949},[3946,48215,4252],{"class":4251},[3946,48217,48013],{"class":4262},[3946,48219,4266],{"class":4251},[3946,48221,48222],{"class":3966}," '@\u002Fconfig\u002Fenv'",[3946,48224,4272],{"class":3952},[3946,48226,48227],{"class":3948,"line":3956},[3946,48228,4278],{"emptyLinePlaceholder":4277},[3946,48230,48231,48233,48235,48237,48240,48242,48244],{"class":3948,"line":3973},[3946,48232,4283],{"class":4255},[3946,48234,8395],{"class":4286},[3946,48236,4290],{"class":3952},[3946,48238,48239],{"class":4286},"ENV",[3946,48241,4298],{"class":3952},[3946,48243,40092],{"class":4262},[3946,48245,4272],{"class":3952},[3750,48247,48249],{"id":48248},"_124-testing-instructions","12.4. Testing Instructions",[3847,48251,48253],{"id":48252},"manual-testing-checklist","Manual Testing Checklist",[3743,48255,48256],{},[3771,48257,48258],{},"Happy Path:",[3878,48260,48262,48268,48274,48280,48286,48292],{"className":48261},[46963],[3768,48263,48265,48267],{"className":48264},[46967],[46969,48266],{"disabled":4277,"type":46971}," Login з правильними credentials працює",[3768,48269,48271,48273],{"className":48270},[46967],[46969,48272],{"disabled":4277,"type":46971}," Register створює нового користувача",[3768,48275,48277,48279],{"className":48276},[46967],[46969,48278],{"disabled":4277,"type":46971}," Logout очищає токени і редірект на login",[3768,48281,48283,48285],{"className":48282},[46967],[46969,48284],{"disabled":4277,"type":46971}," Session restore після restart додатку",[3768,48287,48289,48291],{"className":48288},[46967],[46969,48290],{"disabled":4277,"type":46971}," Protected routes недоступні без auth",[3768,48293,48295,48297],{"className":48294},[46967],[46969,48296],{"disabled":4277,"type":46971}," Profile показує правильні user дані",[3743,48299,48300],{},[3771,48301,48302],{},"Error Scenarios:",[3878,48304,48306,48312,48318,48324,48330],{"className":48305},[46963],[3768,48307,48309,48311],{"className":48308},[46967],[46969,48310],{"disabled":4277,"type":46971}," Login з невірним password показує error",[3768,48313,48315,48317],{"className":48314},[46967],[46969,48316],{"disabled":4277,"type":46971}," Login з неіснуючим email показує error",[3768,48319,48321,48323],{"className":48320},[46967],[46969,48322],{"disabled":4277,"type":46971}," Register з існуючим email показує error",[3768,48325,48327,48329],{"className":48326},[46967],[46969,48328],{"disabled":4277,"type":46971}," Network error показує зрозуміле повідомлення",[3768,48331,48333,48335],{"className":48332},[46967],[46969,48334],{"disabled":4277,"type":46971}," Закінчений token автоматично logout",[3743,48337,48338],{},[3771,48339,48340],{},"Edge Cases:",[3878,48342,48344,48350,48356,48362,48368],{"className":48343},[46963],[3768,48345,48347,48349],{"className":48346},[46967],[46969,48348],{"disabled":4277,"type":46971}," Швидке переключення між screens",[3768,48351,48353,48355],{"className":48352},[46967],[46969,48354],{"disabled":4277,"type":46971}," Background\u002Fforeground transitions",[3768,48357,48359,48361],{"className":48358},[46967],[46969,48360],{"disabled":4277,"type":46971}," Airplane mode behavior",[3768,48363,48365,48367],{"className":48364},[46967],[46969,48366],{"disabled":4277,"type":46971}," Low battery mode",[3768,48369,48371,48373],{"className":48370},[46967],[46969,48372],{"disabled":4277,"type":46971}," Memory pressure scenarios",[3847,48375,48377],{"id":48376},"automated-testing","Automated Testing",[3743,48379,48380],{},[3771,48381,48382],{},"Unit Tests:",[3857,48384,48386],{"className":4215,"code":48385,"language":4217,"meta":3865,"style":3865},"# Install testing dependencies\nnpm install --save-dev @testing-library\u002Freact-native jest\n\n# Run tests\nnpm test\n",[3782,48387,48388,48393,48407,48411,48416],{"__ignoreMap":3865},[3946,48389,48390],{"class":3948,"line":3949},[3946,48391,48392],{"class":4342},"# Install testing dependencies\n",[3946,48394,48395,48397,48399,48401,48404],{"class":3948,"line":3956},[3946,48396,18852],{"class":4224},[3946,48398,4231],{"class":3966},[3946,48400,18869],{"class":4255},[3946,48402,48403],{"class":3966}," @testing-library\u002Freact-native",[3946,48405,48406],{"class":3966}," jest\n",[3946,48408,48409],{"class":3948,"line":3973},[3946,48410,4278],{"emptyLinePlaceholder":4277},[3946,48412,48413],{"class":3948,"line":3986},[3946,48414,48415],{"class":4342},"# Run tests\n",[3946,48417,48418,48420],{"class":3948,"line":3999},[3946,48419,18852],{"class":4224},[3946,48421,48422],{"class":3966}," test\n",[3743,48424,48425],{},[3771,48426,48427],{},"Example test:",[3857,48429,48431],{"className":4242,"code":48430,"language":4244,"meta":3865,"style":3865},"\u002F\u002F tokenService.test.ts\nimport { tokenService } from '@\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService';\nimport * as SecureStore from 'expo-secure-store';\n\njest.mock('expo-secure-store');\n\ndescribe('TokenService', () => {\n  it('should save tokens to SecureStore', async () => {\n    await tokenService.saveTokens('access', 'refresh', 3600);\n    \n    expect(SecureStore.setItemAsync).toHaveBeenCalledWith(\n      'nomad.auth.tokens',\n      expect.any(String)\n    );\n  });\n\n  it('should return null for expired tokens', async () => {\n    (SecureStore.getItemAsync as jest.Mock).mockResolvedValue(\n      JSON.stringify({\n        accessToken: 'token',\n        refreshToken: 'refresh',\n        expiresAt: Date.now() - 1000, \u002F\u002F Expired\n      })\n    );\n\n    const isValid = await tokenService.isTokenValid();\n    expect(isValid).toBe(false);\n  });\n});\n",[3782,48432,48433,48437,48454,48470,48474,48488,48492,48506,48524,48550,48554,48572,48579,48594,48598,48602,48606,48625,48649,48660,48669,48678,48697,48702,48706,48710,48728,48746,48750],{"__ignoreMap":3865},[3946,48434,48435],{"class":3948,"line":3949},[3946,48436,38422],{"class":4342},[3946,48438,48439,48441,48443,48445,48447,48449,48452],{"class":3948,"line":3956},[3946,48440,4252],{"class":4251},[3946,48442,6817],{"class":3952},[3946,48444,8362],{"class":4262},[3946,48446,6823],{"class":3952},[3946,48448,6826],{"class":4251},[3946,48450,48451],{"class":3966}," '@\u002Ffeatures\u002Fauth\u002Fservices\u002FtokenService'",[3946,48453,4272],{"class":3952},[3946,48455,48456,48458,48460,48462,48464,48466,48468],{"class":3948,"line":3973},[3946,48457,4252],{"class":4251},[3946,48459,4256],{"class":4255},[3946,48461,4259],{"class":4251},[3946,48463,4263],{"class":4262},[3946,48465,4266],{"class":4251},[3946,48467,4269],{"class":3966},[3946,48469,4272],{"class":3952},[3946,48471,48472],{"class":3948,"line":3986},[3946,48473,4278],{"emptyLinePlaceholder":4277},[3946,48475,48476,48478,48480,48482,48484,48486],{"class":3948,"line":3999},[3946,48477,38463],{"class":4262},[3946,48479,4298],{"class":3952},[3946,48481,38468],{"class":4224},[3946,48483,4331],{"class":3952},[3946,48485,38473],{"class":3966},[3946,48487,4337],{"class":3952},[3946,48489,48490],{"class":3948,"line":4012},[3946,48491,4278],{"emptyLinePlaceholder":4277},[3946,48493,48494,48496,48498,48500,48502,48504],{"class":3948,"line":4026},[3946,48495,38484],{"class":4224},[3946,48497,4331],{"class":3952},[3946,48499,38489],{"class":3966},[3946,48501,21200],{"class":3952},[3946,48503,6453],{"class":4255},[3946,48505,4427],{"class":3952},[3946,48507,48508,48510,48512,48514,48516,48518,48520,48522],{"class":3948,"line":4037},[3946,48509,39147],{"class":4224},[3946,48511,4331],{"class":3952},[3946,48513,38552],{"class":3966},[3946,48515,4447],{"class":3952},[3946,48517,4387],{"class":4255},[3946,48519,11004],{"class":3952},[3946,48521,6453],{"class":4255},[3946,48523,4427],{"class":3952},[3946,48525,48526,48528,48530,48532,48534,48536,48539,48541,48544,48546,48548],{"class":3948,"line":4487},[3946,48527,4432],{"class":4251},[3946,48529,8213],{"class":4262},[3946,48531,4298],{"class":3952},[3946,48533,7869],{"class":4224},[3946,48535,4331],{"class":3952},[3946,48537,48538],{"class":3966},"'access'",[3946,48540,4447],{"class":3952},[3946,48542,48543],{"class":3966},"'refresh'",[3946,48545,4447],{"class":3952},[3946,48547,37064],{"class":4020},[3946,48549,4337],{"class":3952},[3946,48551,48552],{"class":3948,"line":4507},[3946,48553,7612],{"class":3952},[3946,48555,48556,48558,48560,48562,48564,48566,48568,48570],{"class":3948,"line":4518},[3946,48557,39596],{"class":4224},[3946,48559,4331],{"class":3952},[3946,48561,38643],{"class":4262},[3946,48563,4298],{"class":3952},[3946,48565,4439],{"class":4262},[3946,48567,19644],{"class":3952},[3946,48569,38652],{"class":4224},[3946,48571,6594],{"class":3952},[3946,48573,48574,48577],{"class":3948,"line":4524},[3946,48575,48576],{"class":3966},"      'nomad.auth.tokens'",[3946,48578,3970],{"class":3952},[3946,48580,48581,48583,48585,48587,48589,48592],{"class":3948,"line":4529},[3946,48582,38638],{"class":4262},[3946,48584,4298],{"class":3952},[3946,48586,19694],{"class":4224},[3946,48588,4331],{"class":3952},[3946,48590,48591],{"class":4262},"String",[3946,48593,8726],{"class":3952},[3946,48595,48596],{"class":3948,"line":4534},[3946,48597,8731],{"class":3952},[3946,48599,48600],{"class":3948,"line":4540},[3946,48601,4977],{"class":3952},[3946,48603,48604],{"class":3948,"line":4567},[3946,48605,4278],{"emptyLinePlaceholder":4277},[3946,48607,48608,48610,48612,48615,48617,48619,48621,48623],{"class":3948,"line":4574},[3946,48609,39147],{"class":4224},[3946,48611,4331],{"class":3952},[3946,48613,48614],{"class":3966},"'should return null for expired tokens'",[3946,48616,4447],{"class":3952},[3946,48618,4387],{"class":4255},[3946,48620,11004],{"class":3952},[3946,48622,6453],{"class":4255},[3946,48624,4427],{"class":3952},[3946,48626,48627,48629,48631,48633,48635,48637,48639,48641,48643,48645,48647],{"class":3948,"line":4600},[3946,48628,10772],{"class":3952},[3946,48630,38643],{"class":4262},[3946,48632,4298],{"class":3952},[3946,48634,4591],{"class":4262},[3946,48636,4259],{"class":4251},[3946,48638,38771],{"class":4403},[3946,48640,4298],{"class":3952},[3946,48642,38776],{"class":4403},[3946,48644,19644],{"class":3952},[3946,48646,38781],{"class":4224},[3946,48648,6594],{"class":3952},[3946,48650,48651,48654,48656,48658],{"class":3948,"line":4610},[3946,48652,48653],{"class":4286},"      JSON",[3946,48655,4298],{"class":3952},[3946,48657,5690],{"class":4224},[3946,48659,8512],{"class":3952},[3946,48661,48662,48665,48667],{"class":3948,"line":4623},[3946,48663,48664],{"class":4262},"        accessToken:",[3946,48666,38802],{"class":3966},[3946,48668,3970],{"class":3952},[3946,48670,48671,48674,48676],{"class":3948,"line":4643},[3946,48672,48673],{"class":4262},"        refreshToken:",[3946,48675,38812],{"class":3966},[3946,48677,3970],{"class":3952},[3946,48679,48680,48682,48684,48686,48688,48690,48692,48694],{"class":3948,"line":4653},[3946,48681,7012],{"class":4262},[3946,48683,7015],{"class":4262},[3946,48685,4298],{"class":3952},[3946,48687,7020],{"class":4224},[3946,48689,38918],{"class":3952},[3946,48691,7032],{"class":4020},[3946,48693,4447],{"class":3952},[3946,48695,48696],{"class":4342},"\u002F\u002F Expired\n",[3946,48698,48699],{"class":3948,"line":4658},[3946,48700,48701],{"class":3952},"      })\n",[3946,48703,48704],{"class":3948,"line":4663},[3946,48705,8731],{"class":3952},[3946,48707,48708],{"class":3948,"line":4668},[3946,48709,4278],{"emptyLinePlaceholder":4277},[3946,48711,48712,48714,48716,48718,48720,48722,48724,48726],{"class":3948,"line":4674},[3946,48713,4577],{"class":4255},[3946,48715,7649],{"class":4286},[3946,48717,4290],{"class":3952},[3946,48719,4293],{"class":4251},[3946,48721,8213],{"class":4262},[3946,48723,4298],{"class":3952},[3946,48725,11127],{"class":4224},[3946,48727,4304],{"class":3952},[3946,48729,48730,48732,48734,48736,48738,48740,48742,48744],{"class":3948,"line":4694},[3946,48731,39596],{"class":4224},[3946,48733,4331],{"class":3952},[3946,48735,7689],{"class":4262},[3946,48737,19644],{"class":3952},[3946,48739,38867],{"class":4224},[3946,48741,4331],{"class":3952},[3946,48743,13575],{"class":4255},[3946,48745,4337],{"class":3952},[3946,48747,48748],{"class":3948,"line":4701},[3946,48749,4977],{"class":3952},[3946,48751,48752],{"class":3948,"line":4719},[3946,48753,13276],{"class":3952},[3750,48755,48757],{"id":48756},"_125-performance-optimization","12.5. Performance Optimization",[3847,48759,48761],{"id":48760},"lazy-loading-auth-screens","Lazy Loading Auth Screens",[3857,48763,48765],{"className":4242,"code":48764,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F(auth)\u002F_layout.tsx\nimport React, { lazy, Suspense } from 'react';\n\nconst LoginScreen = lazy(() => import('.\u002Flogin'));\nconst RegisterScreen = lazy(() => import('.\u002Fregister'));\n\nexport default function AuthLayout() {\n  return (\n    \u003CSuspense fallback={\u003CLoadingScreen \u002F>}>\n      \u003CStack>\n        \u003CStack.Screen name=\"login\" component={LoginScreen} \u002F>\n        \u003CStack.Screen name=\"register\" component={RegisterScreen} \u002F>\n      \u003C\u002FStack>\n    \u003C\u002FSuspense>\n  );\n}\n",[3782,48766,48767,48771,48794,48798,48821,48844,48848,48860,48866,48878,48886,48910,48934,48942,48950,48954],{"__ignoreMap":3865},[3946,48768,48769],{"class":3948,"line":3949},[3946,48770,44196],{"class":4342},[3946,48772,48773,48775,48777,48779,48781,48783,48786,48788,48790,48792],{"class":3948,"line":3956},[3946,48774,4252],{"class":4251},[3946,48776,10244],{"class":4262},[3946,48778,8290],{"class":3952},[3946,48780,39675],{"class":4262},[3946,48782,4447],{"class":3952},[3946,48784,48785],{"class":4262},"Suspense",[3946,48787,6823],{"class":3952},[3946,48789,6826],{"class":4251},[3946,48791,10304],{"class":3966},[3946,48793,4272],{"class":3952},[3946,48795,48796],{"class":3948,"line":3973},[3946,48797,4278],{"emptyLinePlaceholder":4277},[3946,48799,48800,48802,48804,48806,48808,48810,48812,48814,48816,48819],{"class":3948,"line":3986},[3946,48801,4283],{"class":4255},[3946,48803,22928],{"class":4286},[3946,48805,4290],{"class":3952},[3946,48807,39675],{"class":4224},[3946,48809,10707],{"class":3952},[3946,48811,6453],{"class":4255},[3946,48813,39682],{"class":4255},[3946,48815,4331],{"class":3952},[3946,48817,48818],{"class":3966},"'.\u002Flogin'",[3946,48820,29083],{"class":3952},[3946,48822,48823,48825,48827,48829,48831,48833,48835,48837,48839,48842],{"class":3948,"line":3999},[3946,48824,4283],{"class":4255},[3946,48826,24998],{"class":4286},[3946,48828,4290],{"class":3952},[3946,48830,39675],{"class":4224},[3946,48832,10707],{"class":3952},[3946,48834,6453],{"class":4255},[3946,48836,39682],{"class":4255},[3946,48838,4331],{"class":3952},[3946,48840,48841],{"class":3966},"'.\u002Fregister'",[3946,48843,29083],{"class":3952},[3946,48845,48846],{"class":3948,"line":4012},[3946,48847,4278],{"emptyLinePlaceholder":4277},[3946,48849,48850,48852,48854,48856,48858],{"class":3948,"line":4026},[3946,48851,6030],{"class":4251},[3946,48853,39938],{"class":4251},[3946,48855,4390],{"class":4255},[3946,48857,44207],{"class":4224},[3946,48859,8490],{"class":3952},[3946,48861,48862,48864],{"class":3948,"line":4037},[3946,48863,5062],{"class":4251},[3946,48865,13079],{"class":3952},[3946,48867,48868,48870,48872,48875],{"class":3948,"line":4487},[3946,48869,13158],{"class":3952},[3946,48871,48785],{"class":4262},[3946,48873,48874],{"class":4262}," fallback",[3946,48876,48877],{"class":3952},"={\u003CLoadingScreen \u002F>}>\n",[3946,48879,48880,48882,48884],{"class":3948,"line":4507},[3946,48881,13084],{"class":3952},[3946,48883,13541],{"class":4403},[3946,48885,13135],{"class":3952},[3946,48887,48888,48890,48892,48894,48896,48898,48900,48902,48904,48906,48908],{"class":3948,"line":4518},[3946,48889,13103],{"class":3952},[3946,48891,13541],{"class":4262},[3946,48893,4298],{"class":3952},[3946,48895,13613],{"class":4262},[3946,48897,13616],{"class":4262},[3946,48899,13111],{"class":3952},[3946,48901,44252],{"class":3966},[3946,48903,13624],{"class":4262},[3946,48905,12602],{"class":3952},[3946,48907,13366],{"class":4262},[3946,48909,13631],{"class":3952},[3946,48911,48912,48914,48916,48918,48920,48922,48924,48926,48928,48930,48932],{"class":3948,"line":4524},[3946,48913,13103],{"class":3952},[3946,48915,13541],{"class":4262},[3946,48917,4298],{"class":3952},[3946,48919,13613],{"class":4262},[3946,48921,13616],{"class":4262},[3946,48923,13111],{"class":3952},[3946,48925,44271],{"class":3966},[3946,48927,13624],{"class":4262},[3946,48929,12602],{"class":3952},[3946,48931,13384],{"class":4262},[3946,48933,13631],{"class":3952},[3946,48935,48936,48938,48940],{"class":3948,"line":4529},[3946,48937,13130],{"class":3952},[3946,48939,13541],{"class":4262},[3946,48941,13135],{"class":3952},[3946,48943,48944,48946,48948],{"class":3948,"line":4534},[3946,48945,13187],{"class":3952},[3946,48947,48785],{"class":4262},[3946,48949,13135],{"class":3952},[3946,48951,48952],{"class":3948,"line":4540},[3946,48953,10875],{"class":3952},[3946,48955,48956],{"class":3948,"line":4567},[3946,48957,4040],{"class":3952},[3847,48959,48961],{"id":48960},"memoization","Memoization",[3857,48963,48965],{"className":4242,"code":48964,"language":4244,"meta":3865,"style":3865},"\u002F\u002F AuthContext.tsx\nconst value = useMemo\u003CAuthContextValue>(\n  () => ({\n    ...state,\n    login,\n    register,\n    logout,\n    clearError,\n  }),\n  [state, login, register, logout, clearError]\n);\n",[3782,48966,48967,48972,48988,48996,49004,49010,49017,49023,49029,49033,49057],{"__ignoreMap":3865},[3946,48968,48969],{"class":3948,"line":3949},[3946,48970,48971],{"class":4342},"\u002F\u002F AuthContext.tsx\n",[3946,48973,48974,48976,48978,48980,48982,48984,48986],{"class":3948,"line":3956},[3946,48975,4283],{"class":4255},[3946,48977,12462],{"class":4286},[3946,48979,4290],{"class":3952},[3946,48981,12467],{"class":4224},[3946,48983,4413],{"class":3952},[3946,48985,10424],{"class":4403},[3946,48987,8967],{"class":3952},[3946,48989,48990,48992,48994],{"class":3948,"line":3973},[3946,48991,39724],{"class":3952},[3946,48993,6453],{"class":4255},[3946,48995,12484],{"class":3952},[3946,48997,48998,49000,49002],{"class":3948,"line":3986},[3946,48999,39733],{"class":3952},[3946,49001,10532],{"class":4262},[3946,49003,3970],{"class":3952},[3946,49005,49006,49008],{"class":3948,"line":3999},[3946,49007,39742],{"class":4262},[3946,49009,3970],{"class":3952},[3946,49011,49012,49015],{"class":3948,"line":4012},[3946,49013,49014],{"class":4262},"    register",[3946,49016,3970],{"class":3952},[3946,49018,49019,49021],{"class":3948,"line":4026},[3946,49020,39749],{"class":4262},[3946,49022,3970],{"class":3952},[3946,49024,49025,49027],{"class":3948,"line":4037},[3946,49026,23449],{"class":4262},[3946,49028,3970],{"class":3952},[3946,49030,49031],{"class":3948,"line":4487},[3946,49032,39761],{"class":3952},[3946,49034,49035,49037,49039,49041,49043,49045,49047,49049,49051,49053,49055],{"class":3948,"line":4507},[3946,49036,39766],{"class":3952},[3946,49038,10532],{"class":4262},[3946,49040,4447],{"class":3952},[3946,49042,11402],{"class":4262},[3946,49044,4447],{"class":3952},[3946,49046,11702],{"class":4262},[3946,49048,4447],{"class":3952},[3946,49050,11981],{"class":4262},[3946,49052,4447],{"class":3952},[3946,49054,12569],{"class":4262},[3946,49056,10870],{"class":3952},[3946,49058,49059],{"class":3948,"line":4518},[3946,49060,4337],{"class":3952},[3847,49062,49064],{"id":49063},"debounce-api-calls","Debounce API Calls",[3857,49066,49068],{"className":4242,"code":49067,"language":4244,"meta":3865,"style":3865},"import { useDebounce } from 'use-debounce';\n\nconst [email, setEmail] = useState('');\nconst [debouncedEmail] = useDebounce(email, 500);\n\nuseEffect(() => {\n  if (debouncedEmail) {\n    checkEmailExists(debouncedEmail);\n  }\n}, [debouncedEmail]);\n",[3782,49069,49070,49086,49090,49112,49134,49138,49148,49158,49169,49173],{"__ignoreMap":3865},[3946,49071,49072,49074,49076,49078,49080,49082,49084],{"class":3948,"line":3949},[3946,49073,4252],{"class":4251},[3946,49075,6817],{"class":3952},[3946,49077,39804],{"class":4262},[3946,49079,6823],{"class":3952},[3946,49081,6826],{"class":4251},[3946,49083,39811],{"class":3966},[3946,49085,4272],{"class":3952},[3946,49087,49088],{"class":3948,"line":3956},[3946,49089,4278],{"emptyLinePlaceholder":4277},[3946,49091,49092,49094,49096,49098,49100,49102,49104,49106,49108,49110],{"class":3948,"line":3973},[3946,49093,4283],{"class":4255},[3946,49095,10529],{"class":3952},[3946,49097,10853],{"class":4286},[3946,49099,4447],{"class":3952},[3946,49101,22981],{"class":4286},[3946,49103,10540],{"class":3952},[3946,49105,10543],{"class":4224},[3946,49107,4331],{"class":3952},[3946,49109,22990],{"class":3966},[3946,49111,4337],{"class":3952},[3946,49113,49114,49116,49118,49120,49122,49124,49126,49128,49130,49132],{"class":3948,"line":3986},[3946,49115,4283],{"class":4255},[3946,49117,10529],{"class":3952},[3946,49119,39848],{"class":4286},[3946,49121,10540],{"class":3952},[3946,49123,39804],{"class":4224},[3946,49125,4331],{"class":3952},[3946,49127,10853],{"class":4262},[3946,49129,4447],{"class":3952},[3946,49131,39861],{"class":4020},[3946,49133,4337],{"class":3952},[3946,49135,49136],{"class":3948,"line":3999},[3946,49137,4278],{"emptyLinePlaceholder":4277},[3946,49139,49140,49142,49144,49146],{"class":3948,"line":4012},[3946,49141,15953],{"class":4224},[3946,49143,10707],{"class":3952},[3946,49145,6453],{"class":4255},[3946,49147,4427],{"class":3952},[3946,49149,49150,49152,49154,49156],{"class":3948,"line":4026},[3946,49151,5776],{"class":4251},[3946,49153,4479],{"class":3952},[3946,49155,39848],{"class":4262},[3946,49157,4318],{"class":3952},[3946,49159,49160,49163,49165,49167],{"class":3948,"line":4037},[3946,49161,49162],{"class":4224},"    checkEmailExists",[3946,49164,4331],{"class":3952},[3946,49166,39848],{"class":4262},[3946,49168,4337],{"class":3952},[3946,49170,49171],{"class":3948,"line":4487},[3946,49172,4521],{"class":3952},[3946,49174,49175,49177,49179],{"class":3948,"line":4507},[3946,49176,39907],{"class":3952},[3946,49178,39848],{"class":4262},[3946,49180,10737],{"class":3952},[3750,49182,49184],{"id":49183},"_126-security-audit","12.6. Security Audit",[3847,49186,49188],{"id":49187},"checklist","Checklist",[3743,49190,49191],{},[3771,49192,49193],{},"Tokens:",[3878,49195,49197,49203,49209,49215],{"className":49196},[46963],[3768,49198,49200,49202],{"className":49199},[46967],[46969,49201],{"disabled":4277,"type":46971}," Токени зберігаються лише в SecureStore",[3768,49204,49206,49208],{"className":49205},[46967],[46969,49207],{"disabled":4277,"type":46971}," Токени ніколи не логуються",[3768,49210,49212,49214],{"className":49211},[46967],[46969,49213],{"disabled":4277,"type":46971}," Токени не передаються через URL",[3768,49216,49218,49220],{"className":49217},[46967],[46969,49219],{"disabled":4277,"type":46971}," Access token має короткий lifetime (1h)",[3743,49222,49223],{},[3771,49224,49225],{},"Network:",[3878,49227,49229,49235,49241],{"className":49228},[46963],[3768,49230,49232,49234],{"className":49231},[46967],[46969,49233],{"disabled":4277,"type":46971}," Всі запити через HTTPS (production)",[3768,49236,49238,49240],{"className":49237},[46967],[46969,49239],{"disabled":4277,"type":46971}," Certificate pinning (optional, для banking apps)",[3768,49242,49244,49246],{"className":49243},[46967],[46969,49245],{"disabled":4277,"type":46971}," Request\u002Fresponse не логують sensitive data",[3743,49248,49249],{},[3771,49250,49251],{},"Code:",[3878,49253,49255,49261,49267,49273],{"className":49254},[46963],[3768,49256,49258,49260],{"className":49257},[46967],[46969,49259],{"disabled":4277,"type":46971}," Паролі не зберігаються локально",[3768,49262,49264,49266],{"className":49263},[46967],[46969,49265],{"disabled":4277,"type":46971}," API keys в environment variables",[3768,49268,49270,49272],{"className":49269},[46967],[46969,49271],{"disabled":4277,"type":46971}," No hardcoded secrets в коді",[3768,49274,49276,49278],{"className":49275},[46967],[46969,49277],{"disabled":4277,"type":46971}," Dependencies регулярно оновлюються",[3743,49280,49281],{},[3771,49282,49283],{},"User Data:",[3878,49285,49287,49293,49299],{"className":49286},[46963],[3768,49288,49290,49292],{"className":49289},[46967],[46969,49291],{"disabled":4277,"type":46971}," Personal data encrypted at rest",[3768,49294,49296,49298],{"className":49295},[46967],[46969,49297],{"disabled":4277,"type":46971}," Logout очищає всі дані",[3768,49300,49302,49304],{"className":49301},[46967],[46969,49303],{"disabled":4277,"type":46971}," Biometric auth opt-in (не required)",[3847,49306,49308],{"id":49307},"security-tools","Security Tools",[3857,49310,49312],{"className":4215,"code":49311,"language":4217,"meta":3865,"style":3865},"# npm audit для vulnerabilities\nnpm audit\n\n# Snyk для security scanning\nnpm install -g snyk\nsnyk test\n",[3782,49313,49314,49319,49326,49330,49335,49346],{"__ignoreMap":3865},[3946,49315,49316],{"class":3948,"line":3949},[3946,49317,49318],{"class":4342},"# npm audit для vulnerabilities\n",[3946,49320,49321,49323],{"class":3948,"line":3956},[3946,49322,18852],{"class":4224},[3946,49324,49325],{"class":3966}," audit\n",[3946,49327,49328],{"class":3948,"line":3973},[3946,49329,4278],{"emptyLinePlaceholder":4277},[3946,49331,49332],{"class":3948,"line":3986},[3946,49333,49334],{"class":4342},"# Snyk для security scanning\n",[3946,49336,49337,49339,49341,49343],{"class":3948,"line":3999},[3946,49338,18852],{"class":4224},[3946,49340,4231],{"class":3966},[3946,49342,18857],{"class":4255},[3946,49344,49345],{"class":3966}," snyk\n",[3946,49347,49348,49351],{"class":3948,"line":4012},[3946,49349,49350],{"class":4224},"snyk",[3946,49352,48422],{"class":3966},[3750,49354,49356],{"id":49355},"_127-deployment","12.7. Deployment",[3847,49358,49360],{"id":49359},"ios-app-store","iOS App Store",[3857,49362,49364],{"className":4215,"code":49363,"language":4217,"meta":3865,"style":3865},"# 1. Build for production\neas build --platform ios --profile production\n\n# 2. Submit to App Store\neas submit --platform ios\n",[3782,49365,49366,49371,49391,49395,49400],{"__ignoreMap":3865},[3946,49367,49368],{"class":3948,"line":3949},[3946,49369,49370],{"class":4342},"# 1. Build for production\n",[3946,49372,49373,49376,49379,49382,49385,49388],{"class":3948,"line":3956},[3946,49374,49375],{"class":4224},"eas",[3946,49377,49378],{"class":3966}," build",[3946,49380,49381],{"class":4255}," --platform",[3946,49383,49384],{"class":3966}," ios",[3946,49386,49387],{"class":4255}," --profile",[3946,49389,49390],{"class":3966}," production\n",[3946,49392,49393],{"class":3948,"line":3973},[3946,49394,4278],{"emptyLinePlaceholder":4277},[3946,49396,49397],{"class":3948,"line":3986},[3946,49398,49399],{"class":4342},"# 2. Submit to App Store\n",[3946,49401,49402,49404,49407,49409],{"class":3948,"line":3999},[3946,49403,49375],{"class":4224},[3946,49405,49406],{"class":3966}," submit",[3946,49408,49381],{"class":4255},[3946,49410,45038],{"class":3966},[3743,49412,49413],{},[3771,49414,49415],{},"app.json requirements:",[3857,49417,49419],{"className":3940,"code":49418,"language":3942,"meta":3865,"style":3865},"{\n  \"expo\": {\n    \"ios\": {\n      \"bundleIdentifier\": \"com.company.nomad\",\n      \"buildNumber\": \"1\",\n      \"infoPlist\": {\n        \"NSFaceIDUsageDescription\": \"Use Face ID for secure login\"\n      }\n    }\n  }\n}\n",[3782,49420,49421,49425,49431,49437,49449,49460,49466,49475,49479,49483,49487],{"__ignoreMap":3865},[3946,49422,49423],{"class":3948,"line":3949},[3946,49424,3953],{"class":3952},[3946,49426,49427,49429],{"class":3948,"line":3956},[3946,49428,41059],{"class":3959},[3946,49430,41062],{"class":3952},[3946,49432,49433,49435],{"class":3948,"line":3973},[3946,49434,41084],{"class":3959},[3946,49436,41062],{"class":3952},[3946,49438,49439,49442,49444,49447],{"class":3948,"line":3986},[3946,49440,49441],{"class":3959},"      \"bundleIdentifier\"",[3946,49443,3963],{"class":3952},[3946,49445,49446],{"class":3966},"\"com.company.nomad\"",[3946,49448,3970],{"class":3952},[3946,49450,49451,49454,49456,49458],{"class":3948,"line":3999},[3946,49452,49453],{"class":3959},"      \"buildNumber\"",[3946,49455,3963],{"class":3952},[3946,49457,18912],{"class":3966},[3946,49459,3970],{"class":3952},[3946,49461,49462,49464],{"class":3948,"line":4012},[3946,49463,41102],{"class":3959},[3946,49465,41062],{"class":3952},[3946,49467,49468,49470,49472],{"class":3948,"line":4026},[3946,49469,41109],{"class":3959},[3946,49471,3963],{"class":3952},[3946,49473,49474],{"class":3966},"\"Use Face ID for secure login\"\n",[3946,49476,49477],{"class":3948,"line":4037},[3946,49478,7282],{"class":3952},[3946,49480,49481],{"class":3948,"line":4487},[3946,49482,5550],{"class":3952},[3946,49484,49485],{"class":3948,"line":4507},[3946,49486,4521],{"class":3952},[3946,49488,49489],{"class":3948,"line":4518},[3946,49490,4040],{"class":3952},[3847,49492,49494],{"id":49493},"android-play-store","Android Play Store",[3857,49496,49498],{"className":4215,"code":49497,"language":4217,"meta":3865,"style":3865},"# 1. Build AAB\neas build --platform android --profile production\n\n# 2. Submit to Play Store\neas submit --platform android\n",[3782,49499,49500,49505,49520,49524,49529],{"__ignoreMap":3865},[3946,49501,49502],{"class":3948,"line":3949},[3946,49503,49504],{"class":4342},"# 1. Build AAB\n",[3946,49506,49507,49509,49511,49513,49516,49518],{"class":3948,"line":3956},[3946,49508,49375],{"class":4224},[3946,49510,49378],{"class":3966},[3946,49512,49381],{"class":4255},[3946,49514,49515],{"class":3966}," android",[3946,49517,49387],{"class":4255},[3946,49519,49390],{"class":3966},[3946,49521,49522],{"class":3948,"line":3973},[3946,49523,4278],{"emptyLinePlaceholder":4277},[3946,49525,49526],{"class":3948,"line":3986},[3946,49527,49528],{"class":4342},"# 2. Submit to Play Store\n",[3946,49530,49531,49533,49535,49537],{"class":3948,"line":3999},[3946,49532,49375],{"class":4224},[3946,49534,49406],{"class":3966},[3946,49536,49381],{"class":4255},[3946,49538,45056],{"class":3966},[3743,49540,49541],{},[3771,49542,49415],{},[3857,49544,49546],{"className":3940,"code":49545,"language":3942,"meta":3865,"style":3865},"{\n  \"expo\": {\n    \"android\": {\n      \"package\": \"com.company.nomad\",\n      \"versionCode\": 1,\n      \"permissions\": [\n        \"USE_BIOMETRIC\",\n        \"USE_FINGERPRINT\"\n      ]\n    }\n  }\n}\n",[3782,49547,49548,49552,49558,49564,49575,49586,49592,49598,49602,49606,49610,49614],{"__ignoreMap":3865},[3946,49549,49550],{"class":3948,"line":3949},[3946,49551,3953],{"class":3952},[3946,49553,49554,49556],{"class":3948,"line":3956},[3946,49555,41059],{"class":3959},[3946,49557,41062],{"class":3952},[3946,49559,49560,49562],{"class":3948,"line":3973},[3946,49561,41127],{"class":3959},[3946,49563,41062],{"class":3952},[3946,49565,49566,49569,49571,49573],{"class":3948,"line":3986},[3946,49567,49568],{"class":3959},"      \"package\"",[3946,49570,3963],{"class":3952},[3946,49572,49446],{"class":3966},[3946,49574,3970],{"class":3952},[3946,49576,49577,49580,49582,49584],{"class":3948,"line":3999},[3946,49578,49579],{"class":3959},"      \"versionCode\"",[3946,49581,3963],{"class":3952},[3946,49583,19610],{"class":4020},[3946,49585,3970],{"class":3952},[3946,49587,49588,49590],{"class":3948,"line":4012},[3946,49589,41139],{"class":3959},[3946,49591,18897],{"class":3952},[3946,49593,49594,49596],{"class":3948,"line":4026},[3946,49595,41146],{"class":3966},[3946,49597,3970],{"class":3952},[3946,49599,49600],{"class":3948,"line":4037},[3946,49601,41153],{"class":3966},[3946,49603,49604],{"class":3948,"line":4487},[3946,49605,29156],{"class":3952},[3946,49607,49608],{"class":3948,"line":4507},[3946,49609,5550],{"class":3952},[3946,49611,49612],{"class":3948,"line":4518},[3946,49613,4521],{"class":3952},[3946,49615,49616],{"class":3948,"line":4524},[3946,49617,4040],{"class":3952},[3750,49619,49621],{"id":49620},"_128-monitoring-у-production","12.8. Monitoring у Production",[3847,49623,49625],{"id":49624},"error-tracking-sentry","Error Tracking (Sentry)",[3857,49627,49629],{"className":4215,"code":49628,"language":4217,"meta":3865,"style":3865},"npm install @sentry\u002Freact-native\n",[3782,49630,49631],{"__ignoreMap":3865},[3946,49632,49633,49635,49637],{"class":3948,"line":3949},[3946,49634,18852],{"class":4224},[3946,49636,4231],{"class":3966},[3946,49638,49639],{"class":3966}," @sentry\u002Freact-native\n",[3857,49641,49643],{"className":4242,"code":49642,"language":4244,"meta":3865,"style":3865},"\u002F\u002F app\u002F_layout.tsx\nimport * as Sentry from '@sentry\u002Freact-native';\n\nSentry.init({\n  dsn: 'YOUR_SENTRY_DSN',\n  environment: __DEV__ ? 'development' : 'production',\n  tracesSampleRate: 1.0,\n});\n\n\u002F\u002F Wrap auth operations\ntry {\n  await login(credentials);\n} catch (error) {\n  Sentry.captureException(error, {\n    tags: { feature: 'auth', action: 'login' },\n    user: { email: credentials.email },\n  });\n  throw error;\n}\n",[3782,49644,49645,49649,49666,49670,49680,49688,49706,49715,49719,49723,49728,49734,49746,49758,49772,49790,49806,49810,49818],{"__ignoreMap":3865},[3946,49646,49647],{"class":3948,"line":3949},[3946,49648,43768],{"class":4342},[3946,49650,49651,49653,49655,49657,49659,49661,49664],{"class":3948,"line":3956},[3946,49652,4252],{"class":4251},[3946,49654,4256],{"class":4255},[3946,49656,4259],{"class":4251},[3946,49658,40119],{"class":4262},[3946,49660,4266],{"class":4251},[3946,49662,49663],{"class":3966}," '@sentry\u002Freact-native'",[3946,49665,4272],{"class":3952},[3946,49667,49668],{"class":3948,"line":3973},[3946,49669,4278],{"emptyLinePlaceholder":4277},[3946,49671,49672,49674,49676,49678],{"class":3948,"line":3986},[3946,49673,40135],{"class":4262},[3946,49675,4298],{"class":3952},[3946,49677,40140],{"class":4224},[3946,49679,8512],{"class":3952},[3946,49681,49682,49684,49686],{"class":3948,"line":3999},[3946,49683,40147],{"class":4262},[3946,49685,40150],{"class":3966},[3946,49687,3970],{"class":3952},[3946,49689,49690,49693,49695,49697,49700,49702,49704],{"class":3948,"line":4012},[3946,49691,49692],{"class":4262},"  environment:",[3946,49694,40169],{"class":4262},[3946,49696,11523],{"class":3952},[3946,49698,49699],{"class":3966},"'development'",[3946,49701,11532],{"class":3952},[3946,49703,40026],{"class":3966},[3946,49705,3970],{"class":3952},[3946,49707,49708,49711,49713],{"class":3948,"line":4026},[3946,49709,49710],{"class":4262},"  tracesSampleRate:",[3946,49712,35952],{"class":4020},[3946,49714,3970],{"class":3952},[3946,49716,49717],{"class":3948,"line":4037},[3946,49718,13276],{"class":3952},[3946,49720,49721],{"class":3948,"line":4487},[3946,49722,4278],{"emptyLinePlaceholder":4277},[3946,49724,49725],{"class":3948,"line":4507},[3946,49726,49727],{"class":4342},"\u002F\u002F Wrap auth operations\n",[3946,49729,49730,49732],{"class":3948,"line":4518},[3946,49731,40189],{"class":4251},[3946,49733,4427],{"class":3952},[3946,49735,49736,49738,49740,49742,49744],{"class":3948,"line":4524},[3946,49737,4935],{"class":4251},[3946,49739,8914],{"class":4224},[3946,49741,4331],{"class":3952},[3946,49743,6443],{"class":4262},[3946,49745,4337],{"class":3952},[3946,49747,49748,49750,49752,49754,49756],{"class":3948,"line":4529},[3946,49749,5928],{"class":3952},[3946,49751,4476],{"class":4251},[3946,49753,4479],{"class":3952},[3946,49755,4482],{"class":4262},[3946,49757,4318],{"class":3952},[3946,49759,49760,49762,49764,49766,49768,49770],{"class":3948,"line":4534},[3946,49761,40220],{"class":4262},[3946,49763,4298],{"class":3952},[3946,49765,40225],{"class":4224},[3946,49767,4331],{"class":3952},[3946,49769,4482],{"class":4262},[3946,49771,4952],{"class":3952},[3946,49773,49774,49776,49778,49780,49782,49784,49786,49788],{"class":3948,"line":4540},[3946,49775,40236],{"class":4262},[3946,49777,6817],{"class":3952},[3946,49779,46895],{"class":4262},[3946,49781,45376],{"class":3966},[3946,49783,4447],{"class":3952},[3946,49785,46902],{"class":4262},[3946,49787,40256],{"class":3966},[3946,49789,19998],{"class":3952},[3946,49791,49792,49794,49796,49798,49800,49802,49804],{"class":3948,"line":4567},[3946,49793,10556],{"class":4262},[3946,49795,6817],{"class":3952},[3946,49797,19989],{"class":4262},[3946,49799,40275],{"class":4262},[3946,49801,4298],{"class":3952},[3946,49803,10853],{"class":4262},[3946,49805,19998],{"class":3952},[3946,49807,49808],{"class":3948,"line":4574},[3946,49809,4977],{"class":3952},[3946,49811,49812,49814,49816],{"class":3948,"line":4600},[3946,49813,40294],{"class":4251},[3946,49815,4513],{"class":4262},[3946,49817,4272],{"class":3952},[3946,49819,49820],{"class":3948,"line":4610},[3946,49821,4040],{"class":3952},[3847,49823,49825],{"id":49824},"analytics-firebase","Analytics (Firebase)",[3857,49827,49829],{"className":4215,"code":49828,"language":4217,"meta":3865,"style":3865},"npm install @react-native-firebase\u002Fapp @react-native-firebase\u002Fanalytics\n",[3782,49830,49831],{"__ignoreMap":3865},[3946,49832,49833,49835,49837,49840],{"class":3948,"line":3949},[3946,49834,18852],{"class":4224},[3946,49836,4231],{"class":3966},[3946,49838,49839],{"class":3966}," @react-native-firebase\u002Fapp",[3946,49841,49842],{"class":3966}," @react-native-firebase\u002Fanalytics\n",[3857,49844,49846],{"className":4242,"code":49845,"language":4244,"meta":3865,"style":3865},"\u002F\u002F Track auth events\nimport analytics from '@react-native-firebase\u002Fanalytics';\n\nawait analytics().logLogin({ method: 'email' });\nawait analytics().logSignUp({ method: 'email' });\nawait analytics().setUserId(user.id);\nawait analytics().setUserProperty('role', user.role);\n",[3782,49847,49848,49852,49864,49868,49886,49904,49925],{"__ignoreMap":3865},[3946,49849,49850],{"class":3948,"line":3949},[3946,49851,46827],{"class":4342},[3946,49853,49854,49856,49858,49860,49862],{"class":3948,"line":3956},[3946,49855,4252],{"class":4251},[3946,49857,40323],{"class":4262},[3946,49859,4266],{"class":4251},[3946,49861,40328],{"class":3966},[3946,49863,4272],{"class":3952},[3946,49865,49866],{"class":3948,"line":3973},[3946,49867,4278],{"emptyLinePlaceholder":4277},[3946,49869,49870,49872,49874,49876,49878,49880,49882,49884],{"class":3948,"line":3986},[3946,49871,4293],{"class":4251},[3946,49873,40323],{"class":4224},[3946,49875,19482],{"class":3952},[3946,49877,40350],{"class":4224},[3946,49879,10506],{"class":3952},[3946,49881,46841],{"class":4262},[3946,49883,40360],{"class":3966},[3946,49885,10726],{"class":3952},[3946,49887,49888,49890,49892,49894,49896,49898,49900,49902],{"class":3948,"line":3999},[3946,49889,4293],{"class":4251},[3946,49891,40323],{"class":4224},[3946,49893,19482],{"class":3952},[3946,49895,46854],{"class":4224},[3946,49897,10506],{"class":3952},[3946,49899,46841],{"class":4262},[3946,49901,40360],{"class":3966},[3946,49903,10726],{"class":3952},[3946,49905,49906,49908,49910,49912,49915,49917,49919,49921,49923],{"class":3948,"line":4012},[3946,49907,4293],{"class":4251},[3946,49909,40323],{"class":4224},[3946,49911,19482],{"class":3952},[3946,49913,49914],{"class":4224},"setUserId",[3946,49916,4331],{"class":3952},[3946,49918,10775],{"class":4262},[3946,49920,4298],{"class":3952},[3946,49922,19984],{"class":4262},[3946,49924,4337],{"class":3952},[3946,49926,49927,49929,49931,49933,49936,49938,49941,49943,49945,49947,49949],{"class":3948,"line":4026},[3946,49928,4293],{"class":4251},[3946,49930,40323],{"class":4224},[3946,49932,19482],{"class":3952},[3946,49934,49935],{"class":4224},"setUserProperty",[3946,49937,4331],{"class":3952},[3946,49939,49940],{"class":3966},"'role'",[3946,49942,4447],{"class":3952},[3946,49944,10775],{"class":4262},[3946,49946,4298],{"class":3952},[3946,49948,15300],{"class":4262},[3946,49950,4337],{"class":3952},[3847,49952,49954],{"id":49953},"performance-monitoring","Performance Monitoring",[3857,49956,49958],{"className":4242,"code":49957,"language":4244,"meta":3865,"style":3865},"import * as Performance from '@react-native-firebase\u002Fperf';\n\nconst trace = await Performance().startTrace('auth_login');\ntrace.putAttribute('email_domain', emailDomain);\n\ntry {\n  await login(credentials);\n  trace.putMetric('success', 1);\n} catch (error) {\n  trace.putMetric('success', 0);\n} finally {\n  await trace.stop();\n}\n",[3782,49959,49960,49978,49982,50007,50029,50033,50039,50051,50072,50084,50102,50110,50123],{"__ignoreMap":3865},[3946,49961,49962,49964,49966,49968,49971,49973,49976],{"class":3948,"line":3949},[3946,49963,4252],{"class":4251},[3946,49965,4256],{"class":4255},[3946,49967,4259],{"class":4251},[3946,49969,49970],{"class":4262}," Performance",[3946,49972,4266],{"class":4251},[3946,49974,49975],{"class":3966}," '@react-native-firebase\u002Fperf'",[3946,49977,4272],{"class":3952},[3946,49979,49980],{"class":3948,"line":3956},[3946,49981,4278],{"emptyLinePlaceholder":4277},[3946,49983,49984,49986,49989,49991,49993,49995,49997,50000,50002,50005],{"class":3948,"line":3973},[3946,49985,4283],{"class":4255},[3946,49987,49988],{"class":4286}," trace",[3946,49990,4290],{"class":3952},[3946,49992,4293],{"class":4251},[3946,49994,49970],{"class":4224},[3946,49996,19482],{"class":3952},[3946,49998,49999],{"class":4224},"startTrace",[3946,50001,4331],{"class":3952},[3946,50003,50004],{"class":3966},"'auth_login'",[3946,50006,4337],{"class":3952},[3946,50008,50009,50012,50014,50017,50019,50022,50024,50027],{"class":3948,"line":3986},[3946,50010,50011],{"class":4262},"trace",[3946,50013,4298],{"class":3952},[3946,50015,50016],{"class":4224},"putAttribute",[3946,50018,4331],{"class":3952},[3946,50020,50021],{"class":3966},"'email_domain'",[3946,50023,4447],{"class":3952},[3946,50025,50026],{"class":4262},"emailDomain",[3946,50028,4337],{"class":3952},[3946,50030,50031],{"class":3948,"line":3999},[3946,50032,4278],{"emptyLinePlaceholder":4277},[3946,50034,50035,50037],{"class":3948,"line":4012},[3946,50036,40189],{"class":4251},[3946,50038,4427],{"class":3952},[3946,50040,50041,50043,50045,50047,50049],{"class":3948,"line":4026},[3946,50042,4935],{"class":4251},[3946,50044,8914],{"class":4224},[3946,50046,4331],{"class":3952},[3946,50048,6443],{"class":4262},[3946,50050,4337],{"class":3952},[3946,50052,50053,50056,50058,50061,50063,50066,50068,50070],{"class":3948,"line":4037},[3946,50054,50055],{"class":4262},"  trace",[3946,50057,4298],{"class":3952},[3946,50059,50060],{"class":4224},"putMetric",[3946,50062,4331],{"class":3952},[3946,50064,50065],{"class":3966},"'success'",[3946,50067,4447],{"class":3952},[3946,50069,19610],{"class":4020},[3946,50071,4337],{"class":3952},[3946,50073,50074,50076,50078,50080,50082],{"class":3948,"line":4487},[3946,50075,5928],{"class":3952},[3946,50077,4476],{"class":4251},[3946,50079,4479],{"class":3952},[3946,50081,4482],{"class":4262},[3946,50083,4318],{"class":3952},[3946,50085,50086,50088,50090,50092,50094,50096,50098,50100],{"class":3948,"line":4507},[3946,50087,50055],{"class":4262},[3946,50089,4298],{"class":3952},[3946,50091,50060],{"class":4224},[3946,50093,4331],{"class":3952},[3946,50095,50065],{"class":3966},[3946,50097,4447],{"class":3952},[3946,50099,8175],{"class":4020},[3946,50101,4337],{"class":3952},[3946,50103,50104,50106,50108],{"class":3948,"line":4518},[3946,50105,5928],{"class":3952},[3946,50107,12029],{"class":4251},[3946,50109,4427],{"class":3952},[3946,50111,50112,50114,50116,50118,50121],{"class":3948,"line":4524},[3946,50113,4935],{"class":4251},[3946,50115,49988],{"class":4262},[3946,50117,4298],{"class":3952},[3946,50119,50120],{"class":4224},"stop",[3946,50122,4304],{"class":3952},[3946,50124,50125],{"class":3948,"line":4529},[3946,50126,4040],{"class":3952},[3811,50128],{},[3738,50130,50132],{"id":50131},"фінальний-checklist","Фінальний Checklist",[3750,50134,50136],{"id":50135},"development","Development ✅",[3878,50138,50140,50146,50152,50158,50164,50170,50176,50182,50188],{"className":50139},[46963],[3768,50141,50143,50145],{"className":50142},[46967],[46969,50144],{"checked":4277,"disabled":4277,"type":46971}," Auth feature створено",[3768,50147,50149,50151],{"className":50148},[46967],[46969,50150],{"checked":4277,"disabled":4277,"type":46971}," Types визначені",[3768,50153,50155,50157],{"className":50154},[46967],[46969,50156],{"checked":4277,"disabled":4277,"type":46971}," Services імплементовані",[3768,50159,50161,50163],{"className":50160},[46967],[46969,50162],{"checked":4277,"disabled":4277,"type":46971}," Components створені",[3768,50165,50167,50169],{"className":50166},[46967],[46969,50168],{"checked":4277,"disabled":4277,"type":46971}," Screens реалізовані",[3768,50171,50173,50175],{"className":50172},[46967],[46969,50174],{"checked":4277,"disabled":4277,"type":46971}," Routes налаштовані",[3768,50177,50179,50181],{"className":50178},[46967],[46969,50180],{"checked":4277,"disabled":4277,"type":46971}," Navigation guards працюють",[3768,50183,50185,50187],{"className":50184},[46967],[46969,50186],{"checked":4277,"disabled":4277,"type":46971}," Mock backend ready",[3768,50189,50191,50193],{"className":50190},[46967],[46969,50192],{"checked":4277,"disabled":4277,"type":46971}," Git commit зроблено",[3750,50195,50197],{"id":50196},"documentation","Documentation ✅",[3878,50199,50201,50207,50213,50219,50225,50231],{"className":50200},[46963],[3768,50202,50204,50206],{"className":50203},[46967],[46969,50205],{"checked":4277,"disabled":4277,"type":46971}," README оновлено",[3768,50208,50210,50212],{"className":50209},[46967],[46969,50211],{"checked":4277,"disabled":4277,"type":46971}," API documented",[3768,50214,50216,50218],{"className":50215},[46967],[46969,50217],{"checked":4277,"disabled":4277,"type":46971}," Types documented",[3768,50220,50222,50224],{"className":50221},[46967],[46969,50223],{"checked":4277,"disabled":4277,"type":46971}," Usage examples provided",[3768,50226,50228,50230],{"className":50227},[46967],[46969,50229],{"checked":4277,"disabled":4277,"type":46971}," Troubleshooting guide",[3768,50232,50234,50236],{"className":50233},[46967],[46969,50235],{"checked":4277,"disabled":4277,"type":46971}," Environment setup",[3750,50238,50239],{"id":47060},"Testing 🔄",[3878,50241,50243,50249,50255,50261,50267],{"className":50242},[46963],[3768,50244,50246,50248],{"className":50245},[46967],[46969,50247],{"disabled":4277,"type":46971}," Unit tests written",[3768,50250,50252,50254],{"className":50251},[46967],[46969,50253],{"disabled":4277,"type":46971}," Integration tests",[3768,50256,50258,50260],{"className":50257},[46967],[46969,50259],{"disabled":4277,"type":46971}," E2E scenarios",[3768,50262,50264,50266],{"className":50263},[46967],[46969,50265],{"disabled":4277,"type":46971}," Manual testing completed",[3768,50268,50270,50272],{"className":50269},[46967],[46969,50271],{"disabled":4277,"type":46971}," Edge cases covered",[3750,50274,50276],{"id":50275},"production","Production 🔜",[3878,50278,50280,50286,50292,50298,50304,50310,50316,50322],{"className":50279},[46963],[3768,50281,50283,50285],{"className":50282},[46967],[46969,50284],{"disabled":4277,"type":46971}," Environment variables configured",[3768,50287,50289,50291],{"className":50288},[46967],[46969,50290],{"disabled":4277,"type":46971}," HTTPS enforced",[3768,50293,50295,50297],{"className":50294},[46967],[46969,50296],{"disabled":4277,"type":46971}," Error tracking setup",[3768,50299,50301,50303],{"className":50300},[46967],[46969,50302],{"disabled":4277,"type":46971}," Analytics integrated",[3768,50305,50307,50309],{"className":50306},[46967],[46969,50308],{"disabled":4277,"type":46971}," Performance optimized",[3768,50311,50313,50315],{"className":50312},[46967],[46969,50314],{"disabled":4277,"type":46971}," Security audit passed",[3768,50317,50319,50321],{"className":50318},[46967],[46969,50320],{"disabled":4277,"type":46971}," App Store ready",[3768,50323,50325,50327],{"className":50324},[46967],[46969,50326],{"disabled":4277,"type":46971}," Play Store ready",[3811,50329],{},[3738,50331,50333],{"id":50332},"підсумок","Підсумок",[3743,50335,50336],{},[3771,50337,50338],{},"Що ми зробили:",[3743,50340,50341],{},"✅ Створили повноцінну систему автентифікації з:",[3878,50343,50344,50347,50349,50352,50355],{},[3768,50345,50346],{},"Secure token storage (iOS Keychain \u002F Android Keystore)",[3768,50348,4138],{},[3768,50350,50351],{},"Auto session restore",[3768,50353,50354],{},"Protected routes",[3768,50356,50357],{},"Professional architecture",[3743,50359,50360],{},"✅ Реалізували в реальному проєкті Nomad:",[3878,50362,50363,50366,50369,50372],{},[3768,50364,50365],{},"13 нових файлів",[3768,50367,50368],{},"~1,500 рядків коду",[3768,50370,50371],{},"100% TypeScript",[3768,50373,50374],{},"Production-ready",[3743,50376,50377],{},"✅ Задокументували кожен крок:",[3878,50379,50380,50382,50385,50388,50391],{},[3768,50381,40453],{},[3768,50383,50384],{},"Практична реалізація",[3768,50386,50387],{},"Troubleshooting",[3768,50389,50390],{},"Best practices",[3768,50392,50393],{},"Deployment guide",[3743,50395,50396],{},[3771,50397,50398],{},"Наступні кроки:",[3765,50400,50401,50404,50407,50410,50413,50416],{},[3768,50402,50403],{},"Протестуйте додаток на реальному пристрої",[3768,50405,50406],{},"Додайте біометричну автентифікацію",[3768,50408,50409],{},"Реалізуйте password recovery",[3768,50411,50412],{},"Інтегруйте social auth (Google, Apple)",[3768,50414,50415],{},"Додайте unit tests",[3768,50417,50418],{},"Підготуйте до production",[3743,50420,50421],{},[3771,50422,50423],{},"Результат:",[3743,50425,50426],{},"Ви маєте production-ready auth систему, яку можна використовувати як foundation для будь-якого React Native проєкту. Код написаний за best practices індустрії, з proper error handling, type safety та security в mind.",[3743,50428,50429],{},[3771,50430,50431],{},"Git commit:",[3857,50433,50436],{"className":50434,"code":50435,"language":3862},[3860],"feat: secure session and protected routes\nCommit: 4f18049\nFiles: 18 changed, 1766 insertions(+), 48 deletions(-)\n",[3782,50437,50435],{"__ignoreMap":3865},[3743,50439,50440],{},"Вітаємо! 🎉 Ви успішно завершили розділ про автентифікацію та безпечне зберігання в React Native!",[3811,50442],{},[3743,50444,50445,50448,50451,50454,50455,50457,50460,50461,50463,50466],{},[3771,50446,50447],{},"Матеріал підготовлено для kostyl.dev",[50449,50450],"br",{},[3771,50452,50453],{},"Проєкт:"," Nomad — Travel Planning App",[50449,50456],{},[3771,50458,50459],{},"Дата:"," 2026",[50449,50462],{},[3771,50464,50465],{},"Автор:"," React Native Learning Series",[3743,50468,50469],{},[50470,50471,50472],"em",{},"Цей матеріал є частиною комплексного курсу React Native розробки. Всі приклади коду протестовані та готові до використання у production.",[50474,50475,50476],"style",{},"html pre.shiki code .sHH4Y, html code.shiki .sHH4Y{--shiki-light:#000000;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .sLwNe, html code.shiki .sLwNe{--shiki-light:#0451A5;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .sbdoH, html code.shiki .sbdoH{--shiki-light:#A31515;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .sJj4R, html code.shiki .sJj4R{--shiki-light:#098658;--shiki-default:#B5CEA8;--shiki-dark:#B5CEA8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s8Opu, html code.shiki .s8Opu{--shiki-light:#795E26;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .s8xlr, html code.shiki .s8xlr{--shiki-light:#AF00DB;--shiki-default:#C586C0;--shiki-dark:#C586C0}html pre.shiki code .su1O8, html code.shiki .su1O8{--shiki-light:#0000FF;--shiki-default:#569CD6;--shiki-dark:#569CD6}html pre.shiki code .siwwj, html code.shiki .siwwj{--shiki-light:#001080;--shiki-default:#9CDCFE;--shiki-dark:#9CDCFE}html pre.shiki code .s-QsJ, html code.shiki .s-QsJ{--shiki-light:#0070C1;--shiki-default:#4FC1FF;--shiki-dark:#4FC1FF}html pre.shiki code .spJ8K, html code.shiki .spJ8K{--shiki-light:#008000;--shiki-default:#6A9955;--shiki-dark:#6A9955}html pre.shiki code .sN1BT, html code.shiki .sN1BT{--shiki-light:#267F99;--shiki-default:#4EC9B0;--shiki-dark:#4EC9B0}html pre.shiki code .s5IvJ, html code.shiki .s5IvJ{--shiki-light:#000000;--shiki-default:#C8C8C8;--shiki-dark:#C8C8C8}html pre.shiki code .sD7JJ, html code.shiki .sD7JJ{--shiki-light:#000000FF;--shiki-default:#D4D4D4;--shiki-dark:#D4D4D4}html pre.shiki code .shsrj, html code.shiki .shsrj{--shiki-light:#811F3F;--shiki-default:#D16969;--shiki-dark:#D16969}html pre.shiki code .siofk, html code.shiki .siofk{--shiki-light:#EE0000;--shiki-default:#DCDCAA;--shiki-dark:#DCDCAA}html pre.shiki code .sjcCO, html code.shiki .sjcCO{--shiki-light:#EE0000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}html pre.shiki code .sAV2Q, html code.shiki .sAV2Q{--shiki-light:#D16969;--shiki-default:#CE9178;--shiki-dark:#CE9178}html pre.shiki code .sYsli, html code.shiki .sYsli{--shiki-light:#000000;--shiki-default:#D7BA7D;--shiki-dark:#D7BA7D}",{"title":3865,"searchDepth":3956,"depth":3956,"links":50478},[50479,50483,50488,50494,50500,50504,50512,50517,50530,50537,50542,50548,50553,50554,50569,50579,50585],{"id":3740,"depth":3956,"text":3741,"children":50480},[50481,50482],{"id":3752,"depth":3973,"text":3753},{"id":3759,"depth":3973,"text":3760},{"id":3815,"depth":3956,"text":3816,"children":50484},[50485,50486,50487],{"id":3819,"depth":3973,"text":3820},{"id":3841,"depth":3973,"text":3842},{"id":4131,"depth":3973,"text":4132},{"id":4173,"depth":3956,"text":4174,"children":50489},[50490,50491,50492,50493],{"id":4177,"depth":3973,"text":4178},{"id":4206,"depth":3973,"text":4207},{"id":4787,"depth":3973,"text":4788},{"id":5073,"depth":3973,"text":5074},{"id":5975,"depth":3956,"text":5976,"children":50495},[50496,50497,50498,50499],{"id":5979,"depth":3973,"text":5980},{"id":5992,"depth":3973,"text":5993},{"id":6773,"depth":3973,"text":6774},{"id":8262,"depth":3973,"text":8263},{"id":10175,"depth":3956,"text":10176,"children":50501},[50502,50503],{"id":10179,"depth":3973,"text":10180},{"id":10222,"depth":3973,"text":10223},{"id":12835,"depth":3956,"text":12836,"children":50505},[50506,50507,50508,50509,50510,50511],{"id":12839,"depth":3973,"text":12840},{"id":12872,"depth":3973,"text":12873},{"id":13312,"depth":3973,"text":13313},{"id":13705,"depth":3973,"text":13706},{"id":14712,"depth":3973,"text":14713},{"id":15926,"depth":3973,"text":15927},{"id":16458,"depth":3956,"text":16459,"children":50513},[50514,50515,50516],{"id":16462,"depth":3973,"text":16463},{"id":16537,"depth":3973,"text":16538},{"id":17846,"depth":3973,"text":17847},{"id":18759,"depth":3956,"text":18760,"children":50518},[50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529],{"id":18763,"depth":3973,"text":18764},{"id":18824,"depth":3973,"text":18825},{"id":18834,"depth":3973,"text":18835},{"id":21234,"depth":3973,"text":21235},{"id":22671,"depth":3973,"text":22672},{"id":24698,"depth":3973,"text":24699},{"id":27131,"depth":3973,"text":27132},{"id":28123,"depth":3973,"text":28124},{"id":30734,"depth":3973,"text":30735},{"id":32652,"depth":3973,"text":32653},{"id":34425,"depth":3973,"text":34426},{"id":36770,"depth":3956,"text":36771,"children":50531},[50532,50533,50534,50535,50536],{"id":36774,"depth":3973,"text":36775},{"id":37235,"depth":3973,"text":37236},{"id":37784,"depth":3973,"text":37785},{"id":38407,"depth":3973,"text":38408},{"id":39619,"depth":3973,"text":39620},{"id":39916,"depth":3956,"text":39917,"children":50538},[50539,50540,50541],{"id":39920,"depth":3973,"text":39921},{"id":40097,"depth":3973,"text":40098},{"id":40305,"depth":3973,"text":40306},{"id":40439,"depth":3956,"text":40440,"children":50543},[50544,50545,50546,50547],{"id":40443,"depth":3973,"text":40444},{"id":40495,"depth":3973,"text":40496},{"id":40537,"depth":3973,"text":40538},{"id":40570,"depth":3973,"text":40571},{"id":40714,"depth":3956,"text":40715,"children":50549},[50550,50551,50552],{"id":40718,"depth":3973,"text":40719},{"id":40755,"depth":3973,"text":40756},{"id":40795,"depth":3973,"text":40796},{"id":40824,"depth":3956,"text":40825},{"id":40928,"depth":3956,"text":40929,"children":50555},[50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568],{"id":40939,"depth":3973,"text":40940},{"id":41231,"depth":3973,"text":41232},{"id":41276,"depth":3973,"text":41277},{"id":42292,"depth":3973,"text":42293},{"id":43124,"depth":3973,"text":43125},{"id":43748,"depth":3973,"text":43749},{"id":44960,"depth":3973,"text":44961},{"id":45130,"depth":3973,"text":45131},{"id":45531,"depth":3973,"text":45532},{"id":45616,"depth":3973,"text":45617},{"id":46072,"depth":3973,"text":46073},{"id":46951,"depth":3973,"text":46952},{"id":47127,"depth":3973,"text":47128},{"id":47222,"depth":3956,"text":47223,"children":50570},[50571,50572,50573,50574,50575,50576,50577,50578],{"id":47226,"depth":3973,"text":47227},{"id":47347,"depth":3973,"text":47348},{"id":47976,"depth":3973,"text":47977},{"id":48248,"depth":3973,"text":48249},{"id":48756,"depth":3973,"text":48757},{"id":49183,"depth":3973,"text":49184},{"id":49355,"depth":3973,"text":49356},{"id":49620,"depth":3973,"text":49621},{"id":50131,"depth":3956,"text":50132,"children":50580},[50581,50582,50583,50584],{"id":50135,"depth":3973,"text":50136},{"id":50196,"depth":3973,"text":50197},{"id":47060,"depth":3973,"text":50239},{"id":50275,"depth":3973,"text":50276},{"id":50332,"depth":3956,"text":50333},"Практичний розбір механізмів автентифікації, управління сесіями, SecureStore та захищених маршрутів у React Native","md",null,{},{"title":3456,"description":50586},"1Z3dErYOLrygpNyuhnYsOUkZu6pLcuPsSElZbvawaa8",[50593,50595],{"title":3452,"path":3453,"stem":3454,"description":50594,"children":-1},"Практичний навчальний посібник з RTK Query у React Native — від простих прикладів до складних сценаріїв. Дізнайтеся як автоматизувати роботу з серверними даними, налаштувати кеш, інвалідацію та оптимістичні оновлення у мобільному застосунку.",{"title":3460,"path":3461,"stem":3462,"description":50596,"children":-1},"Як зберігати дані на пристрої між перезапусками застосунку, коли використовувати key-value сховища та структуровані бази даних, і що вибрати для різних сценаріїв",1788069965950]