import 'dart:async'; import 'package:flutter/material.dart'; import 'package:libac_dart/utils/uuid/UUID.dart'; import 'package:zontreck/Constants.dart'; import 'package:zontreck/Packets.dart'; import 'package:zontreck/Settings.dart'; enum InventoryFolder { ROOT( id: 8, name: "My Inventory"), // This needs to be first despite ID, due to the way we are incrementing the revision number. Texture(id: 0, name: "Textures"), Sound(id: 1, name: "Sounds"), CallingCard(id: 2, name: "Calling Cards"), Landmark(id: 3, name: "Landmarks"), Clothing(id: 5, name: "Clothing"), Notecards(id: 7, name: "Notecards"), Objects(id: 6, name: "Objects"), Scripts(id: 10, name: "Scripts"), BodyParts(id: 13, name: "Body Parts"), Trash(id: 14, name: "Trash"), Screenshots(id: 15, name: "Photo Album"), LostAndFound(id: 16, name: "Lost & Found"), Animations(id: 20, name: "Animations"), Gestures(id: 21, name: "Gestures"), Favorites(id: 23, name: "Favorites"), CurrentOutfit(id: 46, name: "Current Outfit"), Outfit(id: 47, name: "Outfit"), MyOutfits(id: 48, name: "My Outfits"), // 49 Mesh // 50 Inbox // 51 Outbox // 52 BasicRoot // MarketplaceListings(id: 53, name: "Marketplace Listings"), // MarketplaceStock(id: 54, name: "Marketplace Stock"), // 55 Marketplace version Settings(id: 56, name: "Settings"), Materials(id: 57, name: "Materials"), Suitcase(id: 100, name: "My Suitcase"); final int id; final String name; const InventoryFolder({required this.id, required this.name}); } class CreateInventoryPopup extends StatefulWidget { const CreateInventoryPopup({super.key}); @override State createState() => CreateInventoryState(); } class CreateInventoryState extends State { double getProgress() { double percent = (value * 100 / total); return percent / 100; } int value = 0; int total = 100; String status = ""; @override void didChangeDependencies() { startProcessing(); } Future enableUserAccount() async { setState(() { status = "Enabling user account"; }); await Future.delayed(const Duration(milliseconds: 500)); Settings settings = Settings(); C2SActivateUserPacket activate = C2SActivateUserPacket(ID: settings.currentUser!.ID); var reply = await settings.sendPacketToEndpoint( APIEndpoint.ActivateUser, activate) as S2CSimpleReplyPacket; if (reply.done) { setState(() { status = "Account Activated"; }); } await Future.delayed(const Duration(seconds: 1)); Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text( "Inventory successfully created. Your account is now active"))); } bool processing = false; Future startProcessing() async { total = InventoryFolder.values.length; await Future.delayed(const Duration(seconds: 5)); UUID rootFolder = UUID.generate(4); Settings settings = Settings(); Future createFolder(Timer timer) async { if (processing) return; if (getProgress() >= 1) { timer.cancel(); enableUserAccount(); return; } processing = true; InventoryFolder folderType = InventoryFolder.values[value]; UUID parent = rootFolder; UUID id = UUID.generate(4); UUID owner = settings.currentUser!.ID; int type = folderType.id; String name = InventoryFolder.values[value].name; if (folderType.id == InventoryFolder.ROOT.id) { parent = UUID.ZERO; id = rootFolder; } C2SCreateFolderPacket makeFolder = C2SCreateFolderPacket( ParentFolder: parent, ID: id, Name: name, Type: type, Owner: owner, client: Constants.CLIENTPSK); setState(() { status = ("Creating Inventory Folder: $name"); if (Constants.DEBUG) print("Creating Inventory Folder: $name"); }); var reply = await settings.sendPacketToEndpoint( APIEndpoint.MakeFolder, makeFolder) as S2CSimpleReplyPacket; if (!reply.done) { timer.cancel(); Navigator.pop(context); showDialog( context: context, builder: (V) { return AlertDialog( title: const Text("FATAL ERROR"), content: Text( "For an unknown reason, we failed to create the inventory folders. Some may have been created, but there was an error while processing: ${makeFolder.encodeSafe()}"), ); }); } else { setState(() { status = ("Created Inventory Folder : $name"); if (Constants.DEBUG) print("Created Inventory Folder: $name"); }); } value++; setState(() { processing = false; }); } Timer.periodic(const Duration(milliseconds: 500), createFolder); } @override Widget build(BuildContext context) { return AlertDialog( icon: const Icon(Icons.folder_copy), title: const Text("Please Wait... Activating Account"), content: SizedBox( height: 75, child: Column( children: [ const Text("Creating necessary Inventory Folders"), Text( status, ), const Divider(), LinearProgressIndicator( value: getProgress(), color: Constants.PORTFOLIO_CARD_COLOR, minHeight: 10, ) ], ), )); } }