193 lines
5.5 KiB
Dart
193 lines
5.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:libac_flutter/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<StatefulWidget> createState() => CreateInventoryState();
|
|
}
|
|
|
|
class CreateInventoryState extends State<CreateInventoryPopup> {
|
|
double getProgress() {
|
|
double percent = (value * 100 / total);
|
|
return percent / 100;
|
|
}
|
|
|
|
int value = 0;
|
|
int total = 100;
|
|
String status = "";
|
|
|
|
@override
|
|
void didChangeDependencies() {
|
|
startProcessing();
|
|
}
|
|
|
|
Future<void> 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<void> startProcessing() async {
|
|
total = InventoryFolder.values.length;
|
|
await Future.delayed(const Duration(seconds: 5));
|
|
|
|
UUID rootFolder = UUID.generate(4);
|
|
|
|
Settings settings = Settings();
|
|
Future<void> 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,
|
|
)
|
|
],
|
|
),
|
|
));
|
|
}
|
|
}
|