ZontreckWebsite/lib/pages/opensim/Inventory.dart
2024-05-17 17:40:04 -07:00

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,
)
],
),
));
}
}